2012-02-22 13 views
1

私の問題点を例で説明します。Schemeの単純なインタープリタ

(play '(left nothing right left))を取得します。リスト内の名前の中には、実際の手続き、スキップしたいものがあります。

(define (left) 
    'left 
) 

名前がリスト内にあるプロシージャを解釈する必要があります。解決策は何ですか?

私は((car '(left nothing right left)))をしようとすると、私はエラーを取得する:手順アプリケーション:期待される手順、与えられた:左(引数なし)

答えて

4

(car '(left nothing right left))手続きの名前であるシンボルleft、と評価さではなく、実際にプロシージャ、それであなたはそれを呼び出すことはできません。あなたが手順に連想リストのマッピングシンボルを構築したいと思う

(define actions `((left . ,(lambda() 'left)) 
        (right . ,(lambda() 'right)) 
        (nothing . ,(lambda() (display "I'm staying put"))))) 

そして、あなたはまた、あなたができる

((cdr (assoc (car '(left nothing right left)) actions))) 
+1

シンボルではなく、手続きが、あなたに感謝:playは、それは手続き、のようなものがありますかどうかを確認するために各メンバーをテストする必要があります。あなたのアドバイスはシンボルを使用します。手続きのペア私はほぼ同じ問題のためにこの答えを見つけるのを助けるhttp://stackoverflow.com/a/1834145/1226100と私はそれが私が欲しいものを正確にやっていると思う。 – Houp

+0

@Houp:関数がシンボルを返すので、これはシンボルを与えています。 –

0

としてあなたのリストの最初の要素のための適切な関数を呼び出すことができますあなたが評価したいシンボルとあなたが評価したくないシンボルの混合物を含むリストを構築するには、quasiquotingを使用します。それはシンボルとして残されるのでnothingが非引用されていない間

(play `(,left nothing nothing ,right nothing)) 

leftrightは、あなたが(そのような手順など)としてそれらを定義したものは何でもに拡大していきます。左これは再び私を返して

(define (play xs)(for-each (lambda (x)(if (procedure? x)(x) x)) xs))