2017-03-03 17 views
0

私は、可変数の引数を持つことができるユーザ定義のラムダ関数を処理できるインタプリタを構築しようとしています。コードは次のように少し見えます:関数の値がラムダ関数に渡されて評価されないのはなぜですか?

((lambda (x &optional y z) (func_body)) args)) 

今、私が得ることのできる結果は、評価されていない適切な機能です。私はsquare X = (* X X)を定義し、私の通訳を実行する場合、たとえば、私が手:私は必要何

(* X X) 

が評価された後、上記の関数です。私は次のようなものを試しました:

(let ((func (lambda (x &optional y z) (func_body)))) 
    (apply/funcall func args)) 

((lambda (x &optional y z) (func_body)) args) 

しかし、私は後になっても結果は得られません。私はsquare X = (* X X)を定義するときにそれを持ってしようとしている、と私が手に入れ​​:

16 

私が行方不明です何上の任意の指導?

編集:args句は(cdr/car Y)または別の関数によって生成されます。また、関数lispを使ってラムダリストを生成しようとすると、それはシンボルではなく、なぜそうであるのかという疑問がありますか?

答えて

0

は、私が見る唯一の誤差はletの構文は次のとおりです。それは

(let ((func (lambda (x) (* x x)))) 
    (funcall func 4)) 
==> 16 

Lambdaも働くようになります。

((lambda (x) (* x x)) 5) 
==> 25 

を今、あなたの体はvariableに格納されている場合、それはわずかになりもっと工夫された:

(defparameter *square* '(* x x)) 
(funcall (coerce `(lambda (x) ,*square*) 'function) 3) 
==> 9 

しかし、それは行きますからlambdaとして、あなたのコードを維持するために非常に良いアイデアのようになります。

(defparameter *square* (lambda (x) (* x x))) 
(funcall *square* 4) 
==> 16 
+0

args句は、(cdr/car Y)または別の関数によって生成されます。ラムダ関数の多くは、今私が考えることです。基本的に、コマンドラインは '> '四角いX =(* X X)'四角形 ' 結果:'> 16' – KMK

+0

のようなものを読み込みます。 – sds

+0

ありがとうございました! – KMK

0

((ラムダ(X &オプションYZ)(func_body))引数)

例:

CL-USER 111 > ((lambda (x &optional (y 0) (z 0)) 
       (+ x y z)) 
       1 
       2 
       3) 
6 

CL-USER 112 > (apply (lambda (x &optional (y 0) (z 0)) 
         (+ x y z)) 
        '(1 2 3)) 
6 
0

あなたはカレンとラムダを保存するホストevalcoerce)に依存しないインタプリタを作成しますデータとしての環境。 applyは、格納された環境に基づいて名前にバインドされた引数を持つ新しいフレームを作成するためにサポートする必要があります。その後、その環境下でボディを評価する必要があります。したがって、化合物アプリケーションのためにCommon Lisp lambdaマクロではないapplyマクロを使用することは決してありません。

coerceを使用して示唆される他の回答は、インタープリタの字句変数では機能しません。

関連する問題