Sửa đổi trình đọc sẽ cho phép giới thiệu cú pháp đọc mới (chẳng hạn như #(hash table)
và '(quoted)
). Nhiều Lisps có khả năng này, nhưng dường như không có cơ sở nào như vậy tồn tại cho elisp.
Sửa đổi trình đọc sẽ cho phép giới thiệu cú pháp đọc mới (chẳng hạn như #(hash table)
và '(quoted)
). Nhiều Lisps có khả năng này, nhưng dường như không có cơ sở nào như vậy tồn tại cho elisp.
Câu trả lời:
Hóa ra hướng dẫn sử dụng ngụ ý rằng bạn thực sự không thể thực hiện các macro đọc.
Theo Phụ lục C Cổng chung Lisp :
Đầu đọc macro. Lisp thông thường bao gồm một loại macro thứ hai hoạt động ở cấp độ của các ký tự riêng lẻ. Ví dụ: Common Lisp triển khai ký hiệu trích dẫn bởi macro người đọc có tên ', trong khi trình phân tích cú pháp của Emacs Lisp chỉ coi trích dẫn là trường hợp đặc biệt. Một số gói Lisp sử dụng macro đọc để tạo các cú pháp đặc biệt cho chính chúng, mà trình phân tích cú pháp Emacs không có khả năng đọc.
syntax.c
...
Rõ ràng nó có thể được thực hiện, nhưng chuẩn bị cho rất nhiều công việc. (hoặc không, bởi vì tôi sẽ giải quyết nó vào cuối tuần ;-).
(defvar *orig-read* (symbol-function 'read))
(defun read (&optional in)
(message "reading from %s" load-file-name)
(funcall *orig-read* in))
(setq load-read-function (symbol-function 'read))
Bây giờ "tất cả" còn lại phải làm là triển khai một trình đọc Lisp hoàn chỉnh hỗ trợ mọi thứ mà Elisp làm và bất cứ điều gì bạn muốn nhiều hơn nữa. Tôi nghĩ rằng điều này có thể được sử dụng để cung cấp defpackage
các biểu tượng bên trong giống như CL và gói, như một ví dụ. Ngoài ra, một cú pháp đặc biệt cho biểu thức chính là điều tôi rất muốn làm (hay chính xác hơn là một số cú pháp chuỗi không diễn giải dấu gạch chéo ngược).
Chỉnh sửa: đây là một triển khai bằng chứng về khái niệm: https://github.com/mishoo/elisp-reader.el