1

私はスキームにまったく慣れておらず、引用符や記号についてはよくわかりません。

これが私が理解していることです:

'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

スキームの評価は明らかに悪です!

4

2 に答える 2

1

特にこの場合、評価する式を引用する必要はありません。これは機能します。

(let ((x 1) (y 2)) 
  ((lambda (f) f) x))

=> 1

問題のコードでは、変数はそれを定義しxたのスコープ内にのみ存在することに注意してください。let最も外側の'x記号はそれだけで、式のx内側とは関係のない記号です。let

((let ((x 1) (y 2)) 
   (lambda (f) f)) 'x)

=> 'x
于 2012-11-08T22:25:14.250 に答える
1
It's as if unquote was only available from within quote itself.

はい、引用符で囲まれた式の中でのみ引用符を外すことができます。つまり、式を引用している (式の項目を評価したくない) が、式の特定の部分を評価したい場合です。その場合は unquote を使用します。

(define a 10)
`(a b ,a) ==> '(a b 10)

最後の式では、a と b を未評価にしたいのですが、3 番目の要素、つまり a を評価してその値に置き換える必要があるため、そのために unquote を使用します。

あなたのコード:

(define f (let ((x 1) (y 2)) 
 (lambda (h) (eval h))))

fparam h は eval を使用して評価されるため、param forは未評価の式である必要があります。

したがって、使用する必要があります(f 'a)

注: (f 'y)let を使用して作成された y のスコープがなくなるため、機能しません。

于 2012-11-09T05:26:52.840 に答える