2016-04-30 5 views
2

Oft im Racket docs/Handbuch finde ich so etwas wie:Namen anonyme Funktionen zuweisen vs. definieren sie „normal“

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

Ich habe keinen Vorteil aus dieser über sehen:

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

eine Funktion auf einen Namen eher zuweisen als (define (ident args...) exprs...) scheint die normale Art und Weise auf die gleiche Sache in JS analog:

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

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

Oder Python (nicht verwendet, weil lambda s nicht nur Funktionen sind; sie sind weniger nützlich):

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

greet = lambda name: f"Hello {name}!"  # not idiomatic 
  • In JS, der Umfang der const greet (local) unterscheidet sich von dem Umfang der function greet (global), so const greet bevorzugen.
  • In Python kann lambda s nur einen Ausdruck haben, der ihr Rückgabewert ist; Sie dürfen keine Variablen deklarieren oder zuweisen, bevorzugen Sie also geeignete Definitionen.

Soweit ich das beurteilen kann, gibt es keinen Unterschied zu Scoping oder Arten von Aussagen zwischen (define (ident args...) exprs...) und (define ident (λ (args...) exprs...) erlaubt in Racket ist.

Warum wird einer über den anderen verwendet? Gibt es einen Vorteil? Ist es Lesbarkeit, persönliche Präferenz oder Idiomatik?

Antwort

4

Es gibt keinen Unterschied.

Die meisten Leute bevorzugen die Syntax (define (greet name) ...). Wenn Sie betonen möchten, dass die Funktionen Werte sind, dann ist es sinnvoll, (define greet (lambda (name) ...)) zu schreiben. An der Indiana University wird die Syntax (define greet (lambda (name) ...)) verwendet, um dies zu unterstreichen (Funktionen, die erstklassige Werte sind).