运行环境:
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属性值
报错内容如下:
请各位大侠指教。。。。
找到错误了:
(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))))版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。