2017-05-10 3 views
1

J'ai cette tâche où je travaille avec un évaluateur metacircular, et je définir une nouvelle cond comme ceci:Pourquoi est-ce que je peux définir une nouvelle cond, et Scheme ne sera pas confondu avec mon nouveau cond sur la condition conditionnelle?

(define cond 3) 

En plus else:

(define (else x) (/ x 2) 

Ma question est pourquoi est-ce (ci-dessous) fonctionne réellement?

(cond ((= cond 2) 0) 
(else (else 4))) 

Comment savoir quel schéma cond est mon sens et mon else cond, sur la cond et else conditionnelle?

(Ne hésitez pas à modifier le titre, comme je ne suis pas sûr de savoir comment formuler ma question)

+1

Au moins dans Racket, ce n'est définitivement pas le cas. Les deux identificateurs 'cond' et' else' sont liés aux nouvelles définitions, et les expressions lancent une exception pour essayer d'appliquer '3' en tant que procédure. –

+0

Où cela fonctionne-t-il? Pour autant que je sache, cela ne devrait pas fonctionner dans une implémentation de Scheme. – molbdnilo

Répondre

1

Cela dépend de la façon dont vous avez mis en œuvre cond dans l'évaluateur metacircular. Habituellement, il vérifie certains opérateurs pour les symboles comme quote et cond et ensuite faire quelque chose de spécial. Ainsi cond dans la position de l'opérateur sera élargi comme cond tandis que cond dans d'autres circonstances serait évalué comme s'il s'agissait d'une variable.

1

Dans le schéma, il n'y a pas d'identification réservés. Dans de nombreuses langues, il existe une liste d'identifiants réservés (mots-clés) qui ne peuvent pas être utilisés comme noms de variables.

Dans le schéma, vous pouvez par exemple faire:

> (let ((cond +)) 
    (cond 1 2)) 
3 

Ce qui distingue le schéma en dehors de la plupart des langues est que les programmes sont macro élargi.

Exécution d'un programme Scheme:

read -> macro expansion -> compilation -> execution 

Il est non trivial d'expliquer comment l'algorithme d'expansion macro fonctionne. Je peux vous recommander le chapitre "Abstraction syntaxique: La syntaxe-expanseur de cas" de R. Kent Dybvig dans le livre "Beautiful Code".

https://www.cs.indiana.edu/~dyb/pubs/bc-syntax-case.pdf