2009-06-03 6 views
6

私はSchemeを学んでいます。下のコードで何が問題になっていますか?最初の関数をリストから取り出し、それを数値に適用するプログラムを作成したいのですが?スキームのリストから匿名関数を適用するにはどうすればよいですか?

(define num 3) 

    ;;I want to do something like this which returns 3 
    ((λ (x) x)num) 

    ;;but my functions are in a list so this should return3 
    ((first '((λ (x) x) (λ (x) (* x x)))) num) 

Imが上記のコードは、このエラーを取得:
手順アプリケーション:期待される手順、所与:(λ(x)はx)。引数は次のとおりです。3

このような出力が得られるとはどういう意味ですか?

私が何かを適用しないときは、いい出力が得られます。

(first '((λ(x) x)(λ(x) (*x x)))) 

リターン(λ(x)はx)

答えて

11

あなたは「ラムダで、引用しているので、それが評価されていません。

プロンプトで(λ(x)x)を入力するだけの場合、DrSchemeは#<procedure>を表示します。つまり、実際にラムダを評価し、閉鎖を返してくれます。これを引用することで、Schemeにシンボルのリストだけを与えています。

リストにあなたの機能を置きたい場合は、あなたが行うことができます:

((first (list (lambda (x) x) (lambda (x) (* x x)))) num) 

引用はい、あなたがリストを作成することができますが、その内容が評価されていない1つ。リスト関数は、評価された後、すべての引数からリストを生成します。

あなたが好きな場合にも、リストを準クォートできます

((first `(,(lambda (x) x) ,(lambda (x) (* x x)))) num) 
+0

ありがとうございました。 – unj2

2

これらの表現の違いは何ですか?

> (procedure? (lambda (n) n)) 
#t 
> (procedure? (quote (lambda (n) n))) 
#f 
> (procedure? '(lambda (n) n)) 
#f 

ジェイがあなたに答えましたが、私はまだ彼をアップアップできません。

2

(lambda(x)x)はプロシージャではありません。 は、を評価するフォームです。人々は用語で少し緩んでおり、ラムダ形式を一種の省略形として手続きと呼ぶことがよくあります。 "Ceci n'est pas une pipe。"

+0

真実ですが、このような問題で混乱している初心者の説明としては無駄です。ノートは、ラケットが値を出力する方法を変更したので、より明確なエラーになります: "(λ(x)x)' ... " - 見積もりは新規です。 –

+1

私が初心者のときは、これはちょうど混乱を解消するために必要な文章だったので、私は他人を助けるためにそれを書きました。おそらく、それは私だけでなく誰にとっても「究極的に役に立たない」ことです。 – rptb1

+1

Schemeには、コードとデータの間に(非常に意図的な)「x」と「x」の混乱があります。あなたの説明は正しいですが(私が言ったように)、それはメタレベルで同様の混乱です。ここで「x」はデータであり、「* x *に束縛された値」は「コード」である。多くの学生にとって、このような二重性は非常に混乱し、メタ円形評価者のようなものを通過するまでは、ほとんど完全にはっきりしません。 –

関連する問題