Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros Racket,将列表转换为值_Macros_Arguments_Racket - Fatal编程技术网

Macros Racket,将列表转换为值

Macros Racket,将列表转换为值,macros,arguments,racket,Macros,Arguments,Racket,我正在设计一个包含两部分的程序。一个在我的电脑上,一个在树莓皮上 我经常通过TCP/IP发送消息,从我的计算机上的一个过程发送到Raspberry Pi上的一个过程。所以基本上它所做的就是发送目的地、消息和参数列表 然后在Raspberry Pi上,我读取目的地(一个生活在Raspberry Pi上的特定对象),并将带有参数的消息发送给该对象 在raspberry pi上的对象中,我有许多程序如下所示: (define (a-procedure argument1 argument2 ... a

我正在设计一个包含两部分的程序。一个在我的电脑上,一个在树莓皮上

我经常通过TCP/IP发送消息,从我的计算机上的一个过程发送到Raspberry Pi上的一个过程。所以基本上它所做的就是发送目的地、消息和参数列表

然后在Raspberry Pi上,我读取目的地(一个生活在Raspberry Pi上的特定对象),并将带有参数的消息发送给该对象

在raspberry pi上的对象中,我有许多程序如下所示:

(define (a-procedure argument1 argument2 ... argument-N)
  ...)
但问题是,在树莓皮上,我收到了一个参数列表。 我不想更改所有过程(在raspberry pi上),因此它们采用参数列表而不是多个参数。

所以凭直觉我认为宏可以完成这项工作。 我从未使用过宏,也没有人教过我,所以我对这个概念很陌生。我在文档中搜索了一下,得出以下结论:

(define-syntax rotate
  (syntax-rules ()
    [(a-procedure (list a)) (x a)]
    [(a-procedure (list a ...)) (x a ...)]))
但是问题是它总是调用过程“x”

所以现在我希望它调用的过程也可以是可变的(不是硬编码的,因为我不想为raspberry pi上的每个过程都创建这样的宏…)

例如:

(callWithArguments (+ (list 1 2 3))) ; --> (+ 1 2 3)
(callWithArguments (* (list 1 2 3))) ; --> (* 1 2 3)
为此,我尝试了以下方法:

(define-syntax callWithArguments
  (syntax-rule ()
    [(a-procedure (list a)) (a-procedure a)]
    [(a-procedure (list a ...)) (a-procedure a ...)]))
(call-with-values (lambda () 
                    (for-each (lambda (arg) arg) argumentList)) 
                  a-procedure)
但在这个例子中,“a程序”并不是可变的。 如果我试着像上面提到的那样称呼它,我会得到:

 a-procedure: undefined;
 cannot reference an identifier before its definition
我试着用“语法规则id”来做,但没有成功

我还阅读了有关多个值的文档。 我看到了一个过程“调用值”

所以我试了一下:

(define-syntax callWithArguments
  (syntax-rule ()
    [(a-procedure (list a)) (a-procedure a)]
    [(a-procedure (list a ...)) (a-procedure a ...)]))
(call-with-values (lambda () 
                    (for-each (lambda (arg) arg) argumentList)) 
                  a-procedure)
现在这个过程是可变的(不是硬编码的过程),但问题是它只考虑for-each返回的最后一个值。
我没有找到将列表转换为多个值的方法。
”(1 2 3 4)-->(1 2 3 4)

我认为您设计得太过分了。如果要使用列表中的多个参数调用过程,只需使用
apply
。因此:

(callWithArguments (+ (list 1 2 3)))
可以这样表示:

(apply + (list 1 2 3))
但如果要使用宏计算表达式,请尝试以下操作:

(define-syntax callWithArguments
  (syntax-rules ()
    [(_ (a-procedure a-list))
     (apply a-procedure a-list)]))

(callWithArguments (+ (list 1 2 3)))
=> 6
或者,如果您想在不实际计算表达式的情况下转换表达式,请使用列表拼接:

(define-syntax callWithArguments
  (syntax-rules ()
    [(_ (a-procedure a-list))
     `(a-procedure ,@a-list)]))

(callWithArguments (+ (list 1 2 3)))
=> '(+ 1 2 3)

你说得对!我一直在找,我不记得应聘者能胜任这份工作你知道他们说的:保持简单;)。在大多数情况下,一个过程可以做到这一点,宏是强大的,但一般来说,您可以不使用它们就离开。对于更复杂的场景,请将它们留在工具箱中。