2008-11-25 11 views
8

Wie konvertiere ich eine Zeichenfolge in den entsprechenden Code in PLT-Schema (die die string->input-port-Methode nicht enthält)? Zum Beispiel möchte ich diese Zeichenfolge konvertieren:Konvertieren von Zeichenfolge in Code in Schema

"(1 (0) 1 (0) 0)" 

in diese Liste:

'(1 (0) 1 (0) 0) 

Ist es möglich, dies zu tun, ohne eine Datei zu öffnen?

Antwort

9

Scheme Verfahren hat read zum Lesen s-Ausdrücke aus Eingangs-Port und Sie können eine Zeichenfolge Eingabestrom mit string->input-port konvertieren. So können Sie mit

(read (string->input-port "(1 (0) 1 (0) 0)")) 

ein Schema-Objekt aus einem String gelesen habe ich nicht Schema installiert, so lese ich es nur from reference und nicht wirklich testen.

+0

+1 für Ehrlichkeit;) –

+2

Für alle, die mit Guile Scheme kommen: '(lesen (open-input-string" (Zitat foo) "))'. – d11wtq

2

Von dieser ähnlichen Frage auf comp.lang.scheme können Sie die Zeichenfolge in eine Datei speichern und dann daraus lesen.

, dass etwas wie in diesem Beispiel Code gehen könnte:

(let ((my-port (open-output-file "Foo"))) 
    (display "(1 (0) 1 (0) 0)" my-port) 
    (close-output-port my-port)) 

(let* ((my-port (open-input-file "Foo")) 
     (answer (read my-port))) 
    (close-input-port my-port) 
    answer) 
5

Von PLT Scheme Handbuch:

(open-input-string string [name-v]) erzeugt einen Eingang-Port, das Bytes von der UTF-8-Codierung liest Schnur (Abschnitt 1.2.3 sehen). Das optionale Argument name-v wird als Name für den zurückgegebenen Port verwendet. Der Standardwert ist 'string.

+0

Dies sieht wie Abstraktionsumkehr in Schema aus. Common Lisp hat eine 'read-from-string' Funktion. – Svante

+1

Ja, es scheint - lesen liest nur von Eingangsports, und öffnende Eingangsport zum Lesen von Datei ist in R5RS, aber Eingangsport für das Lesen von String ist nicht. So ist es die Quelle der Frage. Mit-Schema hat String-> Eingang-Port, PLT - Open-Input-String. –

1

Viele Schemata haben with-input-from-string str thunk, die thunk in einem Kontext ausführt, in dem str der Standardeingabeanschluss ist. Zum Beispiel in Schachzug Schema:

(with-input-from-string "(foo bar)" (lambda() (read)))

ausgewertet:

(foo bar)

Das Lambda notwendig ist, weil ein thunk ein Verfahren ohne Argumente sein sollte.

+0

Und da 'read' eine Prozedur ist, die keine Argumente annimmt, könnten Sie das obige Beispiel mit '(with-input-from-string" (foo bar) "read)' kurzschließen. –

Verwandte Themen