球拍类中的动态函数调用与应用相结合



TL;博士

我正在寻找的是send/applydynamic-send功能的组合。以便它找到基于符号的对象的方法解压缩参数列表。

背景和更多信息

对于一个项目,我正在使用Racket的tcp-connect通过网络发送一些"命令"。在接收器端,此命令应执行类中的方法并传递其参数。

考虑以下收到的"消息":

(define message (list 'set-switch! '3 'on))
(define method-name (car msg))  ;'set-switch!
(define parameters (cdr msg))   ;(list '3 'on)

和以下类:

(define light%
(class object%
(super-new)
...
(define/public (set-switch! id mode)
(vector-set! switches id mode))))

现在的问题是,在执行此语句时

(dynamic-send light-class method-name parameters)

它完美地找到了方法set-switch!但它只用一个参数(list '3 'on)调用它。

Racket 文档提到了类的这三个函数:

  • (send obj-expr method-id arg)只执行对象的方法
  • 执行方法并解压缩参数列表的(send/apply obj-expr method-id arg-list-expr)
  • (dynamic-send obj method-name v)基于符号查找方法名称

我认为我需要的是像(dynamic-send/apply obj method-name arg-list-expr)这样的东西,它结合了提到的最后两个。

注意:我知道我可以简单地接受列表作为参数,并在函数本身中使用carcdr来获得正确的值。但这不是我想要的。

dynamic-send是一个函数(也称为过程;例如,carvector-set!+),因此您可以使用apply

(apply dynamic-send light-class method-name parameters)

甚至简单地:

(apply dynamic-send light-class message)

send之所以有send/apply变体,是因为send是一种形式(也称为语法;例如,letdefineif),所以apply不起作用,因此send/apply是单独提供的。

相关内容