2016-04-30 4 views
2

それらを定義する私が見つけるようなもの:無名関数に名前を割り当て対ラケットのドキュメント/ハンドブックでは多くの場合、「通常」

(define (greet name) 
    (format "Hello, ~a!" name)) 
:私は上でこのことから利点が表示されない

(define greet 
    (λ (name) (format "Hello, ~a!" name))) 

名ではなく(define (ident args...) exprs...)への機能の割り当て通常の方法は、JSに同じものに類似しているようだ:

// "usual" declaration 
function greet (name) { return `Hello ${name}!` };  

// assigning 
const greet = name => `Hello, ${name}!`; 
const greet = function (name) { return `Hello ${name}!` }; 

またはPython(lambdaは関数ではないため使用されません。 JSで

def greet(name): return f"Hello, {name}!" # full definition 

greet = lambda name: f"Hello {name}!"  # not idiomatic 
  • 、)(ローカルconst greetの範囲は)(グローバルfunction greetの範囲が異なるので、const greetを好む:彼らは)あまり有用です。
  • Pythonでは、lambdaは、戻り値である1つの式しか持つことができません。変数を宣言したり割り当てることができないので、適切な定義を優先します。

私の知る限り、スコーピングや(define (ident args...) exprs...)(define ident (λ (args...) exprs...)間で許容されるステートメントのタイプにラケットに違いはありません。

なぜ、もう一方が使用されるのですか?利点はありますか?それは可読性、個人的な好み、または慣用句ですか?

答えて

4

違いはありません。

ほとんどの人は、(define (greet name) ...)の構文を使用します。関数が値であることを強調したい場合は、(define greet (lambda (name) ...))と書くことが理にかなっています。インディアナ大学では、構文(define greet (lambda (name) ...))がそれを強調するために使用されています(ファーストクラスの値)。

関連する問題