Elisp의 리더를 어떻게 수정합니까?


12

리더를 수정하면 새로운 읽기 구문 (예 : #(hash table)'(quoted))을 도입 할 수 있습니다. 많은 Lisp에는이 기능이 있지만 그러한 기능을 갖춘 시설은 없습니다.


C 소스를 해킹하십시오.
wasamasa

3
Emacs Lisp에는 Lisp 프로그래밍 가능 리더가 없습니다.
Drew

@wasamasa 글쎄, 그것은 항상 옵션입니다 :) 휴대용 옵션이 아니라 옵션입니다.
Sean Allred

나는 "많은 Lisps가 이것을 가지고 있다고 생각합니다." 실제 질문이 아닙니다. 나는 진짜 질문을하는 것을 훨씬 선호합니다. 제목을 짧게하여 본문에 다시 입력하는 것이 좋습니다.
YoungFrog

@YoungFrog 편집 환영합니다. 지나치게 말도없이 직접적이고 적절한 것을 생각할 수 없었습니다. 문제는 간단하다. 오래 걸리지 않아도됩니다.
Sean Allred

답변:


11

이 매뉴얼은 실제로 독자 매크로를 할 수 없다는 것을 암시합니다.

부록 C 포팅 공통 리스프 에 따르면 :

리더 매크로. 공통 Lisp에는 개별 문자 레벨에서 작동하는 두 번째 유형의 매크로가 포함됩니다. 예를 들어, Common Lisp는 '라는 독자 매크로에 의해 인용 표기법을 구현하는 반면, Emacs Lisp의 파서는 인용을 특수한 경우로 취급합니다. 일부 Lisp 패키지는 독자 매크로를 사용하여 Emacs 파서가 읽을 수없는 특수 구문을 작성합니다.


필자는 이것이 Elisp가 아닌 특수 리더 매크로를 사용하는 Common Lisp 소프트웨어에 관한 것이라고 생각합니다. 이 페이지는 CL 코드를 Elisp로 포팅하는 것에 관한 것입니다. 그리고 예, 공식적으로 독자는 사용자 정의 할 수 없지만 아래에서 내 대답을 참조하십시오 ...
mishoo

여기서 또 다른 문제는 어떻게 든 새로운 독자 구문을 도입했다하더라도 나머지 Emacs는이를 인식하지 못하므로 수정해야합니다 syntax.c.
wasamasa

9

분명히 할 수는 있지만 많은 작업을 준비하십시오. (아니면 주말에 처리 할 것이기 때문에 ;-).

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

이제 남은 "모두"는 Elisp가하는 모든 것과 더 원하는 것을 지원하는 완전한 Lisp 리더를 구현하는 것입니다. 나는 이것이 CL과 같은 defpackage패키지 내부 심볼 을 제공하는 데 사용될 수 있다고 생각합니다 . 또한 정규 표현식의 특수 구문은 내가 잘못하고 싶은 것입니다 (보다 정확하게는 백 슬래시를 해석하지 않는 문자열 구문).

편집 : 여기 개념 증명 구현이 있습니다 : https://github.com/mishoo/elisp-reader.el


아마 당신이 제안한대로 완전한 Lisp 판독기를 실제로 구현 한 후에야 (이것이 사소한 기업이 아니라고 생각할 때까지)이 답변으로 게시하지 않는 것이 가장 좋습니다.
Dan

@ Dan 그것은 가능하다. 단지 C에서 그것을하는 것이 문자열 처리를 위해 빨라지는 것보다 훨씬 고통 스럽다는 것이다.
wasamasa

1
@ Dan은 효과가있어 구현에 링크를 추가하기 위해 답변을 편집했습니다.
mishoo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.