SICP - "计算机程序的结构和解释"
相同的解释会很好
有人可以解释Metalinguistic Abstraction
我正在阅读SICP,并且作者在计算函数的固定点时研究了平均阻尼技术.我知道在某些情况下,即平方根是必要的,以阻止函数的振荡,y = x/y但我不明白为什么它神奇地帮助定点计算函数的收敛.救命?
编辑
显然,我有点想过这个.我似乎无法理解为什么在重复应用时平均一个函数本身会加速收敛.
我正在阅读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都会调用它.
我的理解有什么问题?我将不胜感激任何反馈,谢谢!
我很困惑,试图在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的语法宏系统会很棒.
在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.我自己无法理解.
我正在读" 计算机程序的结构和解释 "一书,我想逐步编写一个计划解释器.
你知道最容易阅读(和简短)的方案的实施吗?我将在C中制作一个JavaScript.
练习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包.
我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) 我再次观看了一场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)
这让我思考; 令人兴奋的是数据结构?创建语言时,数据结构是作为程序构建的抽象实现的吗?如果它们只是由程序组成,那么最低级别的程序是什么?
我想我想知道的是抽象链底部的东西(除非它恰好是抽象的一直向下).它在什么时候变成了硬件?
sicp ×10
scheme ×8
lisp ×4
abstraction ×1
algorithm ×1
graphviz ×1
javascript ×1
lambda ×1
macros ×1
math ×1