标签: the-little-schemer

如何清除Dr. Racket IDE中的解释器屏幕?

刚刚开始进入The Little Schemer,并有一个非常基本的Dr. Racket IDE问题:

  1. 如何清除翻译屏幕?

  2. 如何设置向上箭头以显示以前键入的项目(如在Bash中)而不是当前滚动屏幕的行为?

我的搜索空白,可能是因为我不知道这些操作的技术术语.

lisp ide scheme the-little-schemer racket

9
推荐指数
1
解决办法
4745
查看次数

"自然递归"的定义是什么?

第三诫的小策士指出:

在构建列表时,描述第一个典型元素,然后将其纳入自然递归.

"自然递归"的确切定义是什么?我问的原因是因为我正在接受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)

我更喜欢"非自然递归"代码,因为它是尾递归的.但是,这样的代码被认为是诅咒.当我问到为什么我们不应该以尾递归形式编写函数时,副教师简单地回答说:"你不要乱用自然递归."

以"自然递归"形式编写函数有什么好处?

lisp recursion scheme the-little-schemer racket

9
推荐指数
2
解决办法
3465
查看次数

Little Schemer:什么是函数或参数的结构?

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

8
推荐指数
1
解决办法
425
查看次数

收集器功能如何在Scheme中工作?

我无法理解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语言.

lisp scheme the-little-schemer continuation-passing racket

8
推荐指数
1
解决办法
725
查看次数

小Schemer eqlist?功能 - 备用版本?

我正在阅读"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)

scheme the-little-schemer

7
推荐指数
1
解决办法
506
查看次数

检查Haskell中的列表是否平坦

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类型签名而感到困惑.我现在同意,我不应该在运行时检查类型.但是,是否可以在编译时检查类型?如何使该功能仅适用于平面列表?或者我应该彻底改变我的思维方式?

recursion haskell list pattern-matching the-little-schemer

7
推荐指数
3
解决办法
833
查看次数

方案实施 - 这是什么意思?

我是CS的初级学生,我的课程主要是Java.我目前正在通过"Little Schemer"作为自学,并且在找到如何做到这一点的过程中,我发现了许多对Scheme的"实现"的引用.我的问题是,什么是实施?

它们是Scheme的子方言,还是其他东西(DrScheme似乎允许该语言的不同"风味")?它只是包含IDE,解释器,交互式工具等的任何给定生态系统的名称吗?

所有其他语言(例如Java)是否也有各种"实现",还是保留为"开放"语言?

谢谢,

乔斯德拉格

scheme the-little-schemer

6
推荐指数
2
解决办法
770
查看次数

为什么我得到"原子"的未绑定错误?

我试图通过"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方言之间的细微差别正在测试我的耐心.

lisp scheme the-little-schemer mit-scheme

5
推荐指数
1
解决办法
1386
查看次数

匿名函数在Scheme中调用自身的机制?

我正在阅读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"没有递归?

recursion scheme the-little-schemer anonymous-recursion

5
推荐指数
1
解决办法
579
查看次数

使用lambda表达式在Scheme中定义函数的原因是什么?

我正在阅读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.

lambda scheme the-little-schemer

5
推荐指数
1
解决办法
713
查看次数