球拍:从结构中提取场ID

时间:2010-05-30 22:28:47

标签: struct reflection racket

我想看看是否可以将Racket结构字段映射到DB中的列。

我已经想出如何使用第四个返回值从PLT方案中的结构中提取访问器函数:

(struct-type-info)

但是返回的过程使用整数索引到struct中。有没有什么方法可以找出字段名称的定义?查看文档后,似乎在定义结构后“遗忘”此信息,并且仅通过生成的访问者函数存在:(<id>-<field-id> s)

所以我可以想到两种可能的解决方案:

  1. 在命名空间符号中搜索以我的结构名称(yuk);
  2. 开头的符号
  3. 定义一个自定义的define-struct宏,该宏捕获由struct name(eek)键入的某个哈希中的有序字段名序列。

2 个答案:

答案 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以及你需要保留的所有其他内容。