2008-10-06 36 views
8

Sau khi hiểu (trích dẫn), tôi tò mò muốn biết cách thực hiện câu lệnh. Suy nghĩ đầu tiên của tôi làThực thi mã được lưu trữ dưới dạng danh sách

(defvar x '(+ 2 21)) 
`(,@x) 

nhưng điều đó chỉ để đánh giá (+ 2 21), hoặc nội dung của x. Làm thế nào một mã chạy được đặt trong một danh sách?

+1

Tôi nghĩ bạn đang đặt câu hỏi sai. Thật sự bạn muốn làm gì? –

Trả lời

16

(eval '(+ 2 21))

+0

Chà - thật đơn giản ... –

+0

:) Lưu ý rằng bạn có thể làm một số điều thú vị với backtick để kiểm soát những gì được đánh giá bởi eval. – Rich

+0

Bây giờ tôi rất tò mò ... tôi có thể xin ví dụ không? –

0

@ Christián Romo:

backtick dụ: bạn kinda có thể thực hiện áp dụng sử dụng eval và backtick, bởi vì bạn có thể ghép tranh luận vào một biểu mẫu. Sẽ không phải là điều hiệu quả nhất trên thế giới, nhưng:

(eval `(and ,@(loop for x from 1 upto 4 collect `(evenp ,x)))) 

tương đương với

(eval '(and (evenp 1) (evenp 2) (evenp 3) (evenp 4))) 

Ngẫu nhiên, điều này có kết quả tương tự như (nhiều hiệu quả hơn)

(every 'evenp '(1 2 3 4)) 

Hy vọng rằng thỏa mãn sự tò mò của bạn!

+0

Thật thú vị ... Tôi sẽ phải tìm hiểu thêm về tất cả các thủ thuật nhỏ lạ mắt này. –

0

Hãy xem hướng dẫn Lisp vui tại http://lisperati.com/. Có các phiên bản cho Common Lisp và Emacs Lisp, và nó thể hiện việc sử dụng các quasiquote và macro.

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