2008-11-25 18 views
8

¿Cómo convierto una cadena en el código correspondiente en el esquema PLT (que no contiene el método string->input-port)? Por ejemplo, yo quiero convertir esta cadena:Convierta una cadena al código en el Esquema

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

en esta lista:

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

¿Es posible hacer esto sin necesidad de abrir un archivo?

Respuesta

9

Esquema tiene un procedimiento para la lectura read s-expresiones de puerto de entrada y se puede convertir una cadena de flujo de entrada con string->input-port. Así, se puede leer un objeto esquema de una cadena con

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

no tengo instalado el esquema, por lo que sólo leerlo from reference y en realidad no probarlo.

+0

+1 por honestidad;) –

+2

Para cualquiera que venga aquí usando el Esquema Guile: '(leer (open-input-string" (quote foo) "))'. – d11wtq

2

De esta pregunta similar en comp.lang.scheme puede guardar la cadena en un archivo y luego leer de ella.

Eso podría ser algo como el código ejemplo:

(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

De PLT manual de sistema:

(open-input-string string [name-v]) crea un puerto de entrada que lee bytes de la codificación UTF-8 (véase la sección 1.2.3) de cadena. El argumento opcional name-v se usa como el nombre del puerto devuelto; el valor predeterminado es 'string.

+0

Esto parece inversión de abstracción en Scheme. Common Lisp tiene una función 'read-from-string'. – Svante

+1

Sí, parece que lee solo desde los puertos de entrada, y abrir el puerto de entrada para leer desde el archivo está en R5RS, pero hacer puerto de entrada para leer desde una cadena no lo es. Entonces es la fuente de la pregunta. El esquema Mit tiene string-> input-port, PLT - open-input-string. –

1

Muchos esquemas tienen with-input-from-string str thunk que ejecuta thunk en un contexto donde str es el puerto de entrada estándar. Por ejemplo en el esquema gambit:

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

evalúa a: es necesario

(foo bar)

La lambda porque un thunk debe haber un procedimiento sin argumentos.

+0

Y como 'leer' es un procedimiento que no toma argumentos, puede acortar el ejemplo anterior a' (con-entrada-de-cadena) (barra foo) "leer)'. –

Cuestiones relacionadas