LINUX.ORG.RU

[CL] помогите с макросом


0

0

(defun f (a) (identity a))

(defmacro test (v1 lst ll)
  (with-gensyms (x)
    `(let ((,x ,(f ll)))
       (progn ,@(mapcar #'(lambda (a)
                            `(list ,a ,x 
                                   ,x ,v1)) lst))))))

;; работает так

CL-USER> (macroexpand '(test a (1 2 3) b))

(LET ((#:G1293 B))
  (PROGN
   (LIST 1 #:G1293 #:G1293 A)
   (LIST 2 #:G1293 #:G1293 A)
   (LIST 3 #:G1293 #:G1293 A)))

;; а нужно

(PROGN 
   (LIST 1 B B A) 
   (LIST 2 B B A) 
   (LIST 3 B B A))

Ответ на: комментарий от pseudo-cat

нет, мне нужно именно с параметром + gensym. в оригинале f не чистая и её нужно только один раз вызывать.

ASTRALIS
() автор топика
(defun f (a) (identity a))

(defmacro test (v1 lst ll)
  (let ((f-ll (f ll)))
    `(progn ,@(mapcar #'(lambda (a)
                          `(list ,a ,f-ll
                                 ,f-ll ,v1)) lst))))

(macroexpand '(test a (1 2 3) b))

=>

(PROGN (LIST 1 B B A) (LIST 2 B B A) (LIST 3 B B A))
dmitry_vk ★★★
()

а мне вот нихрена не понятно сочетание progn и трех вызовов list.
куда первые два результата деваются?

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