我正在运行以下代码:
(define (myignore x)
0
)
(define (myinterpreter mylist)
(evaluate mylist)
)
(define (evaluate mylist)
(if (eqv? (car mylist) 'prog)
(evaluate (cdr mylist))
(display (integer? (car mylist)))
(if (integer? (car mylist))
(display "YESSS")
)
)
(if (eqv? (car mylist) 'myignore)
(myignore (cdr mylist))
)
)
(myinterpreter '(prog 5))
Run Code Online (Sandbox Code Playgroud)
我想知道为什么包含 (display ("YESSS")) 的行不运行,尽管 (display (integer? (car mylist))) 在该行运行之前等于 true?
SICP 练习 3.16为读者提供了一个计算列表结构中的对数的完整过程:
(define (count-pairs x)
(if (not (pair? x))
0
(+ (count-pairs (car x))
(count-pairs (cdr x))
1)))
Run Code Online (Sandbox Code Playgroud)
然后,它要求读者创建由三对组成的列表结构,使该过程返回:
任务#1 和#4 很简单;只需制作一个包含三个元素的普通列表并制作一个循环列表即可。然而,对于任务 #2 和 #4,我见过的每个解决方案似乎都通过创建超过三对来作弊。例如,Scheme Wiki给出了这些:
(define x '(foo))
(define y (cons x x))
(define str2 (list y))
(count-pairs str2) ; 4
(define x '(foo))
(define y (cons x x))
(define str3 (cons y y))
(count-pairs str3) ; 7
(define second (cons 'a 'b))
(define third (cons 'a 'b))
(define …Run Code Online (Sandbox Code Playgroud) 我\xe2\x80\x99最近冒险进入了编写Scheme解释器的伟大领域,并且我\xe2\x80\x99遇到了一个障碍:闭包。据我了解,它们封装了一个本地环境,其中包含一个每次调用闭包时都会恢复的过程(这可能不完全正确)。我在网上任何地方都能找到的问题是如何正式定义闭包,即在 EBNF 语法中。我见过的大多数例子都说闭包是一个零参数的过程,它有一个嵌套在 let 表达式中的 lambda 表达式。这是定义Scheme闭包的唯一方法吗?更重要的是,如果\xe2\x80\x99s没有正式的方法来正式定义闭包,那么你实际上如何解释它?如果将所有 let 表达式转换为 lambda 会发生什么?例如,如果我这样声明一个闭包
\n(define (foo) (let ((y 0)) (\xce\xbb (x) (\xe2\x80\xa6))))\nRun Code Online (Sandbox Code Playgroud)\n然后将其赋值给一个变量
\n(define bar (foo))\nRun Code Online (Sandbox Code Playgroud)\n按什么顺序评估?从我\xe2\x80\x99所看到的,当foo声明时,它存储一个指向父环境的指针,并声明它自己的环境。如果我调用(bar),我应该立即替换到保存的本地环境中吗?
我很困惑 S-Expression 不是什么?
在scheme/racket中,任何带有define的东西都不是S表达式:
(define a 2)
(define (my-print x)
(println x))
Run Code Online (Sandbox Code Playgroud)
或者也许这只是不评估“价值”的事情?喜欢导入和评论吗?:
#lang racket/base
; and comments?
Run Code Online (Sandbox Code Playgroud)
我不确定我是否真的理解哪些东西不符合 s 表达式?
只是想更好地理解 S 表达式。
我正在尝试实现立方根的牛顿法,但我的函数似乎挂起。我的代码与书中显示的平方根代码几乎相同,并根据improve需要修改了函数。
这是我的代码...
(define (cube-root x)
(cube-root-iter 1.0 x))
(define (cube-root-iter guess x)
(if (good-enough? guess x)
guess
(cube-root-iter (improve x guess) x)
)
)
(define (good-enough? guess x)
(< (abs (- (* guess guess) x)) 0.001))
(define (improve x guess)
(/ (+ (/ x (* guess guess)) (* 2 guess)) 3)
)
Run Code Online (Sandbox Code Playgroud)
我进行了独立测试improve,good-enough?他们似乎给出了正确的答案。有人知道为什么我的代码不终止吗?
我在 Racket 中对sicp包进行此操作,以防产生任何影响。
用于在dr方案中对n个数字进行排序的数据结构我不允许使用向量和结构..如果我使用列表我无法编辑列表值.所以我如何排序n个数字.我使用的语言是文本mzscheme rsr5
说我想要列出第一项 '(4 3 1) '(5 6 8)
我想要这样的东西
(first '(4 3 1) '(5 6 8))
Run Code Online (Sandbox Code Playgroud)
应该给我第一个项目
(4 3 1)
Run Code Online (Sandbox Code Playgroud)
结果.在我可以调用的方案内置函数中是否有这样的东西?
汽车不起作用,因为它只返回1列表中的第一项
list-ref不起作用,上面同样的原因,在列表中返回1个项目
我怎样才能做到这一点?如果我需要自己写这个第一个功能?
我想在Dr.Scheme中提出以下声明:
{with {x {+ 5 5}} {+ xx}}
但是我收到一个错误:
expand:模块中的未绑定标识符:with
有谁可以帮助我?谢谢.
将'cond'改为特殊形式而不是语法糖会有什么样的优势?
在"The Seasoned Schemer"的第16章中,作者定义了一个递归过程"depth",它返回'嵌套在n个列表中的披萨,例如(深度3)是(((披萨))).然后他们将其改进为"depthM",使用set缓存其返回值!在列表Ns和Rs中,它们共同形成一个查找表,因此如果达到之前看到的返回值,则不必一直向下递减.例如,如果我已经计算过(depthM 8),当我稍后计算(depthM 9)时,我只查找(depthM 8)的返回值并将其缩小为null,而不是一直递归到(depthM 0) .
但随后他们在程序中移动Ns和Rs,并用"let"将它们初始化为null.为什么这不能完全破坏缓存返回值的点?从一些实验来看,似乎Ns和Rs在每次调用"depthM"时都会重新初始化.
我误解了他们的观点吗?
我想我的问题是这样的:在Scheme中有没有办法让词法范围的变量在调用过程之间保留它们的值,就像在Perl 5.10中用"状态"变量一样?