LINUX.ORG.RU

[emacs] lambda -> cut


0

1

Может кому пригодится.

Чуть изменил http://paste.lisp.org/display/70281 под elisp:

(defmacro* cut (&body body)
  "Scheme's cut macro 
   http://srfi.schemers.org/srfi-26/srfi-26.html"
  (let* ((form body)
         (args (loop for p from 1 to (count '<> form)
                     collect (intern (format "G%d" p))))
         (rest (eq (car (last form)) '<...>))
         (gs   (gensym)))
    `(lambda ,(if rest `(,@args &rest ,gs) args)
       ,(append
         (when rest `(apply ',(pop form)))
         (loop for i in form
               collect (case i
                         ('<> (pop args))
                         ('<...> gs)
                         (otherwise i)))))))

(mapcar (cut * 2 <>) (number-sequence 1 5)) --> (2 4 6 8 10)

Для краткости `define-key' можно ещe (но здесь ничего интересного):

(defmacro cuti (&body body)
  `(lambda () (interactive) ,body))

Вестимо можно добавить поддержку (interactive «p») etc., скажем через <p>, но, судя по моему конфигу необходимость слабая.

ps... cut - макрос из схемы (srfi-42), на paste.lisp.org - адапатция для лиспа, в отличие от схемы не работает ((cut * 2 <>) 5)

★★

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