1) Yeni bir değişken kavramı. Lisp'te tüm değişkenler etkili bir şekilde işaretçilerdir. Değerler, değişkenlere değil türlere sahip olanlardır ve değişkenleri atamak veya bağlamak, işaret ettikleri şeyi değil, işaretçileri kopyalamak anlamına gelir.
(defun print-twice (it)
(print it)
(print it))
"it" bir değişkendir. HERHANGİ bir değere bağlanabilir. Değişkenle ilişkili herhangi bir sınırlama ve tür yoktur. Fonksiyonu çağırırsanız, argümanın kopyalanmasına gerek yoktur. Değişken bir işaretçiye benzer. Değişkene bağlı değere erişmenin bir yolu vardır. Bellek ayırmaya gerek yoktur . Fonksiyonu çağırdığımızda herhangi bir veri nesnesini iletebiliriz: herhangi bir boyut ve herhangi bir tür.
Veri nesnelerinin bir 'türü' vardır ve tüm veri nesneleri, 'türü' için sorgulanabilir.
(type-of "abc") -> STRING
2) Bir sembol türü. Semboller, bir işaretçiyi karşılaştırarak eşitliği test edebilmeniz açısından dizelerden farklıdır.
Sembol, adı olan bir veri nesnesidir. Nesneyi bulmak için genellikle ad kullanılabilir:
|This is a Symbol|
this-is-also-a-symbol
(find-symbol "SIN") -> SIN
Semboller gerçek veri nesneleri olduğundan, aynı nesne olup olmadıklarını test edebiliriz:
(eq 'sin 'cos) -> NIL
(eq 'sin 'sin) -> T
Bu, örneğin sembollerle bir cümle yazmamızı sağlar:
(defvar *sentence* '(mary called tom to tell him the price of the book))
Şimdi cümledeki THE sayısını sayabiliriz:
(count 'the *sentence*) -> 2
Common Lisp'de sembollerin yalnızca bir adı yoktur, aynı zamanda bir değeri, işlevi, özellik listesi ve paketi de olabilir. Dolayısıyla, değişkenleri veya işlevleri adlandırmak için semboller kullanılabilir. Özellik listesi genellikle sembollere meta veri eklemek için kullanılır.
3) Sembol ağaçlarını kullanan kod için bir gösterim.
Lisp, kodu temsil etmek için temel veri yapılarını kullanır.
Liste (* 3 2) hem veri hem de kod olabilir:
(eval '(* 3 (+ 2 5))) -> 21
(length '(* 3 (+ 2 5))) -> 3
Ağaç:
CL-USER 8 > (sdraw '(* 3 (+ 2 5)))
[*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
* 3 [*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
+ 2 5
4) Dilin tamamı her zaman mevcuttur. Okuma zamanı, derleme zamanı ve çalışma zamanı arasında gerçek bir ayrım yoktur. Kodu okurken derleyebilir veya çalıştırabilir, derleme sırasında kodu okuyabilir veya çalıştırabilir ve çalışma zamanında kodu okuyabilir veya derleyebilirsiniz.
Lisp, metinden veri ve kod okumak için OKU, kodu yüklemek için YÜKLE, kodu değerlendirmek için EVAL, kodu derlemek için DERLE ve metne veri ve kod yazmak için YAZDIR işlevlerini sağlar.
Bu işlevler her zaman mevcuttur. Bir yere gitmiyorlar. Herhangi bir programın parçası olabilirler. Bu, herhangi bir programın her zaman kodu okuyabileceği, yükleyebileceği, değerlendirebileceği veya yazdırabileceği anlamına gelir.
C veya Java gibi dillerde nasıl farklılar?
Bu diller, veri olarak semboller, kodlar veya kod olarak verilerin çalışma zamanı değerlendirmesi sağlamaz. C'deki veri nesneleri genellikle türsüzdür.
LISP aile dillerinden başka herhangi bir dil şu anda bu yapılardan herhangi birine sahip mi?
Birçok dilde bu yeteneklerden bazıları vardır.
Fark:
Lisp'de bu yetenekler, kullanımları kolay olacak şekilde dile göre tasarlanmıştır.