2011-02-24 3 views
0

J'ai écrit la règle de syntaxe suivante:modèle de schéma correspondant à

(define-syntax match-rewriter 
    (syntax-rules() 
    ((_ (patt body) ...) 
    (λ (x) (match x (patt body) ... (_ x)))))) 

qui est essentiellement match-lambda sauf qu'il retourne son argument si aucune correspondance ne se trouve plutôt que de lancer une exception.

Maintenant, je veux écrire une fonction, let_as_lambda, qui prendra les chaînes du code source en entrée et réécrire les let déclarations que la nouvelle fonction let_as_lambda. Voilà ce que j'ai:

(define let_as_lambda 
    (match-rewriter (`(let((,<var> ,<val>)) ... ,<expressions>) 
        `((lambda (,<var> ...) ,<expressions>) ,<val> ...)))) 

Il est manifestement erroné que: montrant

'((λ ((x) ...) (+ x 2)) (3) ...) 

encore les ellipses et la "3" entre parenthèses:

(let_as_lambda '(let((x 3)) (+ x 2))) 

retours. Je crois que mon problème est que je ne comprends pas l'utilisation correcte des symboles `, ., et , dans la correspondance de modèle.

Si quelqu'un pouvait me montrer la bonne façon de faire cela, il serait grandement apprécié.

Merci.

Répondre

2

Vous êtes probablement confus car vous utilisez deux outils de correspondance de modèles différents. Le premier est ce que vous obtenez avec syntax-rules et le second est match. Ils semblent assez proches mais il existe des différences importantes - et dans ce cas, le problème principal est que, contrairement à syntax-rules, vous ne pouvez pas utiliser ... dans les résultats quasi-cités d'un match. Donc, pour traiter des listes de valeurs reconnues, vous devez utiliser unquote-splicing (ou ,@) et d'autres fonctions comme map etc. Par exemple, comparer les résultats de ces deux expressions:

(match '(1 2 3) [`(,x ...) `(foo ,x ...)]) 
(match '(1 2 3) [`(,x ...) `(foo ,@x)]) 

Comme une note de côté, il serait bien si l'habituel quasi-quote ferait ce que vous voulez, mais pour une solution complète, il doit être possible avec des fonctions simples aussi - et cela complique le tout (les utilisations de ... devront se traduire par apply).

+0

Dang! J'écrivais le mien. Tu es trop rapide, Eli. Et votre commentaire sur la faisabilité d'ajouter "..." au quasiquote rend le vôtre meilleur que le mien l'aurait été aussi. Comme mes étudiants écriraient:> O –

+0

Ah, merci, que "@" fait un monde de différence. :-) – Schemer