读完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)
调用 …
ANSI C 标准第 6.3.2.2 节的约束部分包括以下短语:
每个参数应具有一个类型,以便可以将其值分配给具有其相应参数类型的非限定版本的对象。
那么,术语“类型的不合格版本”是什么意思?
我正在尝试计算产生最长Collatz序列的数字.但这是一个奇怪的问题.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)