我和The Little Schemer一起工作,学习Scheme并在我的环境中使用PLT-Scheme.
Little Schemer对递归给了我很大的帮助(现在对我来说很简单)但是我仍然坚持介绍"收藏家"这本书的一部分,并将整个函数称为一个延续.
这是他们使用的示例代码.我理解递归元素但是我被卡住了,特别是在lambda函数上 - 我的思想不能遵循路径以及如何设置lambda函数的参数(因为他们唯一的调用是在递归中再次调用它们,有功能体内没有具体用途).
如果有人能够或多或少地通过将函数递归到lambda收集器来分解计算路径,那可能对我有所帮助.
;; Build a nested list of even numbers by removing the odd ones from its
;; argument and simultaneously multiply the even numbers and sum the odd
;; numbers that occur in its argument.
(define (even-only-collector l col)
(cond
((null? l)
(col (quote ()) 1 0))
((atom? (car l))
(cond
((even? (car l))
(even-only-collector (cdr l)
(lambda (newl p s)
(col (cons (car l) newl)
(* (car l) …Run Code Online (Sandbox Code Playgroud) 在阅读"The Seasoned Schemer"时,我开始学习letrec.我理解它的作用(可以用Y-Combinator复制),但本书正在使用它来代替在已define保持静态参数的已经d函数上重复出现.
使用defined函数重复出现的旧函数示例(没什么特别的):
(define (substitute new old l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (substitute new old (cdr l))))
(else
(cons (car l) (substitute new old (cdr l))))))
Run Code Online (Sandbox Code Playgroud)
现在有一个相同功能的例子,但使用letrec:
(define (substitute new old l)
(letrec
((replace
(lambda (l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (replace (cdr l))))
(else
(cons (car l) (replace (cdr l))))))))
(replace lat)))
Run Code Online (Sandbox Code Playgroud)
除了稍微长一点,更难以阅读之外,我不知道他们为什么要在书中重写函数来使用letrec.通过这种方式在静态变量上重复出现时是否有速度增强,因为你没有继续传递它?
对于具有参数的函数,这种标准实践是保持静态还是减少了一个参数(例如重复列表的元素)?
来自更有经验的Schemers/LISPers的一些意见将有所帮助!
通过两本Schemer书籍后,我即将开始使用HtDP,但也发现了http://docs.plt-scheme.org/guide材料.
看起来,前面提到的书籍更倾向于Scheme,后者更适合PLT特定的扩展(模块,需求,括号语法等......).在线手册非常好,但我希望有可能购买的书籍表格?
如果没有,我当然感谢深入的在线手册 - 只是好奇!
自从我触及Scheme并决定使用Scheme实现命令行收入分配器已经有几个月了.
我的初始实现使用了对延续的简单递归,但我认为延续更适合这种类型的程序.我很感激,如果有人(比我更熟练的方案)可以看看这个并提出改进建议.我是多(display...行也是使用宏的理想机会(我还没有得到宏).
(define (ab-income)
(call/cc
(lambda (cc)
(let
((out (display "Income: "))
(income (string->number (read-line))))
(cond
((<= income 600)
(display (format "Please enter an amount greater than $600.00~n~n"))
(cc (ab-income)))
(else
(let
((bills (* (/ 30 100) income))
(taxes (* (/ 20 100) income))
(savings (* (/ 10 100) income))
(checking (* (/ 40 100) income)))
(display (format "~nDeduct for bills:---------------------- $~a~n" (real->decimal-string bills 2)))
(display (format "Deduct for taxes:---------------------- $~a~n" (real->decimal-string taxes 2)))
(display (format "Deduct for …Run Code Online (Sandbox Code Playgroud) 我已经构建了一个进程队列实现,它创建了一个工作进程池,它接收带有要处理的数据的有效负载消息.完成该过程后,它会将消息发送回池中,池管理器会重新排队该进程ID以供使用.
我的问题是:放弃这个过程并产生新的过程会更好吗?还是回收它?
我正在尝试构建一个应用程序,允许用户A)输入一个新人,或B)从他们的联系人中选择一个人......我的问题是关于项目B.我已经简要阅读了关于加载模态视图控制器的内容但是,希望有人可以指向我专门讨论这种用例场景的教程或文章的方向.
是的,我对iPhone应用程序开发也有些新意.