Cân nhắc javascript này:Bạn có thể chỉ cho tôi cách viết lại các hàm trong lisp không?
function addX(n)
{
return 3 + n;
}
alert(addX(6)); //alerts 9
eval('var newFunc = ' + addX.toString().replace("3", "5") + ';');
alert(newFunc(10)); //alert 15
Vui lòng bỏ qua thực tế là nó sử dụng đáng ngờ và phương pháp, nguy hiểm, khó theo dõi trong một codebase lớn, và vân vân. Nó cho phép bạn sửa đổi các chức năng, trên bay, dựa trên đầu vào từ người sử dụng. Tôi không thể chứng minh điều đó, nhưng tôi cũng dễ dàng như vậy.
Tôi hy vọng bạn có thể chỉ cho tôi cách thực hiện điều này trong lisp. Tôi đã đọc rất nhiều hướng dẫn, đọc rất nhiều về macro, asked a broader question, đã thử rất nhiều thứ nhưng cuối cùng đã xuất hiện ngắn.
Tôi muốn biết làm thế nào, trong lisp, tôi có thể sửa đổi chức năng này tại thời gian chạy để thay thế thêm 5. Hoặc bất cứ điều gì khác người dùng có thể nhập.
(define (addX n)
(+ 3 n))
Tôi không tìm kiếm currying! Tôi biết tôi có thể làm điều này:
(define addXCurry
(lambda (x)
(lambda (n)
(+ x n))))
(define add5 (addXCurry 5))
(add5 10)
Nhưng điều này đang tạo ra một nhà máy chức năng.
Tôi đang sử dụng một ví dụ đơn giản bởi vì tôi muốn hoàn toàn hiểu được cách khó khăn trên một cái gì đó đơn giản, đủ.
Sửa Cảm ơn tất cả các bạn cho câu trả lời của bạn. Tôi đoán rằng việc gác máy lớn của tôi xung quanh các macro (như tôi đã hiểu), là tôi chưa từng thấy một sự tách biệt hoàn toàn với sự sửa đổi từ văn bản. Ví dụ javascript rất đơn giản - nhưng bạn có thể thực hiện các tác vụ viết lại phức tạp hơn dựa trên đầu vào của người dùng.
Các macro tôi đã xem đều dựa trên "thời gian biên dịch" (hoặc thời gian viết lập trình giả định). Giống như trong C++ bạn không thể có tham số mẫu động - nó phải được biết tại thời gian biên dịch.
(Có vẻ như) Trong lisp bạn không thể thay đổi một cách cơ bản một thủ tục tại thời gian chạy theo cách bạn có thể trong javascript vì bạn đã mất nguồn. Bạn có thể eval và xác định lại nó, nhưng bạn không thể lặp qua các phần tử của danh sách (danh sách là định nghĩa hàm), kiểm tra từng phần tử và quyết định có thay đổi hay không. Ngoại lệ này có vẻ là những ví dụ trong câu trả lời của Rainer, đó là mặt đất run rẩy.
http://stackoverflow.com/q/16380479/849891 là về cách nó được thực hiện trong Lisp một cách thích hợp, AFAIK - với đóng cửa, làm cho các chức năng vào các đối tượng đáp ứng với thông điệp: '(fun 'call args ...) 'hoặc' (fun 'reset-x-to 5) '(hoặc, trong C, sử dụng các biến tĩnh bên trong các hàm). Và không, về cơ bản nó không phải là về cà ri, thậm chí nếu nó có thể được thực hiện với một cú pháp, hời hợt, hời hợt. –