2009-11-13 5 views
2

Y a-t-il une boucle for ou une boucle for each dans Scheme?"pour chaque" ou "tous" les mots-clés du schéma

J'ai cherché autour et trouvé il y a un mot-clé "every" mais le schéma de compilateur de schéma que j'emploie n'a pas cette fonction pre-build dedans. C'est ce que supposé faire, il peut être trouver here

(define (first-letters sent) 
    (every first sent)) 

> (first-letters '(here comes the sun)) 
(H C T S) 

Comment puis-je ré-écrire la fonction every? en utilisant d'autres fonctions prédéfinies. Le langage que j'utilise est dans le DrScheme - Essentials of Programming Languages ​​(3ème édition)

J'ai essayé tout le compilateur pré-installé dans DrScheme aucun d'eux ne peut compiler la fonction every.

Des idées?

+0

Comme Toms dit (mais le lien est un endroit vraiment mauvais pour une explication) 'map' est la fonction que vous décrivez. Notez aussi que votre code suppose une fonction 'first' qui peut accepter un symbole et retourner un symbole ne contenant que le premier caractère - et ce n'est pas quelque chose de très commun.(Au moins pas en dehors de Berkley et du manuel Simplement Scheme.) –

+0

Je pense d'abord que je peux facilement utiliser la voiture pour mettre en œuvre la carte n'est pas quelque chose que je cherchais. – Jonathan

+1

Le schéma n'a pas de "mots-clés". – Svante

Répondre

6

Vous recherchez map, bien que vous aimeriez probablement savoir que le schéma a aussi for-each. map fait exactement ce que vous voulez avec every. Il fait quelque chose à chaque élément de la liste, renvoyant une nouvelle liste des résultats.

On pourrait même dire

(define every map) 

Vous pouvez obtenir votre fonction first en écrivant

(define (first symbol) 
    (string->symbol (string (string-ref (symbol->string symbol) 0)))) 

Ce qui est mauvais style Scheme, cependant. Il ressemble à l'ancien Lisp des années 60 ou 70, avant que les chaînes ne soient dans la langue. Quoi qu'il en soit, maintenant vous pouvez dire

(map first '(here comes everybody)) 
=> (h c e) 

for-each-t une sorte d'effet secondaire à chaque élément de la liste:

(define initials (map first '(here comes everybody))) 
(for-each display initials) 
=> hce 
+2

La définition de 'first' serait légèrement meilleure que' (string-> symbol (substring (symbole-> string symbol) 0 1)) '. –

2

This pourrait être la réponse à votre question. Fonction Map, prend une fonction et list (-s) en arguments, applique la fonction aux éléments de la liste, retourne les résultats.

0

dépend de quel schéma vous regardez. En dehors de "pour-chacun" et "carte" mentionné ci-dessus (qui font partie des différentes normes, donc présents dans tous les schémas réels), vous pouvez trouver des extensions spécifiques à la mise en œuvre. Par exemple, le système PLT a un tas de ces formes, que vous pouvez lire sur here.

1

C'est un ajout au poste de Nathan, qui est la meilleure solution pour vous en ce moment ...

Si vous déplacez jamais vers les langues du module scheme ou scheme/base, vous aurez accès à l'armée du PLT de for itérateurs. Ceux-ci ressemblent un peu plus aux boucles "pour chaque" qui sont communes dans d'autres langues. Recherchez des for dans les docs:

(define (first symbol) 
    (string->symbol (string (string-ref (symbol->string symbol) 0)))) 

(for/list ([symbol (in-list '(here comes everybody))]) 
    (first symbol)) 

=> '(h c e) 
Questions connexes