Elisp'in okuyucusunu nasıl değiştirebilirim?


12

Okuyucunun değiştirilmesi, yeni okuma sözdiziminin ( #(hash table)ve gibi '(quoted)) kullanılmasına izin verecektir . Birçok Lisps bu yeteneğe sahiptir, ancak elisp için böyle bir tesis mevcut değildir.


C kaynaklarını kesmek.
wasamasa

3
Emacs Lisp'de Lisp programlanabilir bir okuyucu yoktur.
Drew

@wasamasa Eh, bu her zaman bir seçenek :) Taşınabilir bir seçenek değil , bir seçenek.
Sean Allred

Bence "Birçok Lisps buna sahip." gerçek bir soru değil. Gerçek bir soru sormayı çok isterim. Başlığı kısaltmanızı ve vücuda yeniden yazmanızı öneririm.
YoungFrog

@ YoungFrog düzenlemeleri hoş geldiniz. Aşırı endişelenmeden daha doğrudan veya uygun bir şey düşünemedim. Soru basit; uzun olması gerekmiyor.
Sean Allred

Yanıtlar:


11

Kılavuzun, okuyucu makroları gerçekten yapamayacağınızı ima ettiği ortaya çıkıyor.

Göre Ek C nabilirli¤i Common Lisp :

Okuyucu makroları. Ortak Lisp, tek tek karakterler düzeyinde çalışan ikinci bir makro türü içerir. Örneğin, Common Lisp alıntı gösterimini 'adlı bir okuyucu makrosu tarafından uygularken Emacs Lisp ayrıştırıcısı alıntıyı sadece özel bir durum olarak ele alır. Bazı Lisp paketleri, Emacs ayrıştırıcısının okuyamayacağı özel sözdizimleri oluşturmak için okuyucu makrolarını kullanır.


Bunun Elisp yerine özel okuyucu makroları kullanan Common Lisp yazılımı ile ilgili olduğunu düşünüyorum. Sayfa CL kodunu Elisp'e taşımakla ilgilidir. Ve evet, resmi olarak okuyucu özelleştirilebilir değil, ama aşağıdaki cevabımı gör ...
mishoo

Buradaki diğer sorun, bir şekilde yeni okuyucu sözdizimi tanıtmış olsanız bile syntax.c,
Emacs'ın

9

Görünüşe göre yapılabilir, ancak çok fazla çalışmaya hazır olun. (ya da yapma, çünkü bunu haftasonu halledeceğim ;-).

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

Şimdi geriye kalan "hepsi", Elisp'in yaptığı her şeyi ve daha fazlasını istediğinizi destekleyen eksiksiz bir Lisp okuyucu uygulamaktır. Bunun defpackagebir örnek olarak CL benzeri ve paket iç sembolleri sağlamak için kullanılabileceğini düşünüyorum . Ayrıca, normal ifadeler için özel bir sözdizimi kötü yapmak istediğim bir şeydir (veya daha doğrusu ters eğik çizgileri yorumlamayan bazı dize sözdizimi).

Düzenleme: İşte bir kavram kanıtı uygulaması: https://github.com/mishoo/elisp-reader.el


Muhtemelen, tam olarak önerdiğiniz gibi tam bir Lisp okuyucu uygulayana kadar bir cevap olarak göndermemelisiniz (tahmin ediyorum, önemsiz bir girişim değildir).
Dan

@Dan Bu yapılabilir, sadece C'de yapmak dize işleme için berbat olduğu için çok daha acı verici.
wasamasa

1
@Dan işe yaradı, uygulamaya bağlantı eklemek için cevabı düzenledim.
mishoo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.