Common Lisp 宏问题(遍历剩余参数)

xiao刀 发布于 2015/11/19 10:25
阅读 361
收藏 0

武汉源创会回归,4月20聊聊大模型”

运行环境:

win,sbcl,clsql

clsql  默认创建数据实例的宏是   :


(clsql:def-view-class users ()
  ((id
  :accessor id
    :db-kind :key
    :db-constraints :not-null
    :type integer
    :initarg :id )
   (name
    :accessor name
    :type (string 30)
    :initarg :name)
   (uid
    :accessor uid
    :type (string 30)
    :initarg :uid)
   (pwd
    :accessor pwd
    :type (string 100)
    :initarg :pwd))
  (:base-table users))

这个过程有点麻烦   就像创建一个 宏用来简化创建过程,本人的宏代码:

(defmacro create-database-entity-class (entity-name arg1 &rest args)
  `(clsql:def-view-class ,entity-name()
    (
      (,arg1 :accessor ,arg1  :db-kind :key :db-constraints :not-null :type integer  :initarg ,:arg1)
      (loop for arg in ,args 
      do(arg :accessor arg :type integer :initarg :arg)
        )  
    )
    (:base-table ,:entity-name)
  )
)

(create-database-entity-class users id name uid pwd)  ;使用该宏

;实例化

(defvar a (make-instance `users
                          :id 1
                          :name 12
                          :uid 123
                          :pwd 23)) 

(id a) ;问题来了   前面的部分都返回成功,但是到这里提取不到  id属性值

报错内容如下:


请各位大侠指教。。。。




加载中
0
xiao刀
xiao刀

找到错误了:

(macroexpand-1 '(create-database-entity-class users id name uid pwd))

运行以上命令跟踪宏的展开形式 发现在  ,:arg1 的部分并没有把arg1  求值   故自然访问不到id属性,

但是新的问题来了  如何才能让冒号后的arg1  求值?     对lisp宏熟悉的朋友欢迎指点。。。

0
redraiment
redraiment

虽然下面的宏可以按照你的要求工作,但我觉得没什么意义,因为你把所有字段的类型写成了 integer

(defmacro create-database-entity-class (entity primary-key &rest columns)
  `(clsql:def-view-class ,entity ()
     ((,primary-key
       :accessor ,primary-key
       :db-bind :key
       :db-constraints :not-null
       :type integer
       :initarg ,primary-key)
      ,@(mapcar (lambda (name)
                  (list name
                        :accessor name
                        :type 'integer
                        :initarg name))
                columns))))

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部