2011-07-11 3 views
7

私はSchemeの専門家ではありませんので、ここで正しい用語を使用しているかどうかはわかりません。コードにしてみましょう自分自身のために話す:記号はSchemeで引用されています

CSI> (define tree '(1 2 3 'Symb 4 5 6)) 
#<unspecified> 
CSI> tree 
(1 2 3 (quote Symb) 4 5 6) 
CSI> (symbol? 'Symb) 
#t 
CSI> (map symbol? tree) 
(#f #f #f #f #f #f #f) 

はClojureの背景から来て、私はClojureの中のキーワードのように、シンボルは、スキームで、このように使用されたと思いました。私はネストされたリスト構造を通り、シンボルを関数呼び出しで置き換えることになっています。これは私の一次元ソリューションであり、それは仕事のことを行います

(define (print-track track attrs) 
    (apply fmt #t 
     (map (lambda (attr) 
       (cond 
        ((symbol? attr) (get-attr attr track)) 
        (else   attr))) 
      attrs))) 

(symbol?)ライン上の空きスペースが条件付き(list?)のためだったが、それはおそらく間違ってaproachです。

私はチキンスキームを使用しています。

答えて

18

あなたはLispの引用符 "gotcha"を実行しました。 Schemeでは、変数参照にシンボルが使用されています。これは明らかに理解できます。これは真であると評価されます:

> (symbol? 'Symb) 

シンボルを引用符で囲み、変数参照として使用できないためです。

まず、Symb変数の値を調べて、その値がシンボルであるかどうかを確認します。

> (let ((Symb 'foo)) (symbol? Symb)) 

Symbの値がシンボルfooであるため、#tに評価されます。

> (let ((Symb 7)) (symbol? Symb)) 

もちろん#fと評価されますか?

あなたは見積もりの​​ニュアンスに乗ったようです。

'Symb 

は実際には略語です。

(quote Symbol) 

と同じです。これも、評価されていない引数を返します。

しかし、あなたのコードは内側の引用符を必要としません。あなたがいるとき

> (define tree '(1 2 3 'Symb 4 5 6)) 

リスト全体が引用されます。 何も入っていないが評価されます。その理由は、

> tree ; => (1 2 3 (quote Symb) 4 5 6) 

引用符付きのリストの中で、 'Symbは(引用符)と同じですが、実際はリストです。リスト全体が引用されるので、引用符で囲まれていないSymbolを使用すると、変数参照として扱われません。それはただのシンボルに過ぎません。あなたはリスト機能にすべてのそれらの引数を渡していた場合

> (define tree '(1 2 3 Symb 4 5 6)) 
> tree ; => (1 2 3 Symb 4 5 6) 

さて、何が最初にやったことは正しいでしょう:

> (define tree (list 1 2 3 'Symb 4 5 6)) 
> tree ; => (1 2 3 Symb 4 5 6) 

その場合、あなたは、関数にこれらの引数を渡しています。関数への引数が評価されるので、シンボルが変数参照として扱われるのを防ぐために引用符が必要です。

> (define tree (list 1 2 3 (quote Symb) 4 5 6)) 

同じことをしますか?

+0

+1、わかりやすく、徹底 – acfoltzer

+1

本当にこれよりも明確な答えを書くことはできません。 – progo

関連する問題