2008-11-25 10 views
8

Jak przekonwertować ciąg znaków na odpowiedni kod na schemacie PLT (który nie zawiera metody string->input-port)? Na przykład chcę przekonwertować ten ciąg:Konwertuj ciąg znaków na kod w schemacie

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

do tej listy:

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

Czy można to zrobić bez otwierania pliku?

Odpowiedz

9

Program posiada procedurę read za czytanie s-wyrażeń z portu wejściowego i można przekonwertować ciąg do strumienia wejściowego z string->input-port. Tak, można odczytać obiektu schemat z ciągiem z

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

nie mam zainstalowany Scheme, więc tylko ją przeczytać from reference a nie faktycznie go przetestować.

+0

+1 za szczerość;) –

+2

Dla każdego, kto przyjeżdża tutaj za pomocą programu Guile: '(przeczytaj (ciąg znaków) (" foo) ")). – d11wtq

2

Z tego podobnego pytania na comp.lang.scheme można zapisać ciąg do pliku, a następnie odczytać z niego.

To może iść coś jak ten przykładowy kod:

(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

Od PLT instrukcji schematu:

(open-input-string string [name-v]) tworzy port wejściowy, który odczytuje bajty z kodowaniem UTF-8 (patrz punkt 1.2.3) sznurka. Opcjonalny argument name-v jest używany jako nazwa zwróconego portu; wartość domyślna to 'string.

+0

To wygląda na inwersję abstrakcji w Scheme. Common Lisp ma funkcję 'read-from-string'. – Svante

+1

Tak, wydaje się - odczytuje tylko z portów wejściowych, a port wejściowy do odczytu z pliku jest w R5RS, ale port wejściowy do odczytu z łańcucha nie jest. Więc to jest źródło pytania. Schemat Mit ma ciąg-> port wejściowy, PLT - łańcuch znaków wejściowych. –

1

Wiele programów ma with-input-from-string str thunk, który wykonuje thunk w kontekście, w którym str jest standardowym portem wejściowym. Na przykład w systemie gambit:

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

ocenia się:

(foo bar)

lambda jest konieczne, ponieważ thunk powinna istnieć procedura podejmowania żadnych argumentów.

+0

A ponieważ 'read' jest procedurą, która nie przyjmuje argumentów, możesz skrócić powyższy przykład do' (with-input-from-string '(foo bar) "read"). –

Powiązane problemy