小编sil*_*boy的帖子

call-with-current-continuation - 状态保存概念

读完The Seasoned Schemer后,我觉得我理解得call/cc很好.但是,在看到一些WOW技巧后,call/cc我发现我错了.

(define cc 0)
(define (f)
  (call/cc (lambda (k)
             (set! cc k)
             3)))

(+ 1 2 4 (f)) ; eval's to 10
(cc 13) ; eval's to 20
Run Code Online (Sandbox Code Playgroud)

这完全符合我的理解.我想当我call/cc接到电话时,我只是在保存程序状态.并使用函数调用它旁边的函数.如果k从某个地方调用该函数(),而不是用(call/cc ...)给定的参数替换整个东西.上述程序似乎也是这样


但,

(define (itr lst)
  (define (state k)
    (for-each (lambda (item)
                (call/cc (lambda (h)
                           (set! state h)
                           (k item))))
              lst)
    (k 'done))

  (define (generator)
    (call/cc (lambda (k) (state k))))
  generator)

(define (next)
  (itr (range 2)))
Run Code Online (Sandbox Code Playgroud)

调用 …

scheme continuations callcc continuation-passing

6
推荐指数
1
解决办法
482
查看次数

ANSI C 中类型的非限定版本

ANSI C 标准第 6.3.2.2 节的约束部分包括以下短语:

每个参数应具有一个类型,以便可以将其值分配给具有其相应参数类型的非限定版本的对象。


那么,术语“类型的不合格版本”是什么意思?

c

4
推荐指数
1
解决办法
1024
查看次数

运算符*和+在数字火星中产生错误的结果

我正在尝试计算产生最长Collat​​z序列的数字.但这是一个奇怪的问题.3n+1成为38654705674什么时候n3.我没有看到错误.这是完整的代码:

/* 6.c -- calculates Longest Collatz sequence */
#include <stdio.h>
long long get_collatz_length(long long);
int main(void)
{
    long long i;
    long long current, current_count, count;

    current_count = 1;
    current = 1;
    for(i=2;i<1000000;i++)
    {
        // works fine when i is 2 the next line take eternity when i is 3;
        count = get_collatz_length(i);
        if(current_count <= count)
        {
            current = i;
            current_count = count;
        }
    }
    printf("%lld %lld\n", current, current_count);

    return 0;
}

long long …
Run Code Online (Sandbox Code Playgroud)

c

3
推荐指数
1
解决办法
95
查看次数

标签 统计

c ×2

callcc ×1

continuation-passing ×1

continuations ×1

scheme ×1