2016-12-30 22 views
1

更具体地说,我感兴趣的是begin的一个特定属性,其中将其主体中的定义添加到周围范围。例如。是否可以使用与开始表单相同的属性来定义宏?

(begin (define a 1) 
     (define b 2)) 
(+ a b) ; 3 

这将是相当简单的定义一个新的宏my-begin被翻译成标准begin,但在我的具体使用情况下,我需要那些在开始被绑定的所有标识符的列表,这样我可以在别处引入/使用它们。

对于我想达到的目标更具体:我计算出如何构建PAR/AND运算符,该运算符可以同时评估两个分支(或至少根据上下文给出印象)。分支可能包含阻塞操作。一旦两个分支都返回,PAR/AND本身就会返回。任何定义在外部范围内都可用。例如:

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

我不是很肯定又如何实现它(因为我有一些额外的东西操心),但使得ab可用的par/and范围之外是肯定的东西,需要发生在某个时刻。

+2

听起来像一个XY问题。你究竟在努力完成什么? – Sylwester

+0

你可能是对的。我为这个问题添加了更多的上下文。 – Sam

回答

3

我就跳过了部分有关define完全,只是确信表达并行完成,然后当线程加入使用values。在拍你有define-values,你可以将多个值结合全局名称,它可以用来命名你已经计算出的值:

(define-values (a b) 
    (parallel/values (do-something) (do-something-else))) 
(+ a b) 
; ==> 1337 

paralell/values这里需要语法,但由于表达本身的thunk你其实可以保持是一个过程,需要的thunk:

(define-values (a b) 
    (parallel/values do-something do-something-else)) 
(+ a b) 
; ==> 1337 

正如你看到的,这并不需要一个定制begin可言。我期望并行表达式会引入闭包,这将影响define,所以这也避免了蠕虫的可能性。 define-values实际的define原始在球拍中,如果您查看宏禁用宏隐藏的宏扩展器中的完整扩展程序。

+0

以前我没有从这个角度看过这个问题,也没有想过以这种方式使用'define-values'。这绝对是解决问题的“方式”方式。感谢您的洞察力! – Sam

+0

是的,我也想提出这个建议。 –

1

有很复杂的方法可以做到这一点,但它看起来也有一个简单的方法:你不能只将PAR/AND宏展开为begin

+0

好问题。我不确定这是否有可能实现目标。如果我想要分支的实际并发性,那么'PAR/AND'会生成两个线程来计算分支,并且基本上同步它们。 '开始'在这里帮不了我。在分支中可能发生的阻塞操作实际上更多的是一个简单的“等到一个事件被接收”,所以我可以将一个分支包装在一个lambda中,一旦收到所需事件就执行该分支。是否有可能提供一个'干净'的环境,执行后检查哪些绑定已被添加? – Sam

相关问题