标签: sicp

如何在 DrScheme 中包含文件?

我正在使用 DrScheme 来完成 SICP,并且我注意到某些过程(例如square)被反复使用。我想将它们放在一个单独的文件中,以便我可以将它们包含在其他程序中,而不必每次都重写它们,但我似乎不知道如何做到这一点。

我试过了:

(load filename)
(load (filename))
(load ~/path-to-directory/filename)
(require filename)
(require ~/path-to-directory/filename)
(require path-from-root/filename)
Run Code Online (Sandbox Code Playgroud)

这些都不起作用。显然我正在抓住救命稻草——非常感谢任何帮助。

sicp racket

3
推荐指数
1
解决办法
4588
查看次数

SICP车/ cdr练习题问题

我在这里为SICP尝试这个"在线辅导员":http://icampustutor.csail.mit.edu/6.001-public/tutor.cgi?op = registration-page

我正在看下面的问题:

假设我们已经评估了表单

(define thing (cons (cons (cons 1 nil) nil)
                    (cons (cons 2 (cons 3 (cons 4 nil)))
                          (cons 2
                               (cons 3 nil))))) Write expressions
Run Code Online (Sandbox Code Playgroud)

仅使用car,cdr和其值为下面给出的列表结构的东西.

(1)
1
(2 3)
(3)

我遇到了最后一个问题.我想出了一种使用反引号和非引号的方法,但是在线教程不接受答案.使用鸡计划的翻译:

#;3> (define nil '())
#;4>  (define thing (cons (cons (cons 1 nil) nil)
--->                         (cons (cons 2 (cons 3 (cons 4 nil)))
--->                               (cons 2
--->                                    (cons 3 nil)))))
#;5> 
#;5> thing
(((1)) (2 3 4) 2 3)

#;25> `(,(car(cdr(car(cdr thing)))))
(3)
Run Code Online (Sandbox Code Playgroud)

还有另一种方法吗?

lisp scheme sicp

3
推荐指数
1
解决办法
413
查看次数

Metacircular评估员,实施环境

我正在尝试根据Harold Abelson和Gerald Jay Sussman着名的"计算机程序的结构和解释"一书中的方案实施Metacircular Evaluator.

http://mitpress.mit.edu/sicp/full-text/sicp/book/node79.html,http://mitpress.mit.edu/sicp/full-text/sicp/book/node80.html

作者建议以这种方式设置环境:

(define (define-variable! var val env)
  (let ((frame (first-frame env)))
    (define (scan vars vals)
      (cond ((null? vars)
             (add-binding-to-frame! var val frame))
            ((eq? var (car vars))
             (set-car! vals val))
            (else (scan (cdr vars) (cdr vals)))))
    (scan (frame-variables frame)
          (frame-values frame))))

