Trừ khi bạn có nhiều kinh nghiệm hơn, tôi đề nghị bạn nên viết Lisp trong Lisp, chứ không phải cách viết Haskell trong Lisp. Sau này không phải là một ý tưởng tốt. Haskell hoạt động rất khác nhau.
Lisp không thực hiện bất kỳ 'currying' (hoặc schönfinkeling ;-)) nào.
Bạn có thể viết nó như:
CL-USER 5 > (defun curry (fn arg) (lambda (&rest args) (apply fn arg args)))
CURRY
CL-USER 6 > (mapcar (curry #'expt 2) '(2 3 4 5 6))
(4 8 16 32 64)
Nó chi phí một hiệu quả chút như vậy, mặc dù.
CL-USER 7 > (mapcar (lambda (base) (expt base 2)) '(2 3 4 5 6))
(4 8 16 32 64)
Cá nhân tôi thích cái sau hơn, bởi vì tôi có tên thật có thể đọc được cho biến. Điều này giúp trong một trình gỡ lỗi, nơi tôi nhìn thấy sau đó một backtrace. Các công cụ như thế này có lẽ quan trọng hơn trong Lisp, hơn là trong Haskell.
CL-USER 12 > (mapcar (lambda (base) (expt base 2)) '(2 3 "four" 5 6))
lỗi. Hãy nhìn vào backtrace:
CL-USER 12 : 1 > :bb
...
Condition: In EXPT of ("four" 2) arguments should be of type NUMBER.
Call to SYSTEM::ARGS-TO-BINARY-ARITHMETIC-FN-NOT-OF-TYPE {offset 189}
SYSTEM::FN-NAME : EXPT
SYSTEM::ARG1 : "four"
SYSTEM::ARG2 : 2
TYPE {Closing} : NUMBER
Interpreted call to (SUBFUNCTION :ANONYMOUS SYSTEM::ANONYMOUS-LAMBDA):
BASE : "four"
Bây giờ tôi có thể thấy rằng điều đó có tên. Tôi đã chuyển chuỗi "four"
đến hàm có biến có tên là base
.
Phát triển tương tác với REPL và công cụ gỡ lỗi là phổ biến. Tốt nhất chuẩn bị mã để có ích cho phong cách phát triển này. Lisp thường không được tối ưu hóa để cung cấp các trình biên dịch chương trình đầy đủ với việc kiểm tra kiểu mở rộng - như trong Haskell.
Một trong những vấn đề chính của Lisp là rất khó để tìm hiểu xem một đoạn mã thực sự là gì. Mặc định (các chương trình chức năng nghiêm ngặt với cú pháp tiền tố) tương đối dễ hiểu. Nhưng có nhiều khả năng để thay đổi ý nghĩa của mã trong Lisp (macro, đọc macro, macro biểu tượng, giao thức Meta Object, tư vấn, ...).
Quy tắc đầu tiên: nếu bạn đang viết mã Lisp cơ bản, hãy tuân thủ các khả năng cú pháp và ngữ nghĩa cơ bản. Viết phòng thủ. Mong rằng ai đó cần hiểu mã. Cho rằng mã nên dễ đọc, dễ hiểu, sử dụng các thành ngữ phổ biến và nó nên được debuggable.
Trong Haskell nhiều người có nền toán học muốn viết mã theo một cách rất nhỏ gọn với mức trừu tượng cao. Bạn cũng có thể làm điều đó trong Lisp. Nhưng đối với mã thông thường tôi sẽ không đi con đường đó và cho các đoạn mã lớn hơn, Lisp thường sử dụng các cơ chế khác (chuyển đổi mã thông qua các macro, ...).
Vâng, tôi có nghĩa là ngắn gọn ... Tôi vẫn còn khá mới với CL mặc dù và sẽ không có ý tưởng bắt đầu từ đâu, tôi chỉ chạm vào những điều cơ bản về macro. @downvoter - quan tâm để nhận xét? – jaymmer
@wvxvw Tôi không hiểu điểm đầu tiên của nhận xét của bạn. Liệu nó có thể không được giả định rằng nếu OP sử dụng một bộ mô tả chủ quan như 'súc tích' rằng người đó đang nói một ý kiến? –
Về những thứ mà "... có thể được hiển thị thường xuyên ...", tôi sẽ quan tâm đến một trích dẫn nếu bạn có. Hơn nữa nó xảy ra với tôi mà một trong những ví dụ của bạn là ngắn gọn hơn khả năng phụ thuộc vào nền tảng của khán giả. Nếu một người không có nền tảng toán học nào, tôi nghi ngờ ví dụ đầu tiên được hiểu nhanh hơn và dễ dàng hơn. Ngoài tất cả những điều đó, _it là ý kiến của tôi, rằng mức độ này là sự cân bằng, gây hại đến chức năng và mục đích của diễn đàn này. –