标签: sicp

当您阅读SICP时,您会感到惊讶的概念?

SICP - "计算机程序的结构和解释"

相同的解释会很好

有人可以解释Metalinguistic Abstraction

sicp

8
推荐指数
4
解决办法
5975
查看次数

什么是"计算机程序的结构和解释"的封面图?

计算机程序结构和解释究竟是什么?我的意思是我知道什么是"eval","apply"和'λ'都意味着,但我很难解读剩下的图片.

谁是少女?她为巫师工作吗?为什么她指着桌子?她指着那个小碗型的东西吗?还是书?还是一般的表?她是否试图告诉巫师他应该将某种Lisp巫术应用于桌子或其上的物品?或者她只是告诉他一些平淡无奇的东西,比如他的食物变冷了?

那桌子上的一条腿看起来像......一条腿......最后一只脚(腿往往有)?桌子如何在一条腿上保持平衡?(或者是阴影中的另一条腿?)

[注意:我正在等待一个冗长的构建完成,以防你想知道.]

lisp scheme sicp

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

为什么平均阻尼会神奇地加速定点计算器的收敛?

我正在阅读SICP,并且作者在计算函数的固定点时研究了平均阻尼技术.我知道在某些情况下,即平方根是必要的,以阻止函数的振荡,y = x/y但我不明白为什么它神奇地帮助定点计算函数的收敛.救命?

编辑

显然,我有点想过这个.我似乎无法理解为什么在重复应用时平均一个函数本身会加速收敛.

algorithm math sicp

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

关于SICP的问题chpt 4.1:(analyze expr)如何帮助加速eval?

我正在阅读SICP的以下部分

http://mitpress.mit.edu/sicp/full-text/book/book-ZH-26.html#%_sec_4.1.7

根据文本,以下eval改进将提高性能,因为多次评估的表达式只会被分析一次?

(define (eval exp env)
    ((analyze exp) env))
Run Code Online (Sandbox Code Playgroud)

这是analyze本书中给出的函数:

(define (analyze-if exp)
(let ((pproc (analyze (if-predicate exp)))
    (cproc (analyze (if-consequent exp)))
        (aproc (analyze (if-alternative exp))))
    (lambda (env)
        (if (true? (pproc env))
            (cproc env)
                (aproc env)))))
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这本书说analyze只会运行一次.没有了身体eval,这是((analyze exp) env))基本上是说,每次eval被调用时,analyze将一个名为exp作为它的参数?这意味着analyze每次调用时eval都会调用它.

我的理解有什么问题?我将不胜感激任何反馈,谢谢!

lisp scheme sicp

8
推荐指数
2
解决办法
400
查看次数

你如何写一个MIT Scheme宏来返回一个lambda表单?

我很困惑,试图在MIT Scheme中创建相当于这个简单的(在Common Lisp中)宏:

