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:谢谢你教我“好习惯”。这么多年来,我一点也不知道。