Domanda

Dopo aver appreso un po 'di schema da SICP, ho iniziato a leggere The Little Schemer (che trovo abbastanza divertente) e sono circa un quarto fatto. Ho notato che posso scrivere molti (la maggior parte? Tutti?) Soluzioni senza utilizzare lambda mentre The Little Schemer sempre li utilizza. Ad esempio, la prima definizione è

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

, che, se non erro, può essere scritto più semplicemente come

(define (atom? x) 
   (and (not (pair? x)) (not (null? x))))

mi manca qualcosa di fondamentale, se le soluzioni lambda-meno che scrivo?

È stato utile?

Soluzione

In origine, define aveva una sola sintassi, per impostare una variabile per un valore. Questo è lo stile usato in tali libri antichi (e senza tempo). Più tardi, define ha una sintassi diversa come una scorciatoia, che è quello che si sta utilizzando.

Solo per divertimento, cerca nelle librerie Schema, si potrebbe trovare una macro che si espande la forma non-lambda nella vecchia lambda-pesante.

Altri suggerimenti

Io preferisco fortemente lo stile lambda-pesante per l'insegnamento, dal momento che rende la creazione la funzione più esplicito, come dice Jay.

Quando si impara, le semplici funzioni di iniziare con il simile atom? sono defined al livello più alto. Questo significa che è possibile, e ancora più compatto, per creare la funzione con il defun in stile define voi menzione.

Tuttavia, quando si inizia a utilizzare le funzioni come valori di prima classe, per esempio, come argomento di map , che vedrai lambda per la prima volta, e potrebbe sembrare più strano e più magico di quanto realmente sia.

Al contrario, se si è stati definendo le funzioni con lambda per tutto il tempo, è meno di un salto per vedere che le funzioni sono proprio come qualsiasi altro valore. Essi capita di essere sul lato destro della define abbastanza frequente, ma non sono diversi da un numero o una costante quotato:

(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))

Naturalmente, il linguaggio supporta entrambe le forme, quindi si tratta di stile alla fine. Per me, c'è una consistenza accattivante nell'uso dei define quando tutte le funzioni sono realizzati con lambda: il primo argomento è sempre un simbolo, e il secondo argomento è solo una vecchia espressione. E il fatto che lambda è proprio come qualsiasi vecchia espressione è una delle maggior parte delle cose importanti per ogni programmatore funzionale di imparare.

Si può vedere che cosa il vostro schema si espande queste scorciatoie (macro) ad utilizzare expand (se supportato):

MzScheme 4.2.4 (con DrScheme):

> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
  (add1)
  (lambda (x) (apply + '1 x)))

Chez Scheme 8.0:

> (expand '(define (add1 x) (+ 1 x)))
(begin
  (set! add1
    (lambda (x)
      (+ 1 x)))
  (void))

Il lambda appare chiaro come il sole.

Mi ricordo vagamente un professore discutere di qualcosa di simile.

Credo che la soluzione lambda viene utilizzato per due motivi:

Il primo è puramente una cosa storica. A un certo punto nel tempo, che era l'unico modo è stato possibile. Così alcune persone usano ancora quel metodo.

Il secondo è che alcune persone come essere più espliciti circa il fatto che si sta creando una funzione, in modo a loro piace vedere la parola lambda.

Credo che la scelta si riduce a che cosa mai lei personalmente come il migliore.

Sto leggendo un po 'di lambda calcolo (leggere "L'attuazione della programmazione funzionale Lingue" di Simon Peyton Jones; pdf gratuito on-line) come io uso TLS. E quindi questa è solo una supposizione, ma credo di TLS gli autori vogliono che tu sia davvero lambda-pesante nel vostro modo di pensare. Loro non escono e dicono, ma ci sono suggerimenti (controllare p. 107 del TLS) che tutto questo è solo un esercizio di calc applicata lambda. Quindi forse stanno dicendo senza dire, "Stai facendo astrazioni lambda, il mio amico!"

The Little Schemer utilizza uno pseudo-codice Scheme (per fare semplificazioni per scopi educativi e di essere indipendenti dalla implementazione). di serie Schema di oggi ha una definizione di definire in cui si sta implicitamente invocando lambda (vedi http://www.cs.cmu.edu/Groups/AI/html/r4rs/r4rs_7.html ). Lo schema Schemer Little è molto semplice e non include questa forma alternativa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top