2009-08-20 6 views
2

작동하지 내가이 작업을 수행 할 수 있습니다평가는 커먼 리스프에서 확장되지 않은 매크로 인용

src-> (defmacro 매크로 안녕하세요() ` "안녕하세요")

(평가 '(매크로 안녕하세요))

아무런 문제가 없습니다. Clojure에있어서

:

(defmacro 매크로 헬로 [] ` "안녕하세요")

(평가 '(매크로 헬로))

내게 오류 준다. 내가 잘못 했니?

Clojure의 오류 : 스레드

예외 "주"의 java.lang.Exception : 기호를 확인할 수 없습니다 :이 상황에서 매크로 안녕을 (NO_SOURCE_FILE : 12) clojure.lang.Compiler.analyze (컴파일러에서 .java : 4340) at clojure.lang.Compiler.analyze (Compiler.java:4286) at clojure.lang.Compiler $ InvokeExpr.parse (Compiler.java:2767) at clojure.lang.Compiler.analyzeSeq (컴파일러 .java : 4498) at clojure.lang.Compiler.analyze (Compiler.java:4325) at clojure.lang.Compiler.analyze (Compiler.java:4286) at clojure.lang.Compiler $ BodyExpr $ Parser.parse (Comp iler.java : 3862) at clojure.lang.Compiler $ FnMethod.parse (Compiler.java:3697) at clojure.lang.Compiler $ FnMethod.access $ 1100 (Compiler.java:3574) at clojure.lang.Compiler clojure.lang.Compiler에서 clojure.lang.Compiler.analyze (Compiler.java:4325) 에서 clojure.lang.Compiler.analyzeSeq (Compiler.java:4494) 에서 $ FnExpr.parse (Compiler.java:2963) .eval (Compiler.java:4530) at clojure.core $ eval__3990.invoke (core.clj : 1728) at com.yourcompany.defpackage $ _main__4.invoke (defpackage.clj : 12) at clojure.lang.AFn (AFn.java:161) at com.yourcompany.defpackage.main발생 원인 : java.lang.Exception :이 컨텍스트에서 symbol : macro-hello를 확인할 수 없습니다. at clojure.lang.Compiler.resolveIn (Compiler.java:4682) at clojure.lang.Compiler.resolve (Compiler.java : 4628) clojure.lang.Compiler.analyzeSymbol (Compiler.java:4605에서 ) clojure.lang.Compiler.analyze (Compiler.java:4307) 에서 17 ... 더 자바 결과 : 1

[편집 됨] : 더하기 닫는 큰 따옴표 추가

+0

macro-hello를 정의한 네임 스페이스는 무엇입니까? 보십시오 (eval '(<여기에 네임 스페이스를 삽입하십시오/매크로 안녕하세요)). 그게 효과가 있니? – alanlcode

+0

alancode 땡 그거. – Gutzofter

답변

2

코드가 작동합니다.

이것은 출혈 가장자리 Clojure를 통해입니다. "기호를 확인할 수 없습니다."는 현재 네임 스페이스에서 macro-hello이라는 매크로를 찾을 수 없음을 의미합니다. REPL이나 소스 파일에서 이것을 실행하고 있습니까? REPL에 진술을 말 그대로 입력했습니다.

이것이 문제의 원인인지 확실하지 않지만 `과 'Clojure'의 차이점에 유의하십시오. `은 네임 스페이스 확인을 수행하고 '은 수행하지 않습니다.

user> `macro-hello 
user/macro-hello 
user> 'macro-hello 
macro-hello

이것은 Common Lisp의 동작과 다릅니다. `"hello"과 같은 문자열을 역 따옴표로 묶는 것은 String이 네임 스페이스에 속하지 않으므로별로 의미가 없지만 아무 것도 해치지 않습니다.

(나는, 당신이 당신의 Clojure 코드에 오타가 있으리라 믿고있어 누락 된 따옴표.) 나는 /에서 작동 Mac 및 리눅스 박스에서 선택하고자

+0

끝 큰 따옴표에 대해 죄송합니다. 나는이 문제없이 할 수있다 : (eval '(eq 0 0) 소스 파일. 난 netbeans와 함께 enclojure를 사용하고 있습니다. 지금 당장 REPL을 사용할 수 없습니다. 어떤 버전의 clojure를 사용하고 있습니까? 아마 그 문제. eval 함수는 환경에 액세스 할 수 있어야합니다. 그리고 미리 정의 된 변수 (함수/매크로)를 사용하면됩니다. 내 자신의 생성 된 함수/매크로에서 eval을 시도 할 때만 작동합니다. – Gutzofter

+0

git의 출혈 가장자리 Clojure (http://github.com/richhickey/clojure/tree/master)를 사용하고 있습니다. 'java -cp clojure.jar clojure.main'을 통해 명령 행에서 REPL을 시작하면 작동합니까? Enclojure가 문제를 일으킬 수 있습니다. –

+0

알아두면 좋은데, jar 파일에 넣는 법을 알아야합니다. – Gutzofter

1

. Clojure 소스를 얻으려면.

% CD를/

를 선택 (%는 유닉스 프롬프트입니다)

퍼센트 자식 클론 자식 : //github.com/richhickey/clojure.git; #From 유닉스 명령 행, 당신은해야합니다 AN/옵트/Clojure의 디렉토리

퍼센트 CD/옵션/Clojure의

% /opt/netbeans-6.7.1/java2/ant/bin/ant; # ant를 실행합니다. Netbeans와 함께 제공됩니다.

% cd/opt; # mkdir/opt가 없으면 선택합니다.

% git clone git : //github.com/richhickey/clojure-contrib.git; # 참여하기

% /opt/netbeans-6.7.1/java2/ant/bin/ant -Dclojure.jar = ../clojure/clojure.jar; clojure.jar이

을의 위치 # 난 당신하고, NetBean의 프로젝트 lib 디렉토리에이 항아리를 clojure.jar와 Clojure의-contrib.jar

복사하기 위해 항아리의 이름을 변경 개미에게.

+0

안내에 감사드립니다. – Gutzofter