如何在Scheme中将类型标记附加到闭包?

时间:2013-04-19 07:06:33

标签: oop object scheme

如何在Scheme中将任意标记附加到闭包?

以下是我想要使用的一些内容:

(1)标记提供界面的闭包,以生成它们所代表的字符串,例如@kud0h要求here的字符串。一般->string过程可能包含以下代码:

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

(2)更一般地说,确定一个闭包是一个服从一般对象接口规则的“对象”,还是告诉一个对象的类(就像@KPatnode所询问的那样。 here)。

我无法通过调用来查询过程以查看它是否支持某个接口,因为如果它不支持已知接口,则调用该过程将产生不可预测的结果,很可能是运行时错误。 / p>

Chez Schemeputpropgetprop个过程,可让您为符号添加键和值。但是,闭包可以是匿名的,也可以绑定到不同的符号,所以我更喜欢将一个调用约定标签附加到闭包本身,而不是它所绑定的符号。

我现在唯一的想法是维护系统中所有“可串行”或“对象”闭包的全局哈希表。这看起来有点笨重。是否有更简单,更优雅或更有效的方式?

3 个答案:

答案 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)))))