私は宿題のためにSchemeのメタ面の評価に取り組んでいます。ユーザーが特別なフォームをテーブルに追加してインストールできるようにする必要があります。ユーザーが(square 5)
のようなものを入力すると、評価者はsquare
という名前のフォームを検索します。見つかった場合はlambda
という文が返されます((lambda (x) (* x x))
など)。Scheme - 不正な関数オブジェクトとしてのラムダ
コードがlambda
ステートメントを返すときに問題が発生します。
Error: Bad function object:(lambda (x) (* x x))
が、それは私が以前にないとして、ラムダ文として手続き本体を定義する必要があることだけだ:私は、次のエラーメッセージが表示されますlambda
で始まるリスト
参考までに、ここでは動作しないコードがあります。 exp
は(install-special-form 'square (lambda (x) (* x x)))
のようなものになりますので、この場合には、name
はsquare
に評価し、func
が(lambda (x) (* x x))
と評価されます
(define (install-eval exp)
(define name (cadadr exp))
(define func (caddr exp))
(if (special-form-lookup (list name func))
#f
(begin
(append! special-forms-table (list name func))
name)))
そしてここで作業し、いくつかのコードです:
(define (install exp-list)
(append! special-forms-table exp-list))
(install (list 'square (lambda (x) (* x x))))
私は私の問題を推測していますつまり、動作しないコードを使用すると、lambda
は実際のlambda
ではなく、見積もりとして評価されますか?実際のlambda
ステートメントを取得して使用できるようにするために、ユーザー入力を取得するにはどうすればよいですか?
完璧に作業しました!ありがとうございました! – JazzBullets
そして、 'eval'を使うインタプリタで自由変数はどのように働くのでしょうか? – Sylwester