1

如何将任意标签附加到 Scheme 中的闭包?

以下是我想用它来做的几件事:

(1) 标记提供接口的闭包,为它们所代表的内容生成一个字符串,就像@kud0h在这里要求的那样。一般->string过程可能包括如下代码:

(display (if (stringable? x)
             (x 'string)
             x)
         str-port)

(2) 更一般地,确定闭包是否是遵守通用对象接口规则的“对象”,或者可能告诉对象的类(类似于@KPatnode在此处询问的内容)。

我不能通过调用一个过程来查询它是否支持某个接口,因为如果它不支持一个已知的接口,调用该过程会产生不可预知的结果,很可能是运行时错误。

Chez Scheme具有允许您向符号添加键和值的过程putpropgetprop但是,闭包可以是匿名的,也可以绑定到不同的符号,因此我更愿意将调用约定标记附加到闭包本身,而不是绑定到的符号。

我现在唯一的想法是维护系统中所有“字符串”或“对象”闭包的全局哈希表。这似乎有点笨拙。有没有更简单、更优雅、更高效的方法?

4

3 回答 3

1

Racket 具有适用的结构:如果将实例用作函数,则可以为结构类型提供要调用的应用挂钩。

如果您想要一个更便携的解决方案,您可以使用哈希表将您的数据与某些过程相关联。但是,除非您的 Scheme 提供了弱哈希表,否则请记住,哈希表会阻止程序被垃圾收集。

于 2013-04-19T14:15:39.357 回答
0

我想你可能不想给程序本身贴标签,而是想看看Racket 的对象系统,它有一个接口的概念。这听起来与您所追求的非常相似。

于 2013-04-19T07:55:55.943 回答
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)))))
于 2013-04-19T14:12:43.873 回答