LINUX.ORG.RU

Как в emacs lisp правильно динамически переопределять функции?

 ,


0

2

Раньше я писал:

(defun bar () "bar")
(defun foo () (bar))

(flet ((bar () "other bar"))
  (foo))
=> "other bar"
и это прекрасно работает. Но каждый раз при использовании этой конструкции выдает:
`flet' is an obsolete macro (as of 24.3); use either `cl-flet' or `cl-letf'.
При этом cl-flet не может переопределять функции:
(cl-flet ((bar () "other"))
  (foo))
=> "bar"



Последнее исправление: cetjs2 (всего исправлений: 1)

да, с этим там какое-то говно творится. Походу это какие-то кривости elisp'a by design вылезают.
Вобщем используй flet и не парься, имхо.

смотри


(macroexpand
'(cl-flet ((bar () «other»))
(foo)))

Bad_ptr ★★★★★
()
Ответ на: комментарий от monk
(version) => "GNU Emacs 24.2.50.1 ..." 

и в /etc/apt/sources.list:

deb     http://emacs.naquadah.org/ stable/
deb-src http://emacs.naquadah.org/ stable/
Так что у меня стабильный имакс. Без малейшего понятия, почему варнинг указывает на 24.3... может в третьей версии flet вообще исключат...

arte-at-marte
() автор топика
Ответ на: комментарий от iVS

Что они в будущем будут делать с flet неясно, но временно так:

To avoid problem with the current version of flet, you should use a function name that is not the name of a global function.

iVS ★★★★★
()

Теоретиков набежало - мама не горюй. В следующий раз выбирай имена оригинальные.

[1]> (describe 'flet)

FLET это символ FLET, находится в #<PACKAGE COMMON-LISP>, и доступен в 11 пакетах CLOS, COMMON-LISP, COMMON-LISP-USER, EXPORTING, EXT, FFI,
POSIX, READLINE, REGEXP, SCREEN, SYSTEM, именует специальный
;; connecting to "http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Data/Map_Sym.txt"...connected...HTTP/1.1 404 Not Found
;; "Date: Sun, 17 Feb 2013 20:18:37 GMT"
;; "Server: Apache/2.2.16 (Debian)"
;; "Content-Length: 333"
;; "Connection: close"
;; "Content-Type: text/html; charset=iso-8859-1"
;; ""
;; "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">"
;; "<html><head>"
;; "<title>404 Not Found</title>"
;; "</head><body>"
;; "<h1>Not Found</h1>"
;; "<p>The requested URL /projects/iiip/doc/CommonLISP/HyperSpec/Data/Map_Sym.txt was not found on this server.</p>"
;; "<hr>"
;; "<address>Apache/2.2.16 (Debian) Server at www.ai.mit.edu Port 80</address>"
;; "</body></html>"
;; connecting to "http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Data/Symbol-Table.text"...connected...HTTP/1.1 200 OK...45,322 bytes
;; SYSTEM::GET-CLHS-MAP(#<IO INPUT-BUFFERED SOCKET-STREAM CHARACTER www.ai.mit.edu:80>)...978/978 symbols
 оператор.
ANSI-CL Документация находится в
"http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/speope_fletcm_scm_macrolet.html"
;; connecting to "http://clisp.cons.org/impnotes/id-href.map"...connected...HTTP/1.1 301 Moved Permanently --> "http://www.clisp.org/impnotes/id-href.map"
;; connecting to "http://www.clisp.org/impnotes/id-href.map"...connected...HTTP/1.1 200 OK...74,297 bytes
;; SYSTEM::GET-STRING-MAP(#<IO INPUT-BUFFERED SOCKET-STREAM CHARACTER www.clisp.org:80>)...2,004 IDs
;; SYSTEM::ENSURE-IMPNOTES-MAP(#P"/usr/lib/clisp-2.49/data/Symbol-Table.text")...
ПРЕДУПРЕЖДЕНИЕ: SYSTEM::ENSURE-IMPNOTES-MAP: недопустимый идентификатор "compile-errors" для символа "EXT:SOURCE-PROGRAM-ERROR"
ПРЕДУПРЕЖДЕНИЕ: SYSTEM::ENSURE-IMPNOTES-MAP: недопустимый идентификатор "compile-errors" для символа "EXT:SOURCE-PROGRAM-ERROR-DETAIL"
ПРЕДУПРЕЖДЕНИЕ: SYSTEM::ENSURE-IMPNOTES-MAP: недопустимый идентификатор "compile-errors" для символа "EXT:SOURCE-PROGRAM-ERROR-FORM"
644 IDs

 #<PACKAGE COMMON-LISP> это пакет с именем COMMON-LISP. Его 2 псевдоним(ов) LISP, CL.
 Он импортирует внешние символы из 1 пакетов CLOS и экспортирует 978 символ(ов) в 10 пакетов READLINE, REGEXP, POSIX, EXPORTING, FFI,
 SCREEN, CLOS, COMMON-LISP-USER, EXT, SYSTEM.

 #<SPECIAL-OPERATOR FLET> это обработчик специальной формы.

ziemin ★★
()

В elisp издавна используется динамическая область видимости переменных. Во всех нормальных языках основной является статическая область видимости. В одной из недавних версий emacs'а наконец-то добавили поддержку статической области видимости переменных. Собственно, варнинг как раз про это. cl-flet, AFAIU, создает статический биндинг символа и значения; действие этого биндинга не распространяется на код, который непосредственно не лежит внутри этой формы.

Резюмируя, если вам нужно динамическое переопределение функций, то подойдет только flet. В противном случае - подумайте, как обойтись без динамического переопределения функций.

dmitry_vk ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.