2017-07-29 3 views
0

Je lis un livre intitulé "Le Petit Schemer" et dans ce morceau de code est présenté comme un moyen récursif de trouver la longueur d'une liste sans avoir de fonctions définies.Que se passe-t-il dans cette fonction Sheme récursive qui n'utilise pas define?

((lambda (mk-length) 
     (mk-length mk-length)) 
    (lambda (mk-length) 
     (lambda (l) 
     (cond 
      ((null? l) 0) 
      (else (add1 
        ((mk-length mk-length) 
        (cdr l)))))))) 

-je obtenir genre de l'idée vague, que la fonction est passée un outil pour faire plus d'elle-même, mais je continue à me confondre quand je tente de réfléchir en profondeur à travers elle, et lorsque je tente de reproduire quelque chose J'aime ça. Quelqu'un peut-il expliquer plus en détail ce qui se passe ici, et pourquoi est-ce si important (le livre a traité cela avec beaucoup de signification)?

+0

Continuez à lire, il est expliqué un peu plus tard. Au cas où ce n'est pas encore clair, cherchez le "Y Combinator", c'est le concept qui est en jeu ici. –

Répondre

1

Je vous suggère d'essayer de le comprendre vous-même en marchant à travers avec DrRacket

Une fois ouvert il suffit de coller le code comme si elle était une fonction avec un argument de liste, par exemple .:

(((lambda (mk-length) 
    (mk-length mk-length)) 
(lambda (mk-length) 
    (lambda (l) 
    (cond 
     ((null? l) 0) 
     (else (add1 
       ((mk-length mk-length) 
       (cdr l)))))))) 
'(1 2 3)) 

Dans la liste déroulante du bas, sélectionnez Choisir la langue, puis dans la sélection modale "Étudiant intermédiaire avec lambda". Ceci est un schéma restreint avec moins de fonctionnalités que la norme, mais votre code fonctionnera comme écrit. Après avoir appuyé sur RUN, vous verrez un bouton Step. Appuyez dessus et vous pouvez parcourir tout le processus visuellement.

Image of the stepper, showing the very first step!

Cela montre le pas à pas faire le premier pas. NB: le langage de DrRacket "Intermediate student with lambda" peut ne pas fonctionner sur tout le code du livre. Il fait partie du livre Comment concevoir des programmes et se composent de plusieurs langues avec une complexité différente. Voir les formulaires autorisés dans this documentation page. DrRacket prend en charge les standards R5RS, R6RS et R7RS. Il a aussi une implémentation coquine non standard par défaut avec le nom #lang racket qui vous donne des tonnes de bibliothèques mais vous verrouille pour pouvoir seulement exécuter cette implémentation.