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 derfunction greet
(global), soconst 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?