2011-07-11 69 views
7

Tôi không có chuyên gia Đề án vì vậy không chắc chắn liệu tôi có đang sử dụng thuật ngữ chính xác tại đây hay không. Hãy để mã nói cho chính nó:Ký hiệu được trích dẫn trong Đề án

CSI> (define tree '(1 2 3 'Symb 4 5 6)) 
#<unspecified> 
CSI> tree 
(1 2 3 (quote Symb) 4 5 6) 
CSI> (symbol? 'Symb) 
#t 
CSI> (map symbol? tree) 
(#f #f #f #f #f #f #f) 

Đến từ nền Clojure, tôi nghĩ các biểu tượng được sử dụng như thế này trong Đề án, như từ khóa ở Clojure. Tôi phải đi qua một cấu trúc danh sách lồng nhau và thay thế các biểu tượng bằng một cuộc gọi hàm. Đây là giải pháp onedimensional của tôi và nó không làm việc:

(define (print-track track attrs) 
    (apply fmt #t 
     (map (lambda (attr) 
       (cond 
        ((symbol? attr) (get-attr attr track)) 
        (else   attr))) 
      attrs))) 

Không gian trống trên đường (symbol?) là một (list?) có điều kiện, nhưng nó có khả năng các aproach sai.

Tôi đang sử dụng Chương trình Gà.

Trả lời

18

Bạn đã chạy vào trích dẫn Lisp "gotcha". Trong Đề án, các ký hiệu được sử dụng cho tham chiếu biến, mà bạn hiểu rõ ràng. Điều này được đánh giá là đúng:

> (symbol? 'Symb) 

vì bạn đã trích dẫn biểu tượng và ngăn không cho nó được sử dụng làm tham chiếu biến.

> (symbol? Symb) 

Đầu tiên hãy tìm giá trị của biến Symb và sau đó kiểm tra xem giá trị đó có phải là biểu tượng hay không.

> (let ((Symb 'foo)) (symbol? Symb)) 

Sẽ đánh giá #t, vì giá trị của Symb là biểu tượng: foo.

> (let ((Symb 7)) (symbol? Symb)) 

Tất nhiên, hãy đánh giá #f.

Dường như bạn đã vấp phải sắc thái trích dẫn.

'Symb 

thực sự là viết tắt; nó tương đương với

(quote Symbol) 

, một lần nữa, trả về đối số chưa được đánh giá của nó.

Nhưng mã của bạn không cần báo giá bên trong. Khi bạn

> (define tree '(1 2 3 'Symb 4 5 6)) 

toàn bộ danh sách được trích dẫn; không có gì bên trong danh sách sẽ được đánh giá. Đó là lý do tại sao

> tree ; => (1 2 3 (quote Symb) 4 5 6) 

Bên trong danh sách được trích dẫn, 'Symb tương đương với (quote Symb), đây thực sự là danh sách. Vì toàn bộ danh sách được trích dẫn, việc sử dụng Symb unquoted sẽ không được coi là tham chiếu biến. Nó sẽ chỉ là biểu tượng.

> (define tree '(1 2 3 Symb 4 5 6)) 
> tree ; => (1 2 3 Symb 4 5 6) 

Bây giờ, nếu bạn đã đi qua tất cả những tham số cho hàm danh sách, những gì bạn ban đầu đã sẽ là đúng:

> (define tree (list 1 2 3 'Symb 4 5 6)) 
> tree ; => (1 2 3 Symb 4 5 6) 

Trong trường hợp đó, bạn đang đi qua những đối số cho hàm; các đối số cho hàm được đánh giá, vì vậy bạn cần báo giá để ngăn các ký hiệu bị coi là tham chiếu biến.

> (define tree (list 1 2 3 (quote Symb) 4 5 6)) 

Sẽ làm tương tự.

+0

+1 để rõ ràng, thấu đáo – acfoltzer

+1

Một thực sự không thể viết bất kỳ câu trả lời rõ ràng hơn này :) – progo

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