(defmacro funcify (exp)
    `(lambda (x) ,exp))
Run Code Online (Sandbox Code Playgroud)

这是一个简单的个人项目,一个基于第二次SICP讲座中建立的功能的数值方程求解器.我不在乎这个宏不是"安全"或"卫生",或者如果exp引用除'x之外的任何符号,它将捕获变量.我希望能够写作

(solv '(* 60 x) '(* 90 (- x 1)))
Run Code Online (Sandbox Code Playgroud)

solv在哪里:

(define (solv lh-exp rh-exp)
    (solve (funcify lh-exp) (funcify rh-exp)))
Run Code Online (Sandbox Code Playgroud)

而不是必须打字

(solve (lambda (x) (* 60 x)) (lambda (x) (* 90 (- x 1))))
Run Code Online (Sandbox Code Playgroud)

但无法弄清楚如何使用MIT Scheme语法规则来做到这一点.

我试过这个,但它不起作用:

(define-syntax funcify
  (syntax-rules ()
    ((funcify y) (lambda (x) y))))
;Value: funcify

(funcify x)
;Value 17: #[compound-procedure 17]

((funcify x) 10)
;Unbound variable: x
Run Code Online (Sandbox Code Playgroud)

我尝试过其他可能不值得一提的东西,eval但无济于事.

另外,在Scheme的宏系统上引用了很好的教程(不是引用),从小的简单示例开始并构建,有充分的注释,特别是展示了如何将backquote-comma样式的LISP宏(对我而言非常直观)转换为Scheme的语法宏系统会很棒.

lisp macros scheme sicp

8
推荐指数
2
解决办法
1028
查看次数

在方案中使用lambda而不是let

在SICP 1.2.1中,有一个函数可以生成一个有理数,如下所示:

(define (make-rat n d)
  (let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))
Run Code Online (Sandbox Code Playgroud)

我只是好奇你如何使用lambda而不是let来实现相同的东西,而不需要两次调用GCD.我自己无法理解.

lambda scheme sicp

7
推荐指数
2
解决办法
5129
查看次数

我想实现一个计划翻译来研究SICP

我正在读" 计算机程序的结构和解释 "一书,我想逐步编写一个计划解释器.

你知道最容易阅读(和简短)的方案的实施吗?我将在C中制作一个JavaScript.

javascript lisp scheme implementation sicp

7
推荐指数
2
解决办法
1967
查看次数

SICP练习1.5

练习1.5. Ben Bitdiddle发明了一项测试,以确定他所面临的口译员是使用申请顺序评估还是正常顺序评估.他定义了以下两个程序:

(定义(p)(p))

(define(test xy)(if(= x 0)0 y))

然后他评估表达式

(测试0(p))

Ben使用应用程序订单评估的解释器会观察到什么行为?对于使用正态评估的翻译,他会观察到什么行为?

我理解这个练习的答案; 我的问题在于如何解释(p)与p的关系.例如,(test 0(p))导致解释器挂起(这是预期的),但是(测试0 p)上面的定义立即求值为0.为什么?

而且,假设我们将定义更改为(define(p)p).根据给定的定义,(测试0(p))和(测试0 p)都评估为0.为什么会出现这种情况?为什么翻译不挂?我正在使用Dret博士和SICP​​包.

scheme sicp

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

如何使用方案宏来显示评估树

count-change在SICP中修改了函数的代码,以便在函数recurses时显示一对.该对是形式"(cc a k)" -> "(cc a (- k 1))""(cc a k)" -> "(cc (- a (d k)) k)",我的目标是建立一个DOT文件,以使用GraphViz显示树递归.

这是一个示例图像,由以下代码生成: 在此输入图像描述

这是方案代码:

    ; Count Change

    (define (count-change amount)
      (cc amount 5))

    (define (cc amount kinds-of-coins)
      (begin
        (cond ((= amount 0) 1)
          ((or (< amount 0) (= kinds-of-coins 0)) 0)
          (else (+ 
             (begin 
               (display "\"")
               (display `(cc ,amount ,kinds-of-coins))
               (display "\"")
               (display " -> ")
               (display "\"")
               (display `(cc ,amount ,(- kinds-of-coins 1)))
               (display "\"")
               (display "\n") …
Run Code Online (Sandbox Code Playgroud)

scheme sicp graphviz

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

什么是最低级别的数据结构?

我再次观看了一场SICP讲座,其中Sussman演示了如何实施Scheme cons car并且只cdr使用procudures.

它是这样的:

(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))
Run Code Online (Sandbox Code Playgroud)

这让我思考; 令人兴奋的是数据结构?创建语言时,数据结构是作为程序构建的抽象实现的吗?如果它们只是由程序组成,那么最低级别的程序是什么?

我想我想知道的是抽象链底部的东西(除非它恰好是抽象的一直向下).它在什么时候变成了硬件?

scheme abstraction sicp data-structures

7
推荐指数
2
解决办法
474
查看次数