Nếu bạn muốn tìm hiểu một số thông tin cơ bản cũ hơn của Lisp, thì Emacs Lisp vẫn ổn.
Emacs Lisp: có thể được sử dụng trong Emacs. Môi trường phát triển bao gồm. Phương ngữ cũ hơn của dòng chính Lisp. Thiếu rất nhiều khái niệm. Có nhiều phần mở rộng cho lập trình soạn thảo. Lisp và Emacs Lisp thường chia sẻ một số di sản trực tiếp (đặt tên, khái niệm, ...).
Lisp thông thường. Rất nhiều sách hay để học hỏi. Rất nhiều khái niệm Lisp (bao gồm lập trình OO) có thể học được với Common Lisp. Rat khuyen khich. Lisp thường có các cơ sở Lisp quan trọng nhất được xây dựng trong và các thư viện cung cấp phần còn lại. Có một lượng lớn thứ có thể học được xung quanh nó.
Đề án: phương ngữ Lisp khác nhau được tạo trong thập niên 70. Không tương thích trực tiếp với Emacs Lisp hoặc Common Lisp. Rất nhiều sách hay và tài liệu hướng dẫn khác. Rất khuyến khích cho việc học cơ bản Lisp và một số điều cao cấp hơn. Bạn càng đào sâu vào Scheme thì nó càng khác với Emacs Lisp hoặc thậm chí là Common Lisp.
Clojure: phương ngữ Lisp rất khác. Không tương thích với Common Lisp, Emacs Lisp hoặc Scheme. Chia sẻ một số khái niệm, một số khái niệm hoạt động khác nhau. Nhưng quyển sách tốt. Đề nghị nếu bạn muốn tìm hiểu một số Lisp hoặc Clojure đặc biệt. Clojure nhấn mạnh vào lập trình chức năng và đồng thời - các chủ đề rất có liên quan.
Nếu bạn muốn tìm hiểu Lisp chủ đạo hơn (một Lisp rằng với một cái nhìn và cảm nhận của một phương ngữ Lisp điển hình), tôi muốn giới thiệu Common Lisp hoặc Đề án.
tuỳ chọn ngôn ngữ của tôi cho việc học Lisp sẽ được (!):
- Common Lisp
- Scheme
- Clojure
- Emacs Lisp
Để cung cấp cho bạn một ví dụ:
Đây là hàm COLLAPSE
từ Lispy của McCarthy, được viết vào năm 1960 (từ Lisp I Programmer's manual, 1960, trang 101). Đó là cơ bản những gì trong nhiều bài tập Lisp là chức năng FLATTEN
. Nó lấy một danh sách lồng nhau và trả về một danh sách mới với các nguyên tử trong một danh sách duy nhất.
DEFINE
(((COLLAPSE,(LAMBDA,(L),(COND,
((ATOM,L),(CONS,L,NIL))
((NULL,(CDR,L)),
(COND,((ATOM,(CAR,L)),L),(T,(COLLAPSE,(CAR,L)))))
(T,(APPEND,(COLLAPSE,(CAR,L)),(COLLAPSE,(CDR,L)))))
))))))
Đây là phiên bản Common Lisp. Bạn có thể giữ nó trong chữ hoa hoặc chuyển đổi nó thành chữ thường. Cả hai đều hoạt động.
(DEFUN COLLAPSE (L)
(COND
((ATOM L) (CONS L NIL))
((NULL (CDR L))
(COND ((ATOM (CAR L)) L)
(T (COLLAPSE (CAR L)))))
(T (APPEND (COLLAPSE (CAR L))
(COLLAPSE (CDR L))))))
Về cơ bản, nó giống nhau. Chỉ có biểu mẫu để xác định hàm có tên và cú pháp khác. Nếu không, mã hoàn toàn giống nhau.
Hãy thử ví dụ McCarthy trong Common Lisp:
CL-USER > (COLLAPSE '(((A B) ((C))) ((D (E F)) (G) ((H)))))
(A B C D E F G H)
Nó chạy.
Bây giờ, hãy thử trong Emacs Lisp, sử dụng GNU Emacs. Emacs Lisp có định danh chữ thường:
ELISP> (defun collapse (l)
(cond
((atom l) (cons l nil))
((null (cdr l))
(cond ((atom (car l)) l)
(t (collapse (car l)))))
(t (append (collapse (car l))
(collapse (cdr l))))))
ELISP> (collapse '(((a b) ((c))) ((d (e f)) (g) ((h)))))
(a b c d e f g h)
Nó chạy trong Emacs Lisp mà không cần thay đổi.
Bạn có thể nhận các phiên bản tương tự như trong Đề án (các lần đổi mới nhỏ):.
đây trong Petite Chez Scheme:
> (define collapse
(lambda (l)
(cond
((atom? l) (cons l '()))
((null? (cdr l))
(cond ((atom? (car l)) l)
(else (collapse (car l)))))
(else (append (collapse (car l))
(collapse (cdr l)))))))
Chúng ta có thể sử dụng DEFINE
để xác định một hàm. COND
trông hơi khác một chút. ()
là danh sách trống. Những người có dự án được thêm ?
.
> (collapse '(((a b) ((c))) ((d (e f)) (g) ((h)))))
(a b c d e f g h)
Chạy.
Trong Clojure nó sẽ trông khác nhau. Về cơ bản bạn phải suy nghĩ lại nhiều mã.
Đây là thực hiện riêng Clojure của flatten
:
(defn flatten
[x]
(filter (complement sequential?)
(rest (tree-seq sequential? seq x))))
Bạn có thể viết một flatten
trong tinh thần của phiên bản Lisp - nó vẫn sẽ trông khác nhau.
Từ rosetta.org:
(defn flatten [coll]
(lazy-seq
(when-let [s (seq coll)]
(if (coll? (first s))
(concat (flatten (first s)) (flatten (rest s)))
(cons (first s) (flatten (rest s)))))))
tên khác nhau, cú pháp là khác nhau, ngữ nghĩa là khác nhau (hoạt động trên các chuỗi lười biếng thay vì danh sách).
Các phương ngữ như Common Lisp, Emacs Lisp, Visual Lisp, ISLISP và những người khác cố gắng giữ cho di sản.
Các phương ngữ như Đề án hoặc Clojure cảm thấy không bị ràng buộc với tên và cú pháp. Họ đổi mới theo nhiều hướng khác nhau. Đề án vẫn cung cấp các phiên bản trực tiếp của chức năng cũ. Clojure thì không. Các lập trình viên Clojure sẽ không coi đây là một bất lợi.
* Thực hiện * Lisp của bạn chắc chắn sẽ giúp ích trong việc học các Lisps khác. –