1) แนวคิดใหม่ของตัวแปร ใน Lisp ตัวแปรทั้งหมดเป็นตัวชี้อย่างมีประสิทธิภาพ ค่าคือสิ่งที่มีประเภทไม่ใช่ตัวแปรและการกำหนดหรือตัวแปรที่มีผลผูกพันหมายถึงการคัดลอกพอยน์เตอร์ไม่ใช่สิ่งที่พวกเขาชี้ไป
(defun print-twice (it)
(print it)
(print it))
'it' เป็นตัวแปร มันสามารถถูกผูกไว้กับค่าใด ๆ ไม่มีข้อ จำกัด และไม่มีประเภทที่เกี่ยวข้องกับตัวแปร หากคุณเรียกใช้ฟังก์ชันอาร์กิวเมนต์ไม่จำเป็นต้องคัดลอก ตัวแปรคล้ายกับตัวชี้ มันมีวิธีการเข้าถึงค่าที่ถูกผูกไว้กับตัวแปร ไม่จำเป็นต้องสำรองหน่วยความจำ เราสามารถส่งผ่านวัตถุข้อมูลใด ๆ เมื่อเราเรียกใช้ฟังก์ชั่น: ขนาดและประเภทใด ๆ
วัตถุข้อมูลมี 'ชนิด' และวัตถุข้อมูลทั้งหมดสามารถสอบถามได้สำหรับ 'ชนิด'
(type-of "abc") -> STRING
2) ประเภทสัญลักษณ์ สัญลักษณ์แตกต่างจากสตริงที่คุณสามารถทดสอบความเท่าเทียมกันโดยการเปรียบเทียบตัวชี้
สัญลักษณ์เป็นวัตถุข้อมูลที่มีชื่อ โดยปกติชื่อสามารถใช้เพื่อค้นหาวัตถุ:
|This is a Symbol|
this-is-also-a-symbol
(find-symbol "SIN") -> SIN
เนื่องจากสัญลักษณ์เป็นวัตถุข้อมูลจริงเราจึงสามารถทดสอบว่าเป็นวัตถุเดียวกันหรือไม่:
(eq 'sin 'cos) -> NIL
(eq 'sin 'sin) -> T
สิ่งนี้ทำให้เราสามารถเขียนประโยคที่มีสัญลักษณ์:
(defvar *sentence* '(mary called tom to tell him the price of the book))
ตอนนี้เราสามารถนับจำนวน THE ในประโยค:
(count 'the *sentence*) -> 2
ในสัญลักษณ์ Common LISP ไม่เพียง แต่มีชื่อ แต่ยังสามารถมีค่าฟังก์ชั่นรายการทรัพย์สินและแพคเกจ ดังนั้นสัญลักษณ์สามารถใช้ในการตั้งชื่อตัวแปรหรือฟังก์ชั่น รายการคุณสมบัติมักใช้เพื่อเพิ่ม meta-data เข้ากับสัญลักษณ์
3) สัญลักษณ์สำหรับรหัสโดยใช้สัญลักษณ์ต้นไม้
เสียงกระเพื่อมใช้โครงสร้างข้อมูลพื้นฐานในการแสดงรหัส
รายการ (* 3 2) สามารถเป็นได้ทั้งข้อมูลและรหัส:
(eval '(* 3 (+ 2 5))) -> 21
(length '(* 3 (+ 2 5))) -> 3
ต้นไม้:
CL-USER 8 > (sdraw '(* 3 (+ 2 5)))
[*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
* 3 [*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
+ 2 5
4) ภาษาทั้งหมดใช้ได้เสมอ ไม่มีความแตกต่างที่แท้จริงระหว่างเวลาอ่านเวลาคอมไพล์และรันไทม์ คุณสามารถรวบรวมหรือเรียกใช้รหัสในขณะที่อ่านอ่านหรือเรียกใช้รหัสในขณะที่รวบรวมและอ่านหรือรวบรวมรหัสที่รันไทม์
เสียงกระเพื่อมให้ฟังก์ชั่นการอ่านในการอ่านข้อมูลและรหัสจากข้อความโหลดไปโหลดรหัส EVAL ในการประเมินรหัส, คอมไพล์ในการรวบรวมรหัสและพิมพ์เพื่อเขียนข้อมูลและรหัสเป็นข้อความ
ฟังก์ชั่นเหล่านี้พร้อมใช้งานเสมอ พวกเขาจะไม่หายไป พวกเขาสามารถเป็นส่วนหนึ่งของโปรแกรมใด ๆ นั่นหมายความว่าโปรแกรมใด ๆ สามารถอ่านโหลดแปลหรือพิมพ์รหัสได้เสมอ
พวกเขาแตกต่างกันในภาษาเช่น C หรือ Java อย่างไร
ภาษาเหล่านั้นไม่มีสัญลักษณ์รหัสเป็นข้อมูลหรือการประเมินผลข้อมูลเป็นรหัส วัตถุข้อมูลใน C มักจะไม่ได้พิมพ์
ภาษาอื่นที่ไม่ใช่ภาษาตระกูล LISP มีโครงสร้างเหล่านี้หรือไม่?
หลายภาษามีความสามารถบางอย่างเหล่านี้
ความแตกต่าง:
ใน Lisp ความสามารถเหล่านี้ได้รับการออกแบบเป็นภาษาเพื่อให้ใช้งานง่าย