刚刚开始进入The Little Schemer,并有一个非常基本的Dr. Racket IDE问题:
如何清除翻译屏幕?
如何设置向上箭头以显示以前键入的项目(如在Bash中)而不是当前滚动屏幕的行为?
我的搜索空白,可能是因为我不知道这些操作的技术术语.
在构建列表时,描述第一个典型元素,然后将其纳入自然递归.
"自然递归"的确切定义是什么?我问的原因是因为我正在接受Daniel Friedman的编程语言原则课程,以下代码不被认为是"自然递归":
(define (plus x y)
(if (zero? y) x
(plus (add1 x) (sub1 y))))
Run Code Online (Sandbox Code Playgroud)
但是,以下代码被认为是"自然递归":
(define (plus x y)
(if (zero? y) x
(add1 (plus x (sub1 y)))))
Run Code Online (Sandbox Code Playgroud)
我更喜欢"非自然递归"代码,因为它是尾递归的.但是,这样的代码被认为是诅咒.当我问到为什么我们不应该以尾递归形式编写函数时,副教师简单地回答说:"你不要乱用自然递归."
以"自然递归"形式编写函数有什么好处?
在The Little Schemer的第3章中,关于为什么我们不立即简化rember函数的问题的答案是"因为那时函数的结构与其参数的结构不一致".我无法理解函数的结构是什么,参数的结构是什么,以及它们之间的区别.
这是未简化的版本:
(define rember
(lambda (a lat)
(cond
((null? lat) (quote ()))
(else (cond
(( eq? (car lat) a) (cdr lat))
(else (cons (car lat)
(rember a
( cdr lat)))))))))
Run Code Online (Sandbox Code Playgroud)
这是简化的:
(define rember
(lambda (a lat)
(cond
((null? lat) (quote ()))
((eq? (car lat) a) (cdr lat))
(else (cons (car lat)
(rember a (cdr lat)))))))
Run Code Online (Sandbox Code Playgroud)
据我所知,主要的不同之处在于,这个功能已经从两个问题变成了一个问题,每个问题一个问题,一个问题得到两个问题.
函数的参数是原子"a"和列表"lat".
这是第一次在密集书面的前言之外,书中引用了"结构"这个词.在我看来,到目前为止,"结构"一词的定义可以解释.
之前有人问过这个确切的问题,但我无法回答这个问题.为什么两个cond结构与列表的结构重合或不重合?在我看来,清单根本没有任何条件!
不是条件相当于Scheme中的问题吗?也许我误解了条件是什么,这可能是我沮丧的合理根源.无论如何,对此的任何澄清将非常感谢!谢谢!
scheme structure conditional-statements the-little-schemer racket
我无法理解Scheme中收集器函数的使用.我正在使用"The Little Schemer"一书(Daniel P. Friedman和Matthias Felleisen).一个有一些解释的综合例子对我有很大帮助.使用收集器函数的函数示例如下:
(define identity
(lambda (l col)
(cond
((null? l) (col '()))
(else (identity
(cdr l)
(lambda (newl)
(col (cons (car l) newl))))))))
Run Code Online (Sandbox Code Playgroud)
......有一个例子叫做存在(identity '(a b c) self)和self-function存在(define self (lambda (x) x)).该identity函数返回给定的列表l,因此给定调用的输出将是(a b c).使用的确切语言是R5RS Legacy语言.
我正在阅读"Little Schemer"一书,并完成各种功能.一般来说,我最终得到与书籍相同的版本,但不是eqlist ?,这是一个测试两个列表相等的函数.
我已经尝试过测试我的版本,它会传递任何我抛出的东西.然而它与"Little Schemer"版本略有不同,我希望有人对我是否遗漏某些东西持有意见 - 我怀疑是这样的.
我的版本:
(define eqlist?
(lambda (list1 list2)
(cond
((and (null? list1)(null? list2))#t)
((or (null? list1)(null? list2))#f)
((and (atom? list1)(atom? list2))(eqan? list1 list2))
((or (atom? list1)(atom? list2)) #f)
(else
(and(eqlist? (car list1) (car list2))
(eqlist? (cdr list1) (cdr list2)))))))
Run Code Online (Sandbox Code Playgroud)
这本书的版本:
(define eqlist2? ;This is Little Schemer's version
(lambda (list1 list2)
(cond
((and (null? list1)(null? list2)) #t)
((or (null? list1)(null? list2)) #f)
((and (atom? (car list1))(atom? (car list2)))
(and (eqan? (car list1)(car list2))(eqlist2? (cdr list1)(cdr list2)))) …Run Code Online (Sandbox Code Playgroud) 在The Little Schemer中有一个功能可以检查列表是否是平的:
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
Run Code Online (Sandbox Code Playgroud)
我正在尝试在Haskell中编写相同的递归函数,但没有成功:
is_lat :: [a] -> Bool
is_lat [] = True
is_lat ???
Run Code Online (Sandbox Code Playgroud)
我如何检查参数不在表单中[[a]]?换句话说,[1,2,3]是一个有效的输入,但[[1,3], [2,4]]并[[[1,2,3]]]没有.
我想在接受列表的递归函数中进一步使用它,以确保我只处理平面列表.
编辑:我看到人们因is_lat :: [a] -> Bool类型签名而感到困惑.我现在同意,我不应该在运行时检查类型.但是,是否可以在编译时检查类型?如何使该功能仅适用于平面列表?或者我应该彻底改变我的思维方式?
我是CS的初级学生,我的课程主要是Java.我目前正在通过"Little Schemer"作为自学,并且在找到如何做到这一点的过程中,我发现了许多对Scheme的"实现"的引用.我的问题是,什么是实施?
它们是Scheme的子方言,还是其他东西(DrScheme似乎允许该语言的不同"风味")?它只是包含IDE,解释器,交互式工具等的任何给定生态系统的名称吗?
所有其他语言(例如Java)是否也有各种"实现",还是保留为"开放"语言?
谢谢,
乔斯德拉格
我试图通过"The Little Lisper"并在第一章中遇到障碍.我对Emacs比较陌生(这激发了我学习Lisp和clojure的兴趣).我下载了Mit-scheme app,正在Edwin上练习.
我尝试着:
(atom? (cons a l))
Run Code Online (Sandbox Code Playgroud)
其中a是原子,l是已定义的列表.我收到以下错误:
;Unbound variable: atom?
Run Code Online (Sandbox Code Playgroud)
为什么?我使用"null"没有问题吗?功能.我以为"原子?" 是一个内部函数,检查返回的值是否为原子.
任何解释都将非常感激.我仍然没有设置我的emacs来运行方案,所有lisp方言之间的细微差别正在测试我的耐心.
我正在阅读The Little Schemer并对以下代码感到困惑:
((lambda (len)
(lambda (l)
(cond
((null? l) 0)
(else
(+ 1 (len (cdr l)))))))
eternity)
(define eternity
(lambda (x)
(eternity x)))
Run Code Online (Sandbox Code Playgroud)
代码是确定空列表,否则它永远不会停止.
为什么" len"没有递归?
我正在阅读Daniel Friedman撰写的The Little Schemer一书.我不明白为什么书中的每个函数都是用lambda表达式编写的.
(define fun1
(lambda (x1 x2)
(+ x1 x2)))
(define (fun2 x1 x2)
(+ x2 x2))
Run Code Online (Sandbox Code Playgroud)
这两个功能做同样的事情,但第二个功能更整洁.我很好奇在各地使用lambda的原因.
在这种情况下我使用了DrRacket.