2011-09-30 52 views
7

Tôi có một cơ sở dữ liệu trả về các biểu thức CL vaild trong dấu ngoặc kép.Biểu thức đánh giá có chứa các chuỗi

Có thể chuyển đổi các chuỗi này thành biểu thức hay không.

Ví dụ, tôi thực hiện một truy vấn từ DB này qua CLSQL và kết quả là nó sẽ trả về tôi:

"(foo a b)"

Làm thế nào tôi nên chuyển đổi biểu thức này để:

(foo a b)

và tiếp tục đánh giá nó?

Trả lời

11
> (read-from-string "(foo a b)") 
(FOO A B) ; 
9 

9 là giá trị thứ hai của nhiều giá trị được tạo bởi read-from-string; bạn có thể bỏ qua nó:

(eval (read-from-string "(foo a b)")) 

sẽ làm những gì bạn muốn đưa ra định nghĩa phù hợp.

+0

Cảm ơn, làm cách nào tôi không thể tìm thấy chức năng đó? – oakenshield1

1
* (read-from-string "(+ 1 2)") 

(+ 1 2) 
7 

Có sự cố bảo mật. Xem biến số *read-eval*.

* (read-from-string "#.(+ 1 2)") 

3 
9 

Bạn thực sự cần phải chắc chắn rằng *read-eval*NIL, vì vậy đọc sẽ không đánh giá mã.

* (let ((*read-eval* nil)) (read-from-string "#.(+ 1 2)")) 

debugger invoked on a SB-INT:SIMPLE-READER-ERROR: 
    can't read #. while *READ-EVAL* is NIL 

Ngoài ra gọi EVAL trên đầu vào tùy ý từ cơ sở dữ liệu không phải là một ý tưởng hay.

Thông thường bạn muốn đảm bảo rằng mã chỉ gọi các chức năng được cho phép.

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