Lisp 中的多个 defparameter 宏?

问题描述 投票:0回答:1

我尝试为任意数量的变量编写 defparameter 宏,从单个变量的工作代码开始:

(defmacro defpar (name initial-value )                                                  
 `(progn (declaim (special ,name))                                                    
        (setf (symbol-value ',name) ,initial-value)                                  
         ',name)

这是一个修改

(defmacro defpar (&rest rest)
  (let ((i  (gensym)))
    `(let (,i)
;;     (declaim (special ,rest))
       (dotimes (,i  (/ (length ',rest) 2))
         (progn
           (print (list ,i ',rest))
           (setf (symbol-value ',(pop rest)) ',(pop rest))
           )
         ))))

现在:

(defpar S1 1)                                                                            
(print `("S1 = " ,S1))

给予

(0 (S1 1)) 
("S1 = " 1)

可以:S1 已定义且等于 1

对于两个参数

(defpar S1 1 S2 2)                                                                    
(print `("S1 = " ,S1  " S2 = " ,S2 )) 

给予

(0 (*S1* 1 *S2* 2))
(1 (*S1* 1 *S2* 2))
....  The variable *S2* is unbound.   

正如我所检查的,rest列表在循环中的新迭代中是相同的,但我未能更新它。我错过了“特别”声明。 (declaim (special,rest)) 在 SBCL 中出现错误。让我知道是否重要。 请帮助我。也许它已经完成了,就像在 setf 中一样?

lisp common-lisp
1个回答
0
投票

(defmacro defpar (&rest varname-val-list) `(loop for (varname val) on ',varname-val-list by #'cddr collect varname do ;;(format t "~a = ~a~%" varname val) (setf (symbol-value varname) val)))

在回复中:

CL-USER>(defpar-multiple xyz 2 aaa 3)

扩展到:

© www.soinside.com 2019 - 2024. All rights reserved.