Racket 是否可以定义与begin表单具有相同属性的宏?

Racket 是否可以定义与begin表单具有相同属性的宏?,racket,Racket,更具体地说,我感兴趣的是beginwhere的一个特殊属性,它的主体中的定义添加到了周围的范围中。例如 (begin (define a 1) (define b 2)) (+ a b) ; 3 定义一个新的宏my begin并将其转换为标准begin是相当简单的,但是在我的特定用例中,我需要一个在begin中绑定的所有标识符的列表,以便我可以在其他地方引入/使用它们 更具体地说,我想要实现什么:我正在考虑如何构建一个PAR/AND操作符,该操作符可以同时评估两个分支,或者至少根

更具体地说,我感兴趣的是beginwhere的一个特殊属性,它的主体中的定义添加到了周围的范围中。例如

(begin (define a 1)
       (define b 2))
(+ a b) ; 3
定义一个新的宏my begin并将其转换为标准begin是相当简单的,但是在我的特定用例中,我需要一个在begin中绑定的所有标识符的列表,以便我可以在其他地方引入/使用它们

更具体地说,我想要实现什么:我正在考虑如何构建一个PAR/AND操作符,该操作符可以同时评估两个分支,或者至少根据上下文给出一个印象。分支可能包含阻塞操作。一旦两个分支都返回,PAR/和自身将返回。任何定义都可以在外围范围内使用。例如:

(PAR/AND     
  (define a (do-something))       ; branch 1
  (define b (do-something-else))) ; branch 2
(+ a b)

我还不太确定如何实现它,因为我有一些额外的事情要担心,但是在par/的范围之外提供a和b肯定是需要在某个时候进行的事情。

有很多复杂的方法可以做到这一点,但是看起来也有一个简单的方法:你不能把你的PAR/和宏展开成一个开始吗?

有很多复杂的方法可以做到这一点,但是看起来也有一个简单的方法:难道你不能让你的PAR/和宏展开成一个开始吗?

我会跳过关于完全定义的部分,只是确保表达式并行完成,然后在线程连接时使用值。在racket中,您可以定义值,在该值中,您可以将多个值绑定到全局名称,并可以使用该值命名您计算的值:

定义值a和b 并行/值做某事做其他事情 +a b ; ==> 1337 paralell/values在这里需要是语法,但由于表达式本身是thunks,实际上您可以保留一个接受thunks的过程:

定义值a和b 并行/值做某事做其他事情 +a b ; ==> 1337
正如您所见,这根本不需要自定义的开始。我希望并行的表达式会引入闭包,这将影响define,因此也可以避免蠕虫的攻击。如果在禁用宏隐藏的情况下从宏扩展器查看完全展开的程序,则定义值是racket中的实际定义原语

我会跳过关于完全定义的部分,只是确保表达式是并行完成的,然后在线程连接时使用值。在racket中,您可以定义值,在该值中,您可以将多个值绑定到全局名称,并可以使用该值命名您计算的值:

定义值a和b 并行/值做某事做其他事情 +a b ; ==> 1337 paralell/values在这里需要是语法,但由于表达式本身是thunks,实际上您可以保留一个接受thunks的过程:

定义值a和b 并行/值做某事做其他事情 +a b ; ==> 1337
正如您所见,这根本不需要自定义的开始。我希望并行的表达式会引入闭包,这将影响define,因此也可以避免蠕虫的攻击。如果在禁用宏隐藏的情况下从宏扩展器查看完全展开的程序,则定义值是racket中的实际定义原语

听起来像个XY问题。你到底想完成什么?你可能是对的。我为这个问题添加了更多的上下文。听起来像是XY问题。你到底想完成什么?你可能是对的。我为这个问题增加了一些背景。好问题。考虑到这个目标,我不确定这是否可行。如果我想要分支的实际并发性,那么PAR/AND将产生两个线程来计算分支,并基本上同步它们。贝京在这里帮不了我。分支中可能发生的阻塞操作实际上更像是一种简单的等待,直到接收到事件,因此我可能可以将分支包装在lambda中,在接收到所需事件后执行。是否有可能提供一个“干净”的环境,并在执行后检查添加了哪些绑定?好问题。考虑到这个目标,我不确定这是否可行。如果我想要分支的实际并发性,那么PAR/AND将产生两个线程来计算分支,并基本上同步它们。贝京在这里帮不了我。分支中可能发生的阻塞操作实际上更像是一种简单的等待,直到接收到事件,因此我可能可以将分支包装在lambda中,在接收到所需事件后执行。是否有可能提供一个“干净”的环境并在执行后检查添加了哪些绑定?我以前没有从这个角度看问题,也没有想过以这种方式使用define值。这绝对是解决这个问题的捷径。谢谢你的洞察力!是的,我也正要提出这个建议。我还没想到
以前从这个角度考虑过这个问题,也不会考虑以这种方式使用define值。这绝对是解决这个问题的捷径。谢谢你的洞察力!是的,我也打算提出这个建议。