1

スキームでは、これはなぜですか:

(define foo
  (lambda (x)
    42))

これよりも優れたスタイルと見なされます:

(define (foo x)
  42)

そして、どちらか一方を優先する理由はありますか?

4

4 に答える 4

4

私はそれがより良いスタイルとは考えていないと思います.最初のものは冗長です. 本当の問題は、名前付き関数を定義するか、代わりfooに使用するかです。lambda名前付き関数を作成することを既に決定している場合は、内部 fooに配置する理由がわかりません。作成するすべての小さな関数に個別に名前を付けて定義する必要がなくなるため、実際にはここで決定します: この関数は、個別に定義して名前を付けるほど重要かどうかです。lambdalambda

于 2010-08-05T20:44:12.633 に答える
0

あなたが示しているのは、Javascript でこれと同等です:

var foo = function(x) {42;}

function foo(x) {
  42;
}

後者は前者のシンタックスシュガーです。最初のスタイルは一般的な形式で、後者は関数を定義するためのショートカットです。

スタイルに関しては、前者が好まれる理由がわかりません。より長く、より多くのネストが必要です。

于 2010-08-05T20:49:59.423 に答える
0

スタイルが好みの別の言葉である場合、前者がより良いスタイルであることに同意します. 率直に言って、「foo は x の関数です」。そこを間違うのは難しい。2番目の例の「defun」スタイルの引数は、それを呼び出す方法で定義することです。

これは、C でポインター変数を宣言するときに * を置く場所と Lisp で同等です。意味はありません。好きなものを選択するか、作業しているグループが既に決定しているものを選択してください。誰もあなたを誤解することはありません。

于 2010-08-05T20:50:21.373 に答える
0

それの訳は

(define (foo x)
   42)

言語に特別な形式を追加します。

1.

 (define foo 45)

1つの特別なフォームです

2.

 (lambda (x) (+ x 1)

その他の特別な形式は次のとおりです。

(define foo (lambda (x) (+ x 1)))

上記の 2 以外の特殊なフォームは追加されていません。

したがって、関数を定義するための省略形を追加することは、構文糖衣です。スキームはミニマリストになる傾向があるため、言語が必要以上に特別な形式を追加する必要はありません。今、私は次のように考えています:

(define foo (x) (+ x 1))

読みやすく、覚えて理解するのにそれほど費用がかからないので、スキームに入れてもかまいません。

于 2010-08-07T12:12:53.943 に答える