Làm thế nào để vượt qua chức năng như đối số trong elisp


8

Tôi đang đọc SICP gần đây để học lập trình lisp.

Có một ví dụ trong cuốn sách để tổng hợp hàm cấp cao như dưới đây.

 (define (sum term a next b)
   ...
   (term a)
   ...
   (next a)
   ...

Trong chức năng này, hạntiếp theo là các chức năng.

Tôi muốn viết cùng một chức năng trong elisp như thế này.

 (defun sum (term a next b)
    ....
    (funcall term a)
    ...
    (func next a)
    ....

Sau đó, tôi xác định một số hàm kiểm tra để kiểm tra tổng

 (defun inc-test (x) (+ x 1))

 sum inc-test 1 inc-test 10 

nhưng nó hiển thị các lỗi như thế này: Hàm không hợp lệ: inc-test

Khi tôi chưa quen với elisp, có ai có thể gọi cho tôi cách khắc phục không? rất cảm kích


Bạn gọi sumthế nào
Dân

Xin chào, thêm ví dụ gọi điện thoại
Luis404

3
Emacs Lisp có hai tên gọi cho hàm và cho biến. Điều này có nghĩa là inc-testtrong ví dụ cuối cùng của bạn được sử dụng như một biến, nhưng không được định nghĩa là một biến (nó là một hàm). Bạn cần chuyển một ký hiệu hoặc tham chiếu hàm tới funcall. Do đó, một cách sửa mã của bạn là vượt qua nó 'inc-testthay vì inc-test(lưu ý trích dẫn).
wvxvw

ý bạn là thế này: sum 'inc-test 1' inc-test 10 ??? gặp lỗi này: cách sử dụng: sum: (HẠN A TIẾP THEO B)
Luis404

3
Hai không gian tên và một vấn đề là một trong những khác biệt lớn giữa elisp và lisp chung trên một mặt và mặt khác. Bạn chắc chắn sẽ bị nhầm lẫn nếu bạn đọc SICP và thực hành trong một lisp-2 (như loại có không gian tên riêng cho các biến và hàm được gọi). Có lẽ bạn nên có một triển khai chương trình thực tế để chơi với?
Harald Hanche-Olsen

Câu trả lời:


6

Để tóm tắt lại những gì trong các bình luận, funcallbỏ qua đối số của nó (chỉ cần truy cập vào đối số). Và trước đó, chúng ta cũng cần đảm bảo rằng chúng ta không cố gắng đánh giá hoặc truy cập giá trị của tham số tên hàm được truyền trong lệnh gọi đến hàm.

Do đó, một câu trả lời chấp nhận được dường như là:

(defun sum (term a next b)
    (funcall term a)
    (funcall next a))

(defun inc-test (x) (+ x 1))

(sum 'inc-test 1 'inc-test 10 )

Hoặc về cơ bản gọi với 'inc-testhoặc (quote inctest)hơn inc-test.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.