我想看看是否可以将Racket结构字段映射到DB中的列。
我已经想出如何使用第四个返回值从PLT方案中的结构中提取访问器函数:
(struct-type-info)
但是返回的过程使用整数索引到struct中。有没有什么方法可以找出字段名称的定义?查看文档后,似乎在定义结构后“遗忘”此信息,并且仅通过生成的访问者函数存在:(<id>-<field-id> s)
。
所以我可以想到两种可能的解决方案:
答案 0 :(得分:3)
我认为2的方法是正确的方法(define-struct有很多旋钮,而且很多没有意义)但是不要制作哈希,只需将宏扩展为函数即可直接操纵数据库。语法/结构库可以帮助您解析define-struct表单。
答案 1 :(得分:2)
答案取决于您对此信息的处理方式。问题是它没有保存在运行时中 - 它就像在运行时不存在的函数中的绑定一样。但它们确实存在于语法级别(=编译时)。例如,这个愚蠢的例子将显示在包含结构形状的语法级别保留的值:
> (define-struct foo (x y))
> (define-syntax x (begin (syntax-local-value #'foo) 1))
> (define-syntax x (begin (printf ">>> ~s\n" (syntax-local-value #'foo)) 1))
>>> #<checked-struct-info>
当然,它没有显示太多,但这应该是一个好的开始(您可以在文档和代码中查找struct-info
)。但这可能不是您正在寻找的,因为此信息仅在语法级别 。如果你想在运行时存在某些东西,那么你最好还是使用alist或hash表?
更新(我之前对你的问题进行了快速浏览):
要将结构体映射到数据库表行,您需要定义更多内容:至少保留数据库及其代表的字段,可能是一个开放的数据库连接,用于将值存储到或读取值。因此,在我看来,最好的方法就是通过宏来实现 - 这个宏会扩展为使用define-struct
以及你需要保留的所有其他内容。