【发布时间】:2017-01-02 18:23:45
【问题描述】:
我正在处理的项目定义了一些复杂的结构,它们接收消息并在它们自己的线程中运行。这些结构是用户定义的,并通过宏转换为线程和运行时的东西。粗略地说,我们可以说一个复杂的结构由一些实现逻辑的行为和一个产生行为实例的过程组成。在下面的代码中,我大大简化了这种情况,create-thread-behaviour 宏定义的行为是一个简单的 thunk,可以通过spawn 宏产生。我想实现一个行为(一个实例)的能力,通过self 参数向自己发送消息,该参数将绑定到(current-thread)(〜运行该行为的线程)。
我曾尝试使用syntax-parameterize 来安装某些东西,但由于某种原因无法使其正常工作。下面的代码实现了一个简单的应用程序,它应该阐明我想要实现的目标——特别感兴趣的是(未实现的)<self> 对底部的引用。
#lang racket
(require (for-syntax syntax/parse))
(define-syntax (create-thread-behaviour stx)
(syntax-parse stx
[(_ body:expr ...+)
#'(λ () body ...)]))
(define-syntax (spawn stx)
(syntax-parse stx
[(_ behaviour:id)
#'(thread behaviour)]))
(define behaviour
(create-thread-behaviour
(let loop ()
(define message (thread-receive))
(printf "message: ~a~n" message)
(thread-send <self> "And this is crazy.")
(loop))))
(define instance (spawn behaviour))
(thread-send instance "Hey I just met you")
所以我尝试的带有语法参数的东西如下,它引发了自定义的“只能用于行为”错误。我知道我之前正确使用过语法参数,但也许我只是关注这个问题太久了。
(require racket/stxparam)
(define-syntax-parameter self
(lambda (stx) (raise-syntax-error (syntax-e stx) "can only be used in a behaviour")))
(define-syntax (spawn stx)
(syntax-parse stx
[(_ behaviour:id)
#'(thread
(lambda ()
(syntax-parameterize ([self #'(current-thread)])
(behaviour))))]))
【问题讨论】:
-
您能否发布一个使用
syntax-parameterize的(非工作)尝试?这绝对是适合这项工作的工具,而且指出你缺少的东西可能比重新实现所有东西更有帮助。 -
你是对的!给我一分钟:)
标签: racket