컨텍스트에서 로컬 변수를 확인할 수 없습니다.

초라한

다른 컨텍스트에서 로컬 변수와 컨텍스트 문제가 발생했습니다.

fn평가되지 않은 코드를 저장할 수 있는 특별한 -alternave 를 만들고 싶습니다 . (다음 코드에서 my-fn)

내 사용 사례에서는이 코드를 변경해야합니다. 나는 이것을 위해 morph-macro를 사용할 것이지만 이것 없이도 내 문제가 나타납니다.

; Should work like fn, but save the code of args and body
(defmacro my-fn 
  [args body]
      (with-meta  (list 'fn args body)
                  {:args (list 'quote args)
                   :body (list 'quote body) }))


; in this macro, the predicate should be morphed later. 
; Both args and body will be needed. 
; To show my problem, i will skip this morphing and return just the body 
(defmacro morph 
  [args body]
  body)

이제 몇 가지 예제 데이터를 선택하고 my-fn. 새 함수를 모핑하고 평가하는 동안 조건 자 내부의 로컬 변수를 확인할 수없는 일이 발생합니다.

; example data for this case
(def people  #{{:id "S1" :name "Smith" :status 20 } 
               {:id "S2" :name "Jones" :status 10 }
               {:id "S3" :name "Blake" :status 30 }})


(let [a 20
      f (my-fn [t] (<= a (:status t)))] ; pred should be used like fn 
  (let [pred (eval (list 'fn    ; later this second let code comes into a macro or somehting
                         (:args (meta f)) 
                         (list 'morph 
                               (:args (meta f)) 
                               (:body (meta f)))))]
  (filter pred people))) ; => clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve symbol: a in this context

누군가가 왜 이런 일이 발생하며 어떻게 피할 수 있는지 설명 할 수 있습니까? a의 정의 대신 상수를 사용 f하면 모든 것이 잘 작동합니다. 그러나 이것은 내 사용 사례에 도움이되지 않습니다 ...

초라한

좋아, 로컬 바인딩에 대한 설명에 감사드립니다. 내 유스 케이스의 경우 로컬 바인딩 사용을 포함하여 my-fn같은 fn것을 사용할 수 있다는 것이 정말 중요 합니다.

매크로에서 로컬 바인딩에 액세스하기 위해이 스레드찾았습니다 .

그래서 나는 로컬 환경을 저장하고 위의 모든 로컬 바인딩 (나중 버전에서는 필요한 바인딩 만)과 조건 자 단어를 사용하여 변형 된 술어 주위에 my-fn배치 let합니다.

그래서 내 새 버전의 함수와 매크로는 다음과 같습니다.

(defmacro my-fn
  [args body]
      (with-meta  (list 'fn args body)
                  {:args (list 'quote args)
                   :body (list 'quote body)
                   :env (list 'get-env)}))

(defmacro morph
  [args body]
  body)


; example data for this case
(def people  #{{:id "S1" :name "Smith" :status 20 }
               {:id "S2" :name "Jones" :status 10 }
               {:id "S3" :name "Blake" :status 30 }})



 (let[a 20
      f (fn [t] (<= a (:status t)))]
   (filter f people))


 (defmacro get-env
  []
  (into {} (for [k (keys &env)]
             [(name k) k])))


(let [a 20
      f (my-fn [t] (<= a (:status t)))] ; pred should be used like fn
  (let [env (get-env)
        pred (eval (list 'fn    ; later this second let code for comes into a macro or somehting
                         (:args (meta f))
                         (list 'let
                               (reduce (fn[v [x y]] (conj v (read-string x) y)) [] (:env (meta f)))
                               (list 'morph
                                     (:args (meta f))
                                     (:body (meta f))))))]
   (filter pred people))) ; => ({:id "S3", :name "Blake", :status 30} {:id "S1", :name "Smith", :status 20})

고마워!

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

피카소 컨텍스트를 변수로 확인할 수 없습니다.

분류에서Dev

Windows Cordova 앱 : 앱은 로컬 컨텍스트에서 원격 웹 콘텐츠를로드 할 수 없습니다.

분류에서Dev

Fragment의 FragmentAdapter에서 컨텍스트를 CustomCallBack 인터페이스로 캐스팅 할 수 없습니다.

분류에서Dev

기호 (컨텍스트)를 확인할 수 없습니다.

분류에서Dev

여러 장치에 대해 로컬로 URL을 확인할 수 없습니다.

분류에서Dev

Windows에서 컬러 텍스트를 인쇄 할 수 없습니다.

분류에서Dev

forEach 루프의 컨텍스트 내에서 두 개의 서로 다른 ID를 동시에 변경할 수 있는지 확인 하시겠습니까?

분류에서Dev

비 정적 변수 파일 경로는 정적 컨텍스트에서 참조 할 수 없습니다.

분류에서Dev

Javasccript의 로컬 변수에 현재 컨텍스트를 어떻게 저장할 수 있습니까?

분류에서Dev

로컬 호스트에 SSH를 사용할 수 없습니다.

분류에서Dev

로컬 호스트에 SSH를 사용할 수 없습니다.

분류에서Dev

Laravel에서 swal로 삭제를 확인할 수 없습니다.

분류에서Dev

Java-myVar를 변수로 확인할 수 없습니다.

분류에서Dev

TargetAPI-빌드를 변수로 확인할 수 없습니다.

분류에서Dev

java-개체를 변수로 확인할 수 없습니다.

분류에서Dev

onClickListener를 변수로 확인할 수 없습니다.

분류에서Dev

Java : 개체를 변수로 확인할 수 없습니다.

분류에서Dev

로컬 MySQL 서버에 로그인 할 수 없습니다.

분류에서Dev

내 로컬 서버에 로그인 할 수 없습니다.

분류에서Dev

스프링 부팅 테스트에서 컨텍스트 속성을로드 할 수 없습니다

분류에서Dev

로컬 네트워크에서 Windows 도메인을 확인할 수 없습니다.

분류에서Dev

로컬 네트워크에서 Windows 도메인을 확인할 수 없습니다.

분류에서Dev

json 스키마로 날짜를 확인할 수 없습니다.

분류에서Dev

스캐너를 유형으로 확인할 수 없습니다.

분류에서Dev

Kubernetes "Windows 포드"가 서로 통신 할 수 없음 | "호스트를 확인할 수 없습니다"| "네트워크에 연결할 수 없습니다."

분류에서Dev

Spring Boot 앱에서 애플리케이션 컨텍스트를로드 할 수 없습니다.

분류에서Dev

onClick 함수에서 변수를 인수로 전달할 수 없습니다.

분류에서Dev

터미널에서 컬러로 인쇄 할 수 없습니다.

분류에서Dev

텍스트를 숫자로 변환 할 수 없습니다.

Related 관련 기사

  1. 1

    피카소 컨텍스트를 변수로 확인할 수 없습니다.

  2. 2

    Windows Cordova 앱 : 앱은 로컬 컨텍스트에서 원격 웹 콘텐츠를로드 할 수 없습니다.

  3. 3

    Fragment의 FragmentAdapter에서 컨텍스트를 CustomCallBack 인터페이스로 캐스팅 할 수 없습니다.

  4. 4

    기호 (컨텍스트)를 확인할 수 없습니다.

  5. 5

    여러 장치에 대해 로컬로 URL을 확인할 수 없습니다.

  6. 6

    Windows에서 컬러 텍스트를 인쇄 할 수 없습니다.

  7. 7

    forEach 루프의 컨텍스트 내에서 두 개의 서로 다른 ID를 동시에 변경할 수 있는지 확인 하시겠습니까?

  8. 8

    비 정적 변수 파일 경로는 정적 컨텍스트에서 참조 할 수 없습니다.

  9. 9

    Javasccript의 로컬 변수에 현재 컨텍스트를 어떻게 저장할 수 있습니까?

  10. 10

    로컬 호스트에 SSH를 사용할 수 없습니다.

  11. 11

    로컬 호스트에 SSH를 사용할 수 없습니다.

  12. 12

    Laravel에서 swal로 삭제를 확인할 수 없습니다.

  13. 13

    Java-myVar를 변수로 확인할 수 없습니다.

  14. 14

    TargetAPI-빌드를 변수로 확인할 수 없습니다.

  15. 15

    java-개체를 변수로 확인할 수 없습니다.

  16. 16

    onClickListener를 변수로 확인할 수 없습니다.

  17. 17

    Java : 개체를 변수로 확인할 수 없습니다.

  18. 18

    로컬 MySQL 서버에 로그인 할 수 없습니다.

  19. 19

    내 로컬 서버에 로그인 할 수 없습니다.

  20. 20

    스프링 부팅 테스트에서 컨텍스트 속성을로드 할 수 없습니다

  21. 21

    로컬 네트워크에서 Windows 도메인을 확인할 수 없습니다.

  22. 22

    로컬 네트워크에서 Windows 도메인을 확인할 수 없습니다.

  23. 23

    json 스키마로 날짜를 확인할 수 없습니다.

  24. 24

    스캐너를 유형으로 확인할 수 없습니다.

  25. 25

    Kubernetes "Windows 포드"가 서로 통신 할 수 없음 | "호스트를 확인할 수 없습니다"| "네트워크에 연결할 수 없습니다."

  26. 26

    Spring Boot 앱에서 애플리케이션 컨텍스트를로드 할 수 없습니다.

  27. 27

    onClick 함수에서 변수를 인수로 전달할 수 없습니다.

  28. 28

    터미널에서 컬러로 인쇄 할 수 없습니다.

  29. 29

    텍스트를 숫자로 변환 할 수 없습니다.

뜨겁다태그

보관