2013-01-11 4 views
1

Une fonction qui retourne combien de fois il a été appelé dans le schéma ressembleraitSimuler Variables statiques dans le schéma

(define count 
    (let ((P 0)) 
    (lambda() 
     (set! P (+ 1 P)) 
     P))) 

(list (count) (count) (count) (count)) ==> (list 1 2 3 4) 

Mais supposons que nous avons une expression qui ressemble à ceci

(map ______ lst) 

et nous voulons que pour évaluer à

(list 1 2 3 ... n) 
where n = (length list) 

Le problème nécessite que nous utilisions une déclaration lambda dans le vide, et nous ne pouvons pas utiliser de définitions auxiliaires comme (count) dans le blanc, donc

(lambda (x) (count)) 

n'est pas autorisé. Il suffit de remplacer (compter) avec la définition précédente comme ceci:

(map 
(lambda (x) 
    ((let ((P 0)) 
     (lambda() 
     (set! P (+ 1 P)) 
     P)))) 
L) 

ne fonctionne pas non plus.

Des suggestions?

Répondre

1

Vous êtes très, très proche d'une solution correcte! dans le code dans la question ne ceci:

  1. La lambda la plus externe est erroné, supprimer cette ligne et la parenthèse fermante correspondante
  2. Le lambda plus interne est celui qui finira par se passer à la procédure map, donc il a besoin de recevoir un paramètre (même si elle est pas réellement utilisé)
  3. Supprimer la parenthèse la plus externe entourant la forme let

tout se résume à ceci: le lambda qui est passé à map reçoit un paramètre, mais inclut également la variable P. Le formulaire let définit P une seule fois dans le contexte du lambda passé, et à partir de ce moment sur le lambda "se souvient" de la valeur P, car pour chacun des éléments de la liste, le même P est utilisé.

+1

Merci! Cela a fonctionné! – user1968574

+0

@ user1968574 de rien, s'il vous plaît n'oubliez pas d'accepter la réponse qui vous a été le plus utile par en cliquant sur la coche à sa gauche –

1

Vous êtes 90% du chemin. Utilisez le côté droit de votre définition count dans la zone vide et ajoutez un argument (ignoré) à la fonction.

+0

Si c'est ce que vous entendez: (carte (lambda (x) ((let ((P 0)) (lambda() (ensemble P (+ 1 P)) P))) L) J'ai essayé cela, et cela ne fonctionne pas. – user1968574

+0

@ user1968574: non – newacct

+0

Ensuite, je ne suis pas sûr de ce que l'on entend par "ajouter un argument ignoré à la fonction.Pourriez-vous clarifier un peu plus s'il vous plaît? – user1968574