2016-07-13 10 views
0

Ich arbeite in Guile und muss eine Prozedur verwenden, die in einem Paar gespeichert ist. Wenn ich car in den folgenden Beispielen speichern:Speichervorgang in einem Paar (Schema/Guile)

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

.. Ich kann nur das Verfahren aus dem ersten Ausdruck auszuwerten. Der zweite in ein Symbol eingeschaltet wird, vermute ich irgendwie wegen es in einem Paar zu sein, aber keine Liste:

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

>(display pairB) 
(1 . car) 

Warum wird das erste Beispiel zurück car als ein Verfahren, nicht aber die zweite? Der einzige Unterschied, den ich feststellen kann, ist, dass pairA ist eine Liste/Paar, und pairB ist nur ein Paar. Gibt es eine Möglichkeit, (cdr pairB) als eine Prozedur zu verwenden?

Antwort

1

Was Sie wollen, ist

`(1 . ,car) 

Dies ist das quasiquote Konstrukt - kurz gesagt, es nur Auto (in der Regel - nur die nicht notiert „“ Ausdrücke) auswertet und fügt seinen Wert in der Position von nicht börsennotierter Form. Noch ein kleines Beispiel:

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

Ihr erstes Beispiel gearbeitet, weil Nachteile ist ein Verfahren (das heißt nicht eine besondere Form), so ist es Argumente vor der Anwendung ausgewertet werden. Das zweite hat nicht funktioniert, weil du (1. Auto) zitiert hast.

Beachten Sie auch, dass Ihr Paira keine Liste ist - Verfahren werden als Listen nicht dargestellt, sie sind Atome:

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

Danke für die Erklärung! Ich konnte in den Dokumenten nichts über das Arbeiten mit Ausdrücken auf diese Weise finden, aber sehen Sie jetzt, wie es funktioniert. Wenn ich nicht ändern kann, wie die Liste aufgebaut ist, gibt es trotzdem "(1. Auto)" zu lesen, als wäre es quasi/nicht quoted? Ich arbeite mit einem Programm, das eine spezifische listenbildende Infrastruktur hat, die im Grunde genommen Benutzereingaben macht und eine Reihe von Alis macht, ohne zu überlegen, ob die Werte Prozeduren, Symbole, Zahlen usw. sind. –

+1

@JefferySchivers Benutzereingabe kann nicht wirklich Funktionen angeben. Es sei denn, Sie möchten, dass "Auto" in der Benutzereingabe tatsächlich der "Auto" -Prozedur zugeordnet wird: In diesem Fall möchten Sie vielleicht eine Symbol-zu-Prozedur-Hashtabelle (oder Alist, falls klein). Der Alist würde so aussehen: '\ '((Auto., Auto) (cdr., Cdr) ...)'. (Dies ist ein bisschen schwierig in einem Kommentarfeld ausführlich zu erklären, aber ich werde glücklich sein zu versuchen, alles zu erklären, was Sie fragen.) –

+0

Danke @Chris, das macht Sinn! Das Schreiben des Alist wie du zeigst funktioniert perfekt. –