2016-07-13 1 views
0

Je travaille dans Guile et j'ai besoin d'utiliser une procédure qui est stockée dans une paire. Si je stocke car dans les exemples suivants:Procédure de stockage dans une paire (Scheme/Guile)

(define pairA (cons 1 car)) 
(define pairB '(1 . car)) 

.. Je ne peux évaluer la procédure de la première expression. Le second est transformé en un symbole, je devine en quelque sorte parce qu'elle est dans une paire, mais pas une liste:

>(display pairA) 
(1 . #<primitive-procedure car>) 

>(display pairB) 
(1 . car) 

Pourquoi le premier exemple retour car comme une procédure, mais pas la seconde? La seule différence que je peux dire est que pairA est à la fois une liste/paire, et pairB est seulement une paire. Y at-il un moyen d'utiliser (cdr pairB) comme une procédure?

Répondre

1

Qu'est-ce que vous voulez est

`(1 . ,car) 

Ceci est la construction quasiquote - en bref, il évalue seule voiture (en général - que les non cotées « » expressions), et insère sa valeur dans la position de forme non citée. Encore un petit exemple:

[email protected](guile-user)> `(quasiquote magic (+ 2 3) => ,(+ 2 3)) 
$1 = (quasiquote magic (+ 2 3) => 5) 

Votre premier exemple a fonctionné parce que le contre est une procédure (à savoir pas une forme spéciale) il est donc arguments sont évalués avant l'application. La seconde n'a pas fonctionné, parce que vous aviez (1 voiture) cité.

Notez également que votre PAIRA n'est pas une liste - procédures ne sont pas représentés sous forme de listes, ils sont des atomes:

[email protected](guile-user)> (pair? car) 
$1 = #f 
+0

Merci pour l'explication! Je ne trouvais rien dans les docs sur le fait de travailler avec des expressions de cette façon auparavant, mais vois maintenant comment cela fonctionne. Si je ne peux pas changer la façon dont la liste est construite, est-il possible de lire '' (1. voiture) '' comme si c'était quasi/non cité? Je travaille avec un programme qui a une infrastructure de construction de liste spécifique, qui prend essentiellement l'entrée d'utilisateur et fait beaucoup d'alists sans considérer si les valeurs sont des procédures, des symboles, des nombres, etc. –

+1

@JefferyShivers L'entrée d'utilisateur ne peut pas réellement spécifier des fonctions. Sauf si vous voulez que 'car 'dans l'entrée de l'utilisateur soit réellement mappé à la procédure' car': dans ce cas, vous pourriez vouloir une table de hachage symbol-to-procedure (ou alist, si petite). L'alist ressemblerait à ceci: '\' ((voiture., Voiture) (cdr., Cdr) ...) '. (Ceci est un peu difficile à expliquer en détail dans une boîte de commentaire, mais je serai heureux d'essayer d'expliquer tout ce que vous demandez.) –

+0

Merci @Chris, cela a du sens! Écrire l'alist comme vous le montre fonctionne parfaitement. –