2010-09-22 24 views
5

Ví dụ, tôi vượt qua tên hàm khác chức năngLàm thế nào để gỡ bỏ một chức năng trong một defun?

(personal-function 'func-name '(attr1 attr2 ...)) 

và những gì tôi muốn làm là

(defun personal-function (func-name) 
    (defun func-name '(attr1 attr2 ...) (dosomething))) 

Tuy nhiên, nó nói rằng tôi không thể defun với một biểu tượng ... gì tôi nên làm gì?

+0

defun không đánh giá tên, danh sách hoặc cơ thể. tất cả phải là giá trị theo nghĩa đen. Vì vậy, mã của bạn có hai vấn đề.1) nó sẽ định nghĩa một hàm func-name. 2) một danh sách trích dẫn cũng sẽ không làm những gì bạn mong đợi. –

Trả lời

3

Sử dụng

(setf (symbol-function my-symbol) some-function) 

tạo một hàm mới với

(compile nil (list 'lambda args body)) 

nơi args và cơ thể có giá trị có ý nghĩa.

+0

Không thể hiểu: những gì cần sử dụng, setf hoặc biên dịch, hoặc một số kết hợp của cả hai (nó trông như thế nào sau đó?). Bạn đã không thực sự cung cấp một ví dụ về định nghĩa hàm bên trong định nghĩa hàm khác theo tinh thần ví dụ từ bài gốc. –

+0

@Artem Pelenitsyn: Trước tiên tôi sẽ tạo đối tượng hàm và sau đó đặt chức năng biểu tượng cho nó. –

1

Bạn có thể sử dụng một lambda

http://www.n-a-n-o.com/lisp/cmucl-tutorials/LISP-tutorial-21.html

Nếu bạn đang cố gắng để thực hiện một chức năng trên toàn cầu có thể truy cập mới bên trong một hàm, tôi không nghĩ rằng ngữ pháp của ngôn ngữ cho phép cho điều đó. Nếu bạn tạo một lambda, bạn có thể khởi tạo một biến cho giá trị lambda này và chuyển biến xung quanh các hàm của bạn. Trong Common LISP, bạn có thể gọi (functionp x) để xác định xem một biến là một hàm trước khi bạn cố gắng gọi nó.

+0

cảm ơn rất nhiều. Tuy nhiên, thông dịch viên của tôi nói với tôi xác định không phải là một chức năng ...? "Lỗi: cố gắng gọi' DEFINE 'là một hàm không xác định. " – Frost

+0

bạn có đang sử dụng LISP chung không? Kế hoạch? –

+0

Tôi đang sử dụng LISP phổ biến ~ – Frost

2

Giải quyết nó như sau:

e.g1

(defun create-function(a1) 
    (defun plus-function(x) (+ x a1))) 

(create-function 2) -> PLUS-FUNCTION 
(plus-function 3) ->5 

e.g2

(setf (symbol-function 'printx) #'(lambda (x) (print x))) 

(printx '(1 2 3)) -> (1 2 3) 

Trước đây tôi cũng có cùng một vấn đề khi tôi định nghĩa hàm.

Ví dụ:

(defun test-function(fn) 
      (defun fn ((lambda() (print "aaa"))))) 

Sau khi tôi chạy

(test-function 'aaafunction) 

Kết quả đánh giá là

FN 

Nó không trả về một hàm có tên là "aaafunction" ...

Để perso n người downvote câu trả lời của tôi: Chúng tôi là người mới của Lisp, nhưng chúng tôi đang làm việc chăm chỉ để tìm hiểu kiến ​​thức, và bạn không phải là quá tôn trọng.

+0

'defun' trả về tên hàm, không phải hàm: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_defun.html – Ken

+0

defun không đánh giá tên –

+0

Vậy làm thế nào thế nào để tôi buộc nó để đánh giá này "fn"? –

0

Tôi sử dụng defmacros để lập trình meta, ví dụ: this ví dụ về emacs lisp.

0

Sử dụng macro sẽ là lựa chọn tốt. chẳng hạn như (chức năng cá nhân defmacro (func-name) `(defun, func-name '(attr1 attr2 ...) (dosomething))) hãy thử, hy vọng sẽ giúp bạn.

Các vấn đề liên quan