cuốn sách gpt4 ai đã làm

macro - Macro gọi hàm hoạt động trong trình thông dịch, không thành công trong trình biên dịch (SBCL + CMUCL)

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 18:45:27 25 4
mua khóa gpt4 Nike

giống một câu hỏi liên quan đến macro mà tôi mới đăng lên SO Như đã đề xuất trong, tôi đã viết một macro có tên là "nhanh" bằng cách gọi một hàm (đây là mã độc lập trong Pastebin) :

(defun main()
(chương trình
(định dạng "~A~%" (+ 1 2 (* 3 4) (+ 5 (- 8 6))))
(định dạng t "~A~%" (nhanh (+ 1 2 (* 3 4) (+ 5 (- 8 6)))))))

Điều này áp dụng cho REPL theo SBCL và CMUCL:

$sbcl
Đây là SBCL 1.0.52, một triển khai của ANSI Common Lisp.
...
* (tải "bug.cl")
hai mươi hai
hai mươi hai

$

Thật không may, mã không còn biên dịch nữa:

$sbcl
Đây là SBCL 1.0.52, một triển khai của ANSI Common Lisp.
...
* (biên dịch tập tin "bug.cl")
...
; trong quá trình mở rộng macro của (FAST (+ 1 2 ...)). Sử dụng *BREAK-ON-TÍN HIỆU* để
; chặn:
;
; Hàm COMMON-LISP-USER::CLONE không được xác định.

Có vẻ như bằng cách yêu cầu macro của tôi gọi một hàm "nhanh chóng" vào thời gian biên dịch ("bản sao", "hoạt động-p"), tôi đã gây ra sự cố trong trình biên dịch Lisp (được xác minh trong cả CMUCL và SBCL).

Bạn có ý tưởng nào về những gì tôi đang làm sai và/hoặc cách khắc phục điều này không?

câu trả lời hay nhất

Một số nhận xét về mã của bạn.

  • Nhiều bài kiểm tra đẳng thức của một đối tượng có thể được thực hiện bằng cách sử dụngTHÀNH VIÊN

    thay thế
  • Dấu phẩy ngược theo sau là dấu phẩy không có tác dụng. Bạn có thể xóa nó.

  • Bạn có thể đảm bảo rằng các hàm của mình có sẵn cho macro bằng cách: a) di chuyển các hàm này sang một tệp đính kèm và biên dịch/tải tệp đó trước khi sử dụng macro, b) sử dụng ĐÁNH GIÁ- KHI NÀOThông báo cho trình biên dịch đánh giá định nghĩa của hàm hoặc thêm hàm dưới dạng hàm cục bộ vào macro thông qua c)

例子:

(defmacro nhanh (&rest sexpr)
(nhãn ((hoạt động-p (x)
(thành viên x'(+ - * /)))
(bản sao (sexpr)
(nếu (consp sexpr)
(phá hủy-liên kết (đầu . đuôi) sexpr
(nếu (đầu hoạt động-p)
`(the fixnum (,head ,@(đuôi bản sao)))
(nhược điểm (đầu nhân bản) (đuôi nhân bản))))
sexpr)))
(xe hơi (bản sao sexpr))))

Xin lưu ý rằng điều này khác với NHANH Cả hai phiên bản đều không phải là một trình đi bộ mã hoàn chỉnh. Chúng chỉ nhận ra các lệnh gọi hàm đơn giản (không nhận ra các cấu trúc Lisp khác như LAMBDA, LET, FLET, LABELS, v.v.).

Về macro - các hàm gọi macro hoạt động trong trình thông dịch nhưng không thành công trong trình biên dịch (SBCL + CMUCL), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/8138714/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress