私はスキームにまったく慣れておらず、引用符や記号についてはよくわかりません。
これが私が理解していることです:
'a
-> a
'()
->(list)
'(1 2 3)
(list 1 2 3)
'(1 . 2)
(cons 1 2)
''a
(quote a)
So:
'(1 . 'a)
(1 quote a) => (list 1 quote a)
私が達成したいのは次のとおりです。
((let ((x 1) (y 2))
(lambda(f) ,f)) 'x)
-> 1
関数にシンボルを送信すると、シンボルは現在のスコープで評価される必要があります。この場合は1が返されます。
代わりに、次のエラーが発生します。
*** ERROR IN #<procedure #4>, (console)@243.32 -- Unbound variable: unquote
unquoteはquote
それ自体の中からしか利用できなかったかのようです。
編集
私はちょうどいくつかのドキュメントを読んでいて、関数「eval」を見つけました。これは私が探していたものを実行しているようです。
(define a 'foobar)
(define foobar 2)
(eval a)
-> 2
(define a 'x)
(define f (let ((x 1) (y 2))
(lambda (h) (eval h))))
(f a)
*** ERROR -- Unbound variable: y
(f y)
*** ERROR IN (console)@278.4 -- Unbound variable: y
しかし、私は本当に理解するかどうかはわかりません。
これが鶏肉のスタックトレースです
Error: unbound variable: x
Call history:
<syntax> (f (quote x))
<syntax> (quote x)
<syntax> (##core#quote x)
<eval> (f (quote x))
<eval> (eval h) <--
Edit2
Evalは悪ですが、それがどのように機能するかを知ることは非常に重要だと思います。
それで、アンクルの答えを読んだ後、私はそれが範囲の問題であり、実際それであるとかなり確信していました。したがって、私が理解していることから、eval
「グローバル」を使用して何かを評価しようとしているようです。
> (define a 11)
> (define b 'a)
> (eval b)
11
> (let ((a 10)) (eval b))
11
> (let* ((a 10) (b 'a)) (eval b))
11
> (let* ((a 10) (b 'a)) b)
a
> (let* ((c 10) (d 'c)) d)
c
> (let* ((c 10) (d 'c)) (eval d))
*** ERROR -- Unbound variable: c
スキームの評価は明らかに悪です!