Scheme 结合apply的Racket类中的动态函数调用 TL;博士

Scheme 结合apply的Racket类中的动态函数调用 TL;博士,scheme,racket,Scheme,Racket,我要寻找的是功能和功能的组合。因此,它根据符号找到对象的方法,并解压缩参数列表 背景和更多信息 对于一个项目,我使用Racket的tcp connect通过网络发送一些“命令”。在接收端,这个命令应该从类中执行一个方法,并传递它的参数 考虑以下收到的“消息”: (define message (list 'set-switch! '3 'on)) (define method-name (car msg)) ;'set-switch! (define parameters (cdr msg))

我要寻找的是功能和功能的组合。因此,它根据符号找到对象的方法,并解压缩参数列表

背景和更多信息 对于一个项目,我使用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)
它完美地找到了方法
设置开关
但是它只使用一个参数调用它
(列表'3'打开)

球拍上提到了这三个类的功能:

  • (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
来获得正确的值。但这不是我想要的。

动态发送
是一个函数(也称为过程;例如,
汽车
向量集!
+
),因此您可以使用:

甚至简单地说:

(apply dynamic-send light-class message)

send
具有
send/apply
变体的原因是
send
是一种形式(也称为语法;例如,
let
define
if
),因此
apply
不起作用,因此
send/apply
是单独提供的。

确实非常简单!正是我需要的。我想我想得太远了。非常感谢。
(apply dynamic-send light-class message)