Scheme 线程功能
有没有更简单的方法来实现球拍的线程功能?我知道线程库,但它似乎是一个基本的功能,我想知道是否有一些内置的方法来做到这一点Scheme 线程功能,scheme,lisp,racket,Scheme,Lisp,Racket,有没有更简单的方法来实现球拍的线程功能?我知道线程库,但它似乎是一个基本的功能,我想知道是否有一些内置的方法来做到这一点 (define (thread x . fns) (foldl (lambda (f a) (f a)) thread fns)) 另外,您能否以更简单的方式表达(lambda(fa)(fa))。一个很好的方法是使用一个宏,它的一个简单(可能不是完全正确)版本是: (define-syntax (/> stx)
(define (thread x . fns)
(foldl (lambda (f a) (f a))
thread
fns))
另外,您能否以更简单的方式表达
(lambda(fa)(fa))
。一个很好的方法是使用一个宏,它的一个简单(可能不是完全正确)版本是:
(define-syntax (/> stx)
(syntax-case stx ()
[(_ x)
#'x]
[(_ x f)
#'(f x)]
[(/> x f fs ...)
#'(/> (f x) fs ...)]
[/>
(identifier? #'/>)
#'(λ (x . fns)
(for/fold ([r x]) ([f fns])
(f r)))]))
现在,例如(/>x sin-cos)
被扩展为(cos(sin-x))
:根本没有运行时开销。最后一个子句表示(apply/>1(list sin cos))
将起作用
我不确定上面的宏是否完全正确,尤其是最后一个子句。您是否打算在foldl中使用
x
作为起始值?您的线程
工作正常(前提是您修复了@AlexKnauth指出的错误)。但是有三个原因可以解释为什么您更喜欢线程库。1) 您的系统有运行时开销。该库使用宏来避免(正如下面@tfb所指出的)2)该库允许您执行任意形式的线程(即语法),而不仅仅是函数值3)它为“currying”提供了很好的支持。在最后一个子句中,我建议您将lambda从语法定义中删除。将其定义为一个普通函数,然后扩展到该函数名,而不是每次都扩展到lambda表达式的新副本time@AlexKnauth:我认为这是在优化空闲循环。该函数在每个宏扩展中使用一次(因此,几乎从未使用过),在几乎从未使用过的情况下,使用的代码仅用于演示!对于通常也是函数的宏来说,这只是一个好习惯,特别是当您要扩展的函数中有其他宏用途时,这些宏将很容易被重新扩展avoidable@AlexKnauth:谢谢你教我“好习惯”。这么多年来,我一点也不知道。