如何在Scheme中将任意标记附加到闭包?
以下是我想要使用的一些内容:
(1)标记提供界面的闭包,以生成它们所代表的字符串,例如@kud0h要求here的字符串。一般->string
过程可能包含以下代码:
(display (if (stringable? x)
(x 'string)
x)
str-port)
(2)更一般地说,确定一个闭包是一个服从一般对象接口规则的“对象”,还是告诉一个对象的类(就像@KPatnode所询问的那样。 here)。
我无法通过调用来查询过程以查看它是否支持某个接口,因为如果它不支持已知接口,则调用该过程将产生不可预测的结果,很可能是运行时错误。 / p>
Chez Scheme有putprop
和getprop
个过程,可让您为符号添加键和值。但是,闭包可以是匿名的,也可以绑定到不同的符号,所以我更喜欢将一个调用约定标签附加到闭包本身,而不是它所绑定的符号。
我现在唯一的想法是维护系统中所有“可串行”或“对象”闭包的全局哈希表。这看起来有点笨重。是否有更简单,更优雅或更有效的方式?
答案 0 :(得分:1)
Racket有applicable structures:如果将实例用作函数,则可以为结构类型提供一个应用挂钩。
如果您想要更便携的解决方案,可以使用哈希表将数据与某些过程相关联。但是,除非您的Scheme提供弱哈希表,否则请记住哈希表会阻止程序被垃圾回收。
答案 1 :(得分:0)
我认为你可能不是标记程序本身,而是要查看具有接口概念的Racket's object system。这听起来与你所追求的完全相似。
答案 2 :(得分:0)
你可以走极端,重新定义lambda
语法。这样的事情(但我未经测试):
(define *properties* '()) ;; example only
(define-syntax lambda
(let-syntax ((sys-lambda
(syntax-rules ()
((_ args body ...)
(lambda args body ...)))))
(syntax-rules ()
((_ args body ...)
(let ((func (sys-lambda args body ...)))
(set! *properties*
(cons (cons func '(NO-PROPERTIES))
*properties*))
func)))))