Question

Après avoir appris un peu du schéma de SICP, je commencé à lire The Little Schemer (que je trouve assez amusant) et je suis environ un quart fait. J'ai remarqué que je peux écrire beaucoup (la plupart? Tous?) Des solutions sans utiliser lambda tandis que The Little Schemer toujours les utilise. Par exemple, la première définition est

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

qui, à moins que je me trompe, peut être écrit plus simplement

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

Suis-je manque quelque chose de fondamental si je écris lambda-solutions moins?

Était-ce utile?

La solution

A l'origine, define avait une syntaxe simple, pour définir une variable à une valeur. C'est le style utilisé dans ces livres anciens (et hors du temps). Par la suite, define a une syntaxe différente comme un raccourci, qui est celui que vous utilisez.

Juste pour le plaisir, la recherche sur vos bibliothèques Scheme, vous trouverez peut-être une macro qui étend la forme non-lambda dans l'ancien lambda-lourd.

Autres conseils

Je préfère fortement l'puisqu'elle rend la création de la fonction plus explicite style lambda lourd pour l'enseignement, comme le dit Jay.

Lors de l'apprentissage, les fonctions simples que vous commencez avec comme atom? sont defined au niveau supérieur. Cela signifie qu'il est possible, et encore plus compact, pour créer la fonction avec le defun de style define vous mention.

Toutefois, lorsque vous commencez à utiliser des fonctions comme valeurs de première classe, par exemple, comme argument map , vous allez voir lambda pour la première fois, et il peut sembler plus étrange et plus magique que c'est vraiment.

Au lieu de cela, si vous avez la définition de vos fonctions avec lambda tout le temps, il est moins d'un saut pour voir que les fonctions sont comme toute autre valeur. Ils se trouvent sur le côté droit de define assez souvent, mais ne sont pas différents d'un numéro ou une constante cité:

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

Bien sûr, la langue prend en charge les formes, il se résume finalement à un style. Pour moi, il y a une cohérence attrayante dans l'utilisation de define lorsque toutes vos fonctions sont faites avec lambda: le premier argument est toujours un symbole, et le second argument est juste une vieille expression. Et le fait que lambda est comme une vieille expression est l'une des choses les plus importantes pour tout programmeur fonctionnel pour apprendre.

Vous pouvez voir ce que votre schéma étend ces raccourcis (macros) en utilisant expand (si pris en charge):

mzscheme 4.2.4 (avec DrScheme):

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

Chez Schéma 8.0:

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

Le lambda apparaît clair comme le jour.

Je me souviens vaguement professeur discuter de quelque chose comme ça.

Je pense que la solution lambda est utilisée pour deux raisons:

La première est purement une chose historique. À un moment donné dans le temps, qui était la seule façon qu'il était possible. Ainsi, certaines personnes utilisent encore cette méthode.

La seconde est que certaines personnes aiment être plus explicite sur le fait qu'une fonction est créée, de sorte qu'ils aiment voir le mot lambda.

Je crois donc que le choix se résume à ce que jamais vous personnellement comme le meilleur.

Je lis un peu lambda-calcul (lire « La mise en œuvre des langages de programmation fonctionnels » par Simon Peyton Jones, pdf gratuit en ligne) que j'utilise TLS. Et si cela est juste une supposition, mais je crois que les auteurs de TLS veulent que vous soyez vraiment lambda-lourd dans votre façon de penser. Ils ne viennent pas et le dire, mais il y a des indices (vérifier p. 107 de TLS) que cela est tout simplement un exercice appliqué lambda calc. ils sont donc peut-être dire sans dire: « Tu fais des abstractions lambda, mon ami! »

Le Petit Schemer utilise un schéma pseudo-code (à faire à des fins éducatives simplifications et d'être mise en œuvre indépendante). Schéma standard d'aujourd'hui a une définition de définir dans laquelle vous invoquez implicitement lambda (voir

scroll top