Scheme 结合apply的Racket类中的动态函数调用 TL;博士
我要寻找的是功能和功能的组合。因此,它根据符号找到对象的方法,并解压缩参数列表 背景和更多信息 对于一个项目,我使用Racket的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))
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)