매크로의 인용 해제 인수가 예상대로 작동하지 않습니다.

tjb1982

다음 Clojure 매크로가 있습니다.

(defmacro with-model
  [ref & body]
  `(tx
     (let [ds# (when (vector? (first ~body)) (ffirst ~body))
           name# (when (vector? (first ~body)) (second (first ~body)))
           ~ref (model ds# name#)]
       (do ~@body))))

그리고 나는 이것을 다음과 같이 사용하려고합니다.

(deftest with-model-test
  (with-model sandwich
    (let [nodes (-> sandwich .listObjects iterator-seq)]
      (is nodes))))

아니면 이거:

(deftest with-model-test
  (with-model sandwich [*ds* "named-model"]
    (let [nodes (-> sandwich .listObjects iterator-seq)]
      (is nodes))))

아이디어의 존재는 그 sandwich지금을 참조해야합니다 Model,하지만 난 런타임 예외를 얻을 :

Unable to resolve symbol: sandwich in this context

나는 경우 (println ~ref)매크로에, 나는 모델 인스턴스를 얻을. (println '~ref)내가 얻는 다면 sandwich. 대신 어떻게해야합니까?

juan.facorro

매크로를 사용할 때의 매크로 확장 with-model(with-model sandwich (let [node (-> sandwich)]))다음과 같습니다.

(macroexpand-1 '(with-model sandwich (let [node (-> sandwich)])))

(tx
 (let [ds   (when (vector? (first ((let [node (-> sandwich)]))))
              (ffirst ((let [node (-> sandwich)]))))
       name (when (vector? (first ((let [node (-> sandwich)]))))
              (second (first ((let [node (-> sandwich)])))))
       sandwich (model ds name)]
  (let [node (-> sandwich)])))

보시다시피 매크로는 확장 후 두 번째 인수에 대해 알아내는 코드를 생성하기 때문에 정의되기 전에 sandwich사용됩니다 let. 이 문제를 해결하는 방법은 확장 전에 매크로가 문제를 파악하도록하는 것입니다. 일반적으로 나는 더 간단한 확장을 위해 이것을 시도한다. 비록 그것이 때때로 더 복잡한 매크로 코드를 암시하지만이 경우에는 어렵지 않다.

(defmacro with-model
  [ref & [x & _ :as body]]
  `(tx
     (let [ds# ~(when (vector? x) (first x))
           name# ~(when (vector? x) (second x))
           ~ref (model ds# name#)]
       ~@body)))

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Variadic 매크로 인수 수가 예상대로 작동하지 않습니다.

분류에서Dev

CSV 형식의 공백으로 인해 strtok가 예상대로 작동하지 않습니다.

분류에서Dev

focusout ()이 예상대로 작동하지 않습니다 (이 매우 기본적인 예제에서)

분류에서Dev

점-점-점 인수가 예상대로 작동하지 않습니다.

분류에서Dev

MySQL 조인이 예상대로 작동하지 않습니다.

분류에서Dev

ChildFragmentManager 제거가 예상대로 작동하지 않습니다.

분류에서Dev

사용자 지정 요인 함수가 예상대로 작동하지 않습니다.

분류에서Dev

보류중인 의도가 예상대로 작동하지 않습니다.

분류에서Dev

식의 매크로가 예상대로 작동하지 않습니다.

분류에서Dev

인라인 블록 표시가 예상대로 작동하지 않습니다.

분류에서Dev

CMake Release로 인해 코드가 제대로 작동하지 않습니다.

분류에서Dev

확인 대화 상자가 제대로 작동하지 않습니다.

분류에서Dev

데이터 유형의 일부 오류로 인해 생성자가 예상대로 작동하지 않고 이유를 알 수 없습니다.

분류에서Dev

매우 기본적인 스크롤바가 예상대로 작동하지 않는 문제

분류에서Dev

단어 필드-따옴표 / 음성 표시로 인해 IF 문이 예상대로 작동하지 않습니다.

분류에서Dev

사용자 지정 후크가 예상대로 작동하지 않습니다.

분류에서Dev

C 매크로 ##가 함수 정의에 대해 작동하지 않습니다.

분류에서Dev

쉘 스크립트의 Perl 인라인 교체가 예상대로 작동하지 않습니다.

분류에서Dev

C ++ 포인터가 예상대로 작동하지 않습니다.

분류에서Dev

Trix WYSIWYG 탭 인덱스가 예상대로 작동하지 않습니다.

분류에서Dev

Regex 긍정적 인 예견이 예상대로 작동하지 않습니다.

분류에서Dev

예상대로 작동하지 않는 C ++ 정의 해제 매크로

분류에서Dev

내 클래스의 정적 인스턴스 함수가 예상대로 작동하지 않습니다.

분류에서Dev

Linq의 Simple Left 조인이 예상대로 작동하지 않습니다.

분류에서Dev

.children 목록의 인덱싱이 예상대로 작동하지 않습니다.

분류에서Dev

jquery 시작 확인란이 예상대로 작동하지 않습니다.

분류에서Dev

여러 시트의 매크로가 제대로 작동하지 않습니다.

분류에서Dev

인라인 블록이 예상대로 작동하지 않습니다.

분류에서Dev

Luis API 예외 오류로 인해 봇이 제대로 작동하지 않습니다.

Related 관련 기사

  1. 1

    Variadic 매크로 인수 수가 예상대로 작동하지 않습니다.

  2. 2

    CSV 형식의 공백으로 인해 strtok가 예상대로 작동하지 않습니다.

  3. 3

    focusout ()이 예상대로 작동하지 않습니다 (이 매우 기본적인 예제에서)

  4. 4

    점-점-점 인수가 예상대로 작동하지 않습니다.

  5. 5

    MySQL 조인이 예상대로 작동하지 않습니다.

  6. 6

    ChildFragmentManager 제거가 예상대로 작동하지 않습니다.

  7. 7

    사용자 지정 요인 함수가 예상대로 작동하지 않습니다.

  8. 8

    보류중인 의도가 예상대로 작동하지 않습니다.

  9. 9

    식의 매크로가 예상대로 작동하지 않습니다.

  10. 10

    인라인 블록 표시가 예상대로 작동하지 않습니다.

  11. 11

    CMake Release로 인해 코드가 제대로 작동하지 않습니다.

  12. 12

    확인 대화 상자가 제대로 작동하지 않습니다.

  13. 13

    데이터 유형의 일부 오류로 인해 생성자가 예상대로 작동하지 않고 이유를 알 수 없습니다.

  14. 14

    매우 기본적인 스크롤바가 예상대로 작동하지 않는 문제

  15. 15

    단어 필드-따옴표 / 음성 표시로 인해 IF 문이 예상대로 작동하지 않습니다.

  16. 16

    사용자 지정 후크가 예상대로 작동하지 않습니다.

  17. 17

    C 매크로 ##가 함수 정의에 대해 작동하지 않습니다.

  18. 18

    쉘 스크립트의 Perl 인라인 교체가 예상대로 작동하지 않습니다.

  19. 19

    C ++ 포인터가 예상대로 작동하지 않습니다.

  20. 20

    Trix WYSIWYG 탭 인덱스가 예상대로 작동하지 않습니다.

  21. 21

    Regex 긍정적 인 예견이 예상대로 작동하지 않습니다.

  22. 22

    예상대로 작동하지 않는 C ++ 정의 해제 매크로

  23. 23

    내 클래스의 정적 인스턴스 함수가 예상대로 작동하지 않습니다.

  24. 24

    Linq의 Simple Left 조인이 예상대로 작동하지 않습니다.

  25. 25

    .children 목록의 인덱싱이 예상대로 작동하지 않습니다.

  26. 26

    jquery 시작 확인란이 예상대로 작동하지 않습니다.

  27. 27

    여러 시트의 매크로가 제대로 작동하지 않습니다.

  28. 28

    인라인 블록이 예상대로 작동하지 않습니다.

  29. 29

    Luis API 예외 오류로 인해 봇이 제대로 작동하지 않습니다.

뜨겁다태그

보관