2011-06-27 47 views
19

Tôi đã cố gắng để hiểu các Wikipedia article on homoiconity, nhưng nó quá dài và không giải thích lý thuyết chính đằng sau từ ngắn gọn. Tôi nên nói thêm rằng tôi không phải là một người nói tiếng Anh bản địa vì vậy tôi thích tiếng Anh đơn giản hơn so với các báo giá giấy trắng học thuật.Độ chính xác đồng nghĩa là gì?

Vì vậy, điều gì có nghĩa là chính xác nếu ngôn ngữ là đồng âm? Điều gì khiến C#, Java hoặc JavaScript không đồng âm?

+0

Tôi không nghĩ nó có ý nghĩa gì nhiều, như được giải thích ở đây: http://www.expressionsofchange.org/dont-say-homoiconic/ –

Trả lời

10

Nó có nghĩa là "mã dưới dạng dữ liệu" là đặc điểm chung của gia đình Lisp.

(add 2 3) 

Giống như chuỗi ở trên, vừa là danh sách vừa là cuộc gọi hàm. Tiền tố "Homo" đại diện cho đặc điểm này.

9

Đề án mang tính biểu tượng đồng tính vì các chương trình của nó có cách hiểu là cấu trúc dữ liệu.

'(define (foo x) (* x x)) 

là một danh sách, phần tử đầu tiên trong số đó là define, thứ hai (foo x) (danh sách), và vân vân. Dấu ngoặc kép ' có nghĩa là: không diễn giải điều này, hãy để nó dưới dạng danh sách. Nếu chúng tôi xóa ', chúng tôi nhận được

(define (foo x) (* x x)) 

là định nghĩa chức năng Đề án. Vì các định nghĩa chương trình Scheme là các biểu thức danh sách lồng nhau (và do đó là một loại "các cú pháp cây cú pháp"), và Scheme là một ngôn ngữ động, bạn có thể chơi các thủ thuật với điều này để xây dựng các hệ thống tạo mã/macro rất mạnh.

Bây giờ Java không phải là biểu tượng đồng tính đơn giản vì nó không cung cấp các loại "chương trình literals" mà đánh giá để phân tích cú pháp mảnh cây. Tất nhiên, bạn có thể xác định một chuỗi

String helloWorld = 
    "class Hello { public static void main(System.out.println(\"Hello, world!\"); }"; 

mà bạn có thể phân tích cú pháp và chuyển sang trình biên dịch, nhưng thật khó xử vì đó là chuỗi chứ không phải là thuật ngữ có cấu trúc.

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