TL;博士
我正在寻找的是send/apply
和dynamic-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)
这样的东西,它结合了提到的最后两个。
注意:我知道我可以简单地接受列表作为参数,并在函数本身中使用car
和cdr
来获得正确的值。但这不是我想要的。
dynamic-send
是一个函数(也称为过程;例如,car
,vector-set!
,+
),因此您可以使用apply
:
(apply dynamic-send light-class method-name parameters)
甚至简单地:
(apply dynamic-send light-class message)
send
之所以有send/apply
变体,是因为send
是一种形式(也称为语法;例如,let
、define
、if
),所以apply
不起作用,因此send/apply
是单独提供的。