标签: scheme

方案 if 语句。为什么这个显示语句没有运行?

我正在运行以下代码:

(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?

lisp scheme functional-programming

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

我在 SICP 练习 3.16 中看到的每个解决方案似乎都是通过创建超过三对来作弊的。我的理解错在哪里?

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. 3
  2. 4
  3. 7
  4. 永远不要回来。

任务#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)

scheme list sicp cons

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

计划关闭是如何正式定义的?

我\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))))\n
Run Code Online (Sandbox Code Playgroud)\n

然后将其赋值给一个变量

\n
(define bar (foo))\n
Run Code Online (Sandbox Code Playgroud)\n

按什么顺序评估?从我\xe2\x80\x99所看到的,当foo声明时,它存储一个指向父环境的指针,并声明它自己的环境。如果我调用(bar),我应该立即替换到保存的本地环境中吗?

\n

scheme closures racket

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

什么不是 S 表达式?

我很困惑 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 表达式。

lisp scheme racket

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

SICP 练习 1.8 - 为什么我的函数没有终止?

我正在尝试实现立方根的牛顿法,但我的函数似乎挂起。我的代码与书中显示的平方根代码几乎相同,并根据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)

我进行了独立测试improvegood-enough?他们似乎给出了正确的答案。有人知道为什么我的代码不终止吗?

我在 Racket 中对sicp包进行此操作,以防产生任何影响。

scheme sicp racket

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

做任何一个使用Dr方案编程?如何使用列表排序?

用于在dr方案中对n个数字进行排序的数据结构我不允许使用向量和结构..如果我使用列表我无法编辑列表值.所以我如何排序n个数字.我使用的语言是文本mzscheme rsr5

scheme racket

0
推荐指数
1
解决办法
8677
查看次数

Scheme如何获取列表中的第一项?

说我想要列出第一项 '(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个项目

我怎样才能做到这一点?如果我需要自己写这个第一个功能?

scheme list

0
推荐指数
1
解决办法
7975
查看次数

Scheme初学者问题

我想在Dr.Scheme中提出以下声明:

{with {x {+ 5 5}} {+ xx}}

但是我收到一个错误:

expand:模块中的未绑定标识符:with

有谁可以帮助我?谢谢.

scheme racket

0
推荐指数
1
解决办法
307
查看次数

0
推荐指数
1
解决办法
140
查看次数

缓存以前的方案中的过程返回值

在"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中用"状态"变量一样?

scheme

0
推荐指数
1
解决办法
261
查看次数