(define (setup-environment)
  (let ((initial-env
         (extend-environment (primitive-procedure-names)
                             (primitive-procedure-objects)
                             the-empty-environment)))
    (define-variable! 'true true initial-env)
    (define-variable! 'false false initial-env)
    initial-env))
Run Code Online (Sandbox Code Playgroud)

但是,我无法理解为什么

(define myenv (setup-environment))
Run Code Online (Sandbox Code Playgroud)

应该像我们在Scheme中所期望的那样工作,因为,据我所知,Scheme默认情况下将变量按值传递给函数,因此在将"define-variable!"应用于initial-env两次之后,每次都不会更改initial-env ,并且setup-environment函数将在extend-environment返回时返回值.

我的理解错误在哪里,你能告诉我吗?

先感谢您!

lisp scheme interpreter sicp metacircular

3
推荐指数
1
解决办法
494
查看次数

Racket是否支持内部"定义"?

我是功能语言的新手,我正在使用Racket进行SICP编程任务.

下面是一段代码,Racket告诉我define: expected only one expression for the function body, but found 5 extra parts,在第5行((define (y k))中:

(define (simpson f a b n)

 (define h (/ (- b a) n))

 (define (y k)
  (f (+ a (* k h))))

 (define (factor k)
  (cond ((or (= k 0) (= k n))
         1)
   ((odd? k)
    4)
   (else
    2)))

 (define (term k)
  (* (factor k)
   (y k)))

 (define (next k)
  (+ k 1))

(if (not (even? n))
 (error "n …
Run Code Online (Sandbox Code Playgroud)

scheme sicp racket

3
推荐指数
1
解决办法
1327
查看次数

使用 DrRacket 运行 SICP 第 3.5.4 节中的代码

我在运行 SICP(计算机程序的结构和解释)第 3.5.4 节(流和延迟评估)中的示例代码时遇到问题;SICP 部分可以在这里找到:http ://mitpress.mit.edu/sicp/full-text/book/book-ZH-24.html#%_sec_3.5.4 。

我正在使用 DrRacket 5.2.1 版,由 Neil Van Dyke ( SICP PLaneT 1.17 )使用 SICP 支持语言设置,可以在这里找到:http : //www.neilvandyke.org/racket-sicp/#%28part ._安装%29

下面显示的代码使用了流。随着环境设置如上,手续cons-streamforcedelay已经可以从DrRacket。但是,stream-carstream-cdr无法获得; 所以,我必须定义它们。在下面的代码,我也定义了一些通用的流函数:stream-mapstream-refadd-streamsscale-stream

我试图使工作的整个代码如下。它包括solve使用积分程序 ( integral)数值求解一阶微分方程 ( ) 的程序,该程序使用延迟参数 ( delayed-integrand);这些程序来自第 3.5.4 节。

(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))
(define (stream-map proc . argstreams)
  (if (stream-null? (car …
Run Code Online (Sandbox Code Playgroud)

scheme sicp racket

3
推荐指数
1
解决办法
1684
查看次数

逻辑运算符可以使用尾递归吗

(define (fast-prime? n times)
  (cond ((= times 0) true)
        ((fermat-test n) (fast-prime? n (- times 1)))
        (else false)))
Run Code Online (Sandbox Code Playgroud)

此代码来自SICP,第 1.2.6 章。该过程使用tail-recursion,因此在计算时不会导致线性递归,换句话说,它是迭代的。如果我使用or / and而不是cond重写过程,会导致线性递归吗?

(define (fast-prime? n times)
  (or (= times 0)
      (and (fermat-test n) (fast-prime? n (- times 1)))))
Run Code Online (Sandbox Code Playgroud)

lisp recursion scheme sicp

3
推荐指数
1
解决办法
83
查看次数

applicative-order/call-by-value 和 normal-order/call-by-name 的区别

背景

我正在根据在线课程学习 sicp,但对它的讲义感到困惑。在讲义中,applicative order 似乎等于 cbv 和 normal order 等于 cbn。

困惑

但是wiki指出,除了求值顺序(从左到右,从右到左,或者同时),applicative order和cbv是有区别的:

与按值调用不同,应用顺序评估在应用函数之前尽可能地减少函数体内的术语。

我不明白减少是什么意思。在进入函数计算之前,应用顺序和 cbv 都不会获得变量的确切值。

而对于正常的顺序和cbv,根据wiki,我更加困惑。

相比之下,按名称调用策略不会在未应用的函数体内求值。

我猜这是否意味着正常顺序会在未应用的函数体内进行评估。怎么会这样?

  1. 有人能给我一些关于四种策略的更具体的定义吗?
  2. 有人可以使用任何编程语言为每种策略展示一个示例。

非常感谢?

evaluation scheme programming-languages sicp operator-precedence

3
推荐指数
1
解决办法
1268
查看次数

是否可以更改DrRacket/Scheme搜索/引用库的顺序?

我按照SICP 3.3.3的说明创建一个表.

这是code_0.scm:

;code_0.scm
#lang scheme
(require rnrs/base-6)
(require rnrs/mutable-pairs-6)

(define nil '())

(define (make-table)
  (list '*table*))

(define (assoc key records)
  (cond ((null? records)
         false)
        ((equal? key (caar records))
         (car records))
        (else
         (assoc key (cdr records)))))

(define (insert! key value table)
  (let ((record (assoc key (cdr table))))
    (if record
        (set-cdr! record value)
        (set-cdr! table
                  (cons (cons key value)
                        (cdr table)))))
  'OK)

(define (lookup key table)
  (let ((record (assoc key (cdr table))))
    (if record
        (cdr record)
        false)))


(define table …
Run Code Online (Sandbox Code Playgroud)

scheme sicp racket

3
推荐指数
1
解决办法
633
查看次数

SICP中`flatmap`的意义是什么?

(define (accumulate op initial sequence) 
  (if (null? sequence) 
   initial 
   (op (car sequence) 
     (accumulate op initial (cdr sequence))))) 
      
(define (flatmap proc seq) 
  (accumulate append nil (map proc seq)))
Run Code Online (Sandbox Code Playgroud)

以上是来自 SICP 的代码片段,在 Scheme 中。为什么flatmap需要这个程序?flatmap和 和有map什么区别?

scheme sicp flatmap map-function

3
推荐指数
1
解决办法
983
查看次数

支持set-car的方案!并设置-cdr!在 scp

我正在阅读SICP 4.1.3 Evaluator Data Structures

(define (make-frame variables values)
  (cons variables values))
(define (frame-variables frame) (car frame))
(define (frame-values frame) (cdr frame))
(define (add-binding-to-frame! var val frame)
  (set-car! frame (cons var (car frame)))
  (set-cdr! frame (cons val (cdr frame))))
Run Code Online (Sandbox Code Playgroud)

然而,set-car!据报道,球拍是无界的。

然后尝试了“GNU Guile 2.2.6”的实现,“GNU mit-scheme 10.1.10”,不幸的set-car!是,都没有绑定。

搜索原版全书:

find . -type f -iname "*.org"  -exec grep --color -nH --null -e "set-car!" \{\} + |wc -l
27 
Run Code Online (Sandbox Code Playgroud)

在第 3、4 和 5 章中出现了 27 次,
在第 3 章中我更改了 setcar!到 …

scheme sicp org-mode racket mit-scheme

3
推荐指数
1
解决办法
198
查看次数