2012-05-01 19 views
5

Tôi đang cố gắng để hiểu làm thế nào để có được chức năng eval để đọc một chuỗi và đánh giá nội dung đó là bên trong chuỗi.Làm thế nào để eval chuỗi trong vợt

Hiện nay tôi biết rằng

> (eval '(+ 1 2)) 
    3 

nhưng tôi không có kiến ​​thức với việc sử dụng vợt. Vì vậy, tại thời điểm này tôi đang cố gắng để làm cho nó để tôi có thể làm điều này:

> (eval "(+ 1 2)") 
    3 

Bất cứ lời khuyên hoặc liên kết đến tài nguyên hữu ích sẽ được đánh giá.

+1

Tôi nghĩ rằng đây là những gì bạn muốn: http://stackoverflow.com/q/318952/535275 –

+3

Ngoài ra, mã vợt ngữ nhất tránh sử dụng eval. Có lẽ bạn có một ví dụ mà bạn thực sự cần nó, nhưng bạn có thể muốn đọc [bài viết này] (http://blog.racket-lang.org/2011/10/on-eval-in-dynamic-languages-generally. html) về việc sử dụng eval trong Racket. –

Trả lời

13

Bạn muốn sử dụng read cùng với open-input-string. Cũng giống như vậy:

-> (eval (read (open-input-string "(+ 1 2)"))) 
3 

Bạn cũng có thể sử dụng with-input-from-string:

-> (with-input-from-string "(+ 1 2)" 
    (lambda() (eval (read)))) 
3 
+7

Tôi thích sử dụng '(eval (gọi-với-đầu vào-chuỗi" (+ 1 2) "đọc))'. Tại sao? 1. Chuỗi cổng được tự động đóng trước 'eval' (không giống như giải pháp' mở-đầu vào-chuỗi'; được rồi, vì vậy đối với các cổng chuỗi, nó có thể không quan trọng quá nhiều (trừ khi bạn đang sử dụng Guile ;-)) , nhưng vẫn); 2. Nó không sử dụng chất lỏng/thông số (không giống như giải pháp 'with-input-from-string'). –

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