我在自己教学计划的第1小时1.不用说,我什么都不懂.所以我正在阅读The Little Schemer并使用这个东西:
作为翻译.
我需要使用'例如
(atom? 'turkey)
Run Code Online (Sandbox Code Playgroud)
避免"未定义的变量"错误.的',根据这本书,是Common Lisp的事情.
我有两个问题:
我上面提到的翻译是好的吗?你能推荐另一个吗?我需要一个能与The Little Schemer合作的人.
什么是'?
我和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 Little Schemer中第9章的结尾,其中应用Y组合器是为该length功能开发的.我认为我的困惑归结为一个单独的声明,对比两个版本的长度(在组合器被分解之前):
A:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0 )
(else (add1
((mk-length mk-length)
(cdr l))))))))
B:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
((lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(mk-length mk-length))))
Run Code Online (Sandbox Code Playgroud)
第170页(第4版)指出A.
当我们将它应用于参数时返回一个函数
而B
不返回功能
从而产生自我应用的无限回归.我很难过.如果B受到这个问题的困扰,我不知道A如何避免它.
我开始阅读Little Schemer了,而不是PLT Scheme,我们有Racket.我想知道Racket是否适合在本书中进行练习,或者我是否需要获得另一个真正的Scheme编译器.在我忘了告诉你之前,我的操作系统是Windows x64.
书,语言和范例足够复杂,我希望避免与编译器挣扎.
非常感谢提前.
我一直在通过The Little Schemer,我想知道什么环境,IDE或者解释器最好用来测试我为自己记下的任何Scheme代码.
在从SICP学习了一点Scheme之后,我开始阅读The Little Schemer(我发现它非常有趣)并且大约完成了四分之一.我注意到我可以在不使用lambda的情况下编写许多(大多数?全部?)解决方案,而Little Schemer 总是使用它们.例如,第一个定义是
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
Run Code Online (Sandbox Code Playgroud)
除非我弄错了,否则可以更简单地写成
(define (atom? x)
(and (not (pair? x)) (not (null? x))))
Run Code Online (Sandbox Code Playgroud)
如果我写无lambda的解决方案,我会遗漏一些基本的东西吗?
我刚刚打开了The Little Schemer,我觉得我错过了什么.
第一个问题是"这是一个原子是真的吗?",但我没有看到原子是什么的任何定义.我想我可以通过问题的答案推导出一个原子是什么,然后继续询问l的车是什么,l的cd是什么,我不知道被问到什么.
本书的目的是通过阅读答案来发现问题意味着什么,或者在我解决这本书之前是否需要一些基本知识?如果是后者,有人能指出我可能获得基本知识的地方吗?
有问题的代码是这样的:
(define multirember&co
(lambda (a lat col)
(cond
((null? lat)
(col (quote ()) (quote ())))
((eq? (car lat) a)
(multirember&co a
(cdr lat)
(lambda (newlat seen)
(col newlat
(cons (car lat) seen)))))
(else
(multirember&co a
(cdr lat)
(lambda (newlat seen)
(col (cons (car lat) newlat)
seen))))))
Run Code Online (Sandbox Code Playgroud)
我整天都在盯着这个,但我似乎无法理解它.当您重复使用要重新定义的函数时,col但在示例中它们似乎使用了原始定义.为什么不改变呢.你怎么能在它不复发传递的参数newlat和seen.
很难解释我的问题,因为我似乎只是错过了一块.如果有人能比书更明确地介绍一下,我可能会理解它是如何运作的.
recursion lambda scheme the-little-schemer continuation-passing
为了设置一些上下文,我正在学习Clojure,并且更普遍地学习Lisp.在我的Lisp之路上,我目前正在研究"Little"系列,以巩固功能编程和基于递归的解决方案的基础.在"The Little Schemer"中,我已经完成了许多练习,但是,我正在努力将其中的一些转换为Clojure.更具体地说,我正在努力将它们转换为使用"recur"以便启用TCO.例如,这里是一个基于Clojure的实现,来自"发生*"函数(来自Little Schemer),它计算出在S表达式列表中出现的原子的出现次数:
(defn atom? [l]
(not (list? l)))
(defn occurs [a lst]
(cond
(empty? lst) 0
(atom? (first lst))
(cond
(= a (first lst)) (inc (occurs a (rest lst)))
true (occurs a (rest lst)))
true (+ (occurs a (first lst))
(occurs a (rest lst)))))
Run Code Online (Sandbox Code Playgroud)
基本上,(occurs 'abc '(abc (def abc) (abc (abc def) (def (((((abc)))))))))将评估为5.显而易见的问题是,如果给出一个S表达式列表太深,这个定义会消耗堆栈帧并且会破坏堆栈.
现在,我理解重构递归函数的选项,以使用累加器参数来启用将递归调用放入尾部位置(以允许TCO),但是如果此选项甚至适用于此类情况,我也在苦苦挣扎.
如果我尝试使用"recur"和使用累加器参数来重构这个,那么这里有多远:
(defn recur-occurs [a lst]
(letfn [(myoccurs [a lst count]
(cond
(empty? lst) 0
(atom? (first lst))
(cond
(= a (first …Run Code Online (Sandbox Code Playgroud) 我很难理解evens-only*&co第145页的The Little Schemer的例子.
这是代码:
(define evens-only*&co
(lambda (l col)
(cond
((null? l)
(col '() 1 0))
((atom? (car l))
(cond
((even? (car l))
(evens-only*&co (cdr l)
(lambda (newl product sum)
(col (cons (car l) newl)
(opx (car l) product)
sum))))
(else
(evens-only*&co (cdr l)
(lambda (newl product sum)
(col newl product (op+ (car l) sum)))))))
(else
(evens-only*&co (car l)
(lambda (newl product sum)
(evens-only*&co (cdr l)
(lambda (dnewl dproduct dsum)
(col (cons newl dnewl)
(opx product dproduct)
(op+ …Run Code Online (Sandbox Code Playgroud) recursion lambda scheme the-little-schemer continuation-passing
scheme ×9
lisp ×4
lambda ×3
recursion ×3
racket ×2
clojure ×1
combinators ×1
ide ×1
quote ×1
y-combinator ×1