LINUX.ORG.RU

defmacro -> defun

 


1

1

Допустим есть такой макрос:

(defmacro macro-test (alist ab &body body)
  `(loop for ,ab on ,alist
      do ,@body))

(macro-test '(a b c d) (a b) (format t "~s ~s~%" a b))
;; Выводит:
;; A B
;; B C
;; C D
;; D NIL
Можно ли как-то выразить тоже самое с помощью функции?
Пробовал так(не работает):
(defun defun-test (alist ab &rest body)
  (loop for ab on alist
     do (eval (cons 'progn body))))

(defun-test '(a b c d) '(a b) '(format t "~s ~s~%" a b))
;; Выдаёт:
;; Evaluation aborted on #<UNBOUND-VARIABLE A {10053A75D3}>.
Или нельзя?
// Просто интересно в качестве сферического коня в вакууме. Не надо спрашивать зачем оно мне нужно на практике :).

★★★★

Если ради сферического коня, то нельзя, ибо тебе нужно лексическое связывание переменных. А так, как ты сам знаешь, фигней занимаешься. Я бы, например, лучше макрос iter подучил. Если мне не изменяет память, то там можно писать так:

(iter (for (a b) on '(a b c d))
      (format t "~S ~S~%" a b))

Макрос iter более дружественен к лисперам, чем стандартный loop, ибо в первом больше скобочек :) На самом деле, не только по этому, но и поэтому тоже.

dave ★★★★★ ()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Кстати, хорошее упражнение - научиться работать с системами asdf. Самый простой способ - через QuickLisp [http://www.quicklisp.org/]. Там все настолько просто, что когда установишь QuickLisp, достаточно будет набрать:

(ql:quickload "iterate")

Ну, еще нужно будет подключить пакет iter как-то так:

(defpackage my-puper-package (:use :cl :iter))

(in-package :my-puper-package)

Правда, я сам QuickLisp использую редко - только для обновления библиотек. Но это - очень хорошая штука. И тогда макрос iter ничем не будет отличаться от стандартного loop :)

dave ★★★★★ ()
Ответ на: комментарий от ados

Это уже запрещенный прием. Не надо плохому учить :)

dave ★★★★★ ()
Ответ на: комментарий от ados

нафига тебе это надо?

Ну я же просил без этого. :-) Так просто, разминка для ума.

Bad_ptr ★★★★ ()
Ответ на: комментарий от ados

Ну а коль пошёл такой разговор, то хотелось бы узнать почему и как оно работает, а вариант из стартового поста не работает.

Bad_ptr ★★★★ ()
Ответ на: комментарий от Bad_ptr

Т.е. во что здесь разворачивается и компилируется забэкквоченый лист. И как оно захватывает переменные внутрь eval'a.

Bad_ptr ★★★★ ()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.