为什么此程序必须嵌套一层无参lambda?

By guenchi at 2017-12-05 • 0人收藏 • 315人看过
(define queue '())

(define enqueue
    (lambda (x)
        (set! queue (append queue (list x)))))

(define dequeue
    (lambda ()
        (let ((x (car queue)))
            (set! queue (cdr queue))
            x)))

(define fork
    (lambda (proc)
        (call/cc
            (lambda (k)
                (enqueue k)
                (proc)))))

(define yield
    (lambda ()
        (call/cc
            (lambda (k)
                (enqueue k)
                ((dequeue))))))

(define run
    (lambda ()
        (if (null? queue)
            (exit)
            ((dequeue)))))

(define f
    (lambda (str)
        (lambda ()
            (let loop ((n 0))
                (display str )
                (display n)
                (newline)
                (yield)
                (loop (+ 1 n))))))

(fork (f "fork1"))
(fork (f "fork2"))
(run)

这个程序是可以运行的,交替执行程序1和程序2

但是如果将过程f 变为

(define f
    (lambda (str)
        (let loop ((n 0))
            (display str )
            (display n)
            (newline)
            (yield)
            (loop (+ 1 n)))))

就是取消一层lambda,在输入第一个fork时程序就开始循环了


为什么?

2 个回复 | 最后更新于 2017-12-06
2017-12-05   #1
1
2
3
4
5
6
7
8
9
(define f
    (lambda (str)
        (lambda ()
            (let loop ((n 0))
                (display str )
                (display n)
                (newline)
                (yield)
                (loop (+ 1 n))))))

 这是一个返回函数的函数,在返回函数中才有循环体
它返回的函数被存入队列中, 最后只有 run 和 yield 中才执行 

1
((dequeue))

时候调用。

如果少加一层lambda, 所以 f 就变成包含循环体的函数,执行

1
(f "fork1")

的时候就进入f,然后执行循环体

2017-12-06   #2

关于call/ccc的部分

能讲一下吗?传来传去的

二是这个示例貌似能达到任意n个fork的并行执行

在具体的事务中能用起来吗?比如对事件循环libuv的调度等?

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...