2016-02-16 20 views
7

Il mio amico me lo mostra e sono davvero curioso del perché funzioni così. Ho in un primo momento pensato che sta andando essere un errore di sintassi, ma non è così ... Here're alcuni dei miei esperimenti:Cos'è (lambda lambda lambda)?

> (lambda lambda lambda) 
#<procedure> 
> ((lambda lambda lambda)) 
'() 
> ((lambda lambda lambda) 1 2 3 4 5 6 7) 
'(1 2 3 4 5 6 7) 
> (lambda lambda foo) 
#<procedure> 
> ((lambda lambda foo)) 
foo: undefined; 
cannot reference an identifier before its definition 
> (lambda lambda 1 2 3 4 5) 
#<procedure> 
> ((lambda lambda 1 2 3 4 5)) 
5 
> (lambda foo lambda) 
. lambda: bad syntax in: lambda 
> (lambda 1 2 3) 
. lambda: bad argument sequence in: 1 
> ((lambda) 1 2 3) 
. lambda: bad syntax in: (lambda) 

Così sembra:

  1. In lambda, lambda potrebbe essere arg-ids?
  2. In lambda, lambda potrebbe essere un costruttore di elenchi?

risposta

7

Ohhh ho capito. lambda potrebbe essere in ombra!

> ((lambda (lambda) (+ 1 lambda)) 7) 
8 

Inoltre, la sintassi data al https://docs.racket-lang.org/guide/lambda.html non è del tutto corretto, perché a arg-ids posizione, un identificatore potrebbe essere lì! Ciò collegherà l'elenco di argomenti con l'identificatore:

> ((lambda foo foo) 1 2 3 4) 
'(1 2 3 4) 

Questi lo spiegano!

+1

Questo collegamento ha più dettagli: https://docs.racket-lang.org/reference/lambda.html –

+0

Thx :) In effetti, il link che ho postato menzionato 'rest-id' pure in 4.4.1, ma non l'ho visto! –

+1

Sì. Tuttavia, c'è un altro caso strano che questo non spiega. '(lambda lambda foo)' = '# '. Ed è perché questo è in un REPL, dove puoi fare '(define (f x) foo ') e poi definire pippo in seguito, in modo che per esempio la ricorsione reciproca funzioni. Ma per queste cose, dovresti davvero metterle in un file, perché è quello che mostrerà il loro vero comportamento. In un file di per sé, '(lambda lambda foo)' sarà un errore, come dovrebbe. –

Problemi correlati