Làm cách nào tôi có thể sửa đổi trình đọc của Elisp?


12

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)'(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.


Hack các nguồn C.
wasamasa

3
Emacs Lisp không có đầu đọc lập trình Lisp.
vẽ

@wasamasa Chà, đó luôn là một lựa chọn :) Không phải là một thiết bị di động , mà là một tùy chọn.
Sean Allred

Tôi nghĩ rằng "Nhiều Lisps có điều này." không phải là một câu hỏi thực tế. Tôi rất muốn có một câu hỏi thực sự. Tôi đề nghị rút ngắn tiêu đề, và viết lại nó vào cơ thể.
YoungFrog

@YoungFrog chỉnh sửa chào mừng. Tôi không thể nghĩ bất cứ điều gì trực tiếp hoặc phù hợp hơn mà không quá lời. Câu hỏi rất đơn giản; nó không phải là dài.
Sean Allred

Câu trả lời:


11

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.


Tôi nghĩ rằng đây là về phần mềm Common Lisp sử dụng các macro đọc đặc biệt, thay vì Elisp. Trang này nói về việc chuyển mã CL sang Elisp. Và vâng, chính thức người đọc không thể tùy chỉnh, nhưng hãy xem câu trả lời của tôi bên dưới ...
mishoo

Vấn đề khác ở đây là ngay cả khi bạn bằng cách nào đó đã giới thiệu cú pháp người đọc mới, phần còn lại của Emacs không biết về nó, vì vậy bạn cũng sẽ cần khắc phục syntax.c...
wasamasa

9

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 defpackagecá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


Có lẽ tốt nhất không nên đăng bài này dưới dạng câu trả lời cho đến khi bạn thực sự triển khai một trình đọc Lisp hoàn chỉnh như bạn đề xuất (mà theo tôi đoán, đây không phải là một doanh nghiệp tầm thường).
Dân

@Dan Có thể thực hiện được, chỉ là việc thực hiện nó trong C sẽ đau đớn hơn nhiều khi nó xử lý chuỗi.
wasamasa

1
@Dan làm cho nó hoạt động, tôi chỉnh sửa câu trả lời để thêm liên kết để thực hiện.
mishoo
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.