开发者社区> 问答> 正文

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

运行环境:

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属性值

报错内容如下:


请各位大侠指教。。。。




展开
收起
爱吃鱼的程序员 2020-06-10 10:56:09 460 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    找到错误了:

    (macroexpand-1'(create-database-entity-classusersidnameuidpwd))

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

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

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

    (defmacrocreate-database-entity-class(entityprimary-key&restcolumns)`(clsql:def-view-class,entity()((,primary-key:accessor,primary-key:db-bind:key:db-constraints:not-null:typeinteger:initarg,primary-key),@(mapcar(lambda(name)(listname:accessorname:type'integer:initargname))columns))))

    2020-06-10 10:56:26
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载