2008-11-25 32 views
8

Làm cách nào để chuyển đổi chuỗi thành mã tương ứng trong Lược đồ PLT (không chứa phương thức string->input-port)? Ví dụ, tôi muốn chuyển đổi chuỗi này:Chuyển đổi chuỗi thành mã trong Đề án

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

vào danh sách này:

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

Có thể làm điều này mà không cần mở một tập tin?

Trả lời

9

Đề án có thủ tục read cho việc đọc s-biểu thức từ cổng vào và bạn có thể chuyển đổi một chuỗi để input stream với string->input-port. Vì vậy, bạn có thể đọc một đối tượng Scheme từ một chuỗi với

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

Tôi không có Đề án lắp đặt, vì vậy tôi chỉ đọc nó from reference và không thực sự kiểm tra nó.

+0

+1 cho sự trung thực;) –

+2

Đối với bất kỳ ai đến đây bằng cách sử dụng Lược đồ Guile: '(đọc (mở-đầu vào-chuỗi" (quote foo) "))'. – d11wtq

2

Từ câu hỏi tương tự này trên comp.lang.scheme bạn có thể lưu chuỗi vào tệp rồi đọc từ đó.

Điều đó có thể đi một cái gì đó như mã ví dụ này:

(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

Từ Đề án thủ công PLT:

(open-input-string string [name-v]) tạo ra một cổng đầu vào mà đọc byte từ bảng mã UTF-8 (xem phần 1.2.3) của chuỗi. Đối số name-v tùy chọn được sử dụng làm tên cho cổng trả về; mặc định là 'string.

+0

Điều này trông giống như sự đảo ngược trừu tượng trong Đề án. Lisp thường có hàm 'read-from-string'. – Svante

+1

Có, có vẻ như - đọc chỉ đọc từ cổng đầu vào, và mở cổng đầu vào để đọc từ tập tin là trong R5RS, nhưng làm cho cổng đầu vào để đọc từ chuỗi không phải là. Vì vậy, nó là nguồn gốc của câu hỏi. Mit scheme có string-> input-port, PLT - open-input-string. –

1

Nhiều đề án có with-input-from-string str thunk thực hiện thunk trong ngữ cảnh trong đó str là cổng đầu vào tiêu chuẩn. Ví dụ trong chương trình Gambit:

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

đánh giá để:

(foo bar)

Lambda là cần thiết vì một thunk phải là một thủ tục tham gia không có đối số.

+0

Và vì 'read' là một thủ tục không lấy đối số, bạn có thể viết ví dụ trên thành' (with-input-from-string "(foo bar)" read) '. –

Các vấn đề liên quan