- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在分析有关使用 call/cc
的代码.这个函数有点神秘,要完全理解它是相当复杂的。
我真的无法理解这段代码是如何工作的。下面是我的解读。
(define (print+sub x y)
(display x)
(display " ")
(display y)
(display " -> ")
(- x y))
(define (puzzle)
(call/cc (lambda (exit)
(define (local e)
(call/cc
(lambda (local-exit)
(exit (print+sub e
(call/cc
(lambda (new-exit)
(set! exit new-exit)
(local-exit #f))))))))
(local 6)
(exit 2))))
(define x (puzzle))
call/cc
通过调用
call/cc (lambda(exit))
然后再次通过
(call/cc
(lambda (local-exit)
函数
local
使用参数
6
调用传递给
print+sub
如
x
.但是值如何
2
到达
print+sub
如
y
?
最佳答案
调用 (puzzle)
建立延续 exit
这样调用 (exit val)
就像那个电话(puzzle)
一样刚刚返回的那个val
值(value)。
然后打电话(local 6)
制作。它设置了一个延续 local-exit
这样调用 (local-exit val2)
就像那个电话(local 6)
一样刚刚返回的那个val2
值(value)。当然,返回值被忽略,下一个调用,(exit 2)
接下来会制作。
现在,设置后local-exit
,电话(exit (print+sub e ...))
制作。它需要找出值 val3
的 (print+sub e ...)
首先,它可以将它传递给调用 (exit val3)
.print+sub
需要两个参数。该调用有两个必须计算的表达式,因此找到的值(如果有)将作为 x
传递。和 y
至 print+sub
.
正在评估 e
很简单。是6
.
评估第二个表达式,(call/cc (lambda (new-exit) ...))
, 设置另一个延续, new-exit
, 这样调用 (new-exit y)
相当于返回 y
进入那个插槽 {y}
在电话中等待 (print+sub 6 {y})
.
然后 body
(lambda (new-exit)
(set! exit new-exit)
(local-exit #f))
被输入。
(set! exit new-exit)
更改任何调用的含义
(exit val)
从今往后一样
(new-exit val)
改为调用。
(local-exit #f)
叫做。它跳出
(local 6)
打电话,立即返回
#f
,然后被忽略。来电
(exit 2)
制作。就好像打电话
(new-exit 2)
一样被制作。这意味着返回
2
成
{y}
插槽,所以调用
(print+sub e 2)
内(exit (print+sub e 2))
现在执行。
print+sub
打印它打印的内容并返回
4
,所以
(exit 4)
现在被称为。
exit
的值是多少?用在这里?是不是原版
exit
延续,或改变的,
new-exit
?
(foo a1 a2 ... an)
foo
首先评估,然后
ai
s 以未指定的顺序计算,然后函数值应用于
n
刚刚找到的参数值。这意味着这个
exit
被称为原
exit
继续,所以值
4
作为原始调用的最终值返回
(puzzle)
(这就是 DrRacket 中真正发生的事情)。
exit
实际上可能是
new-exit
现在。因此调用它会导致无限循环。这不是 DrRacket 中发生的事情。
exit
与
(lambda (v) (exit v))
,
((lambda (v) (exit v))
(print+sub e
(call/cc
(lambda (new-exit)
(set! exit new-exit)
(local-exit #f))))))))
代码确实进入了无限循环。
GOTO
)。当我们有一些像
...... (foo) .....
这样的代码时具有正常功能
foo
,当评价
foo
结束,根据那里写的内容,返回的值在该代码中进一步使用。
puzzle
用作
foo
,评估过程相同。 Scheme试图找出
puzzle
的返回值在周围的代码中进一步使用它。
puzzle
电话
call/cc
立即,所以它创建了这个标记,一个
GOTO
标签去,以便当/如果/深入内部
puzzle
拨打
(exit 42)
,控件跳转到 - 转到 - 那个标记,那个标签,以及
42
用作返回值。
(puzzle)
一个电话
(exit 42)
,它与调用
(puzzle)
的效果相同。刚刚带着
42
回来了作为其周围代码的返回值,而无需遍历
puzzle
中的所有剩余代码.
let/cc
可以更容易地阅读代码。 ,或等效的宏:
(define-syntax with-current-continuation ; let/cc
(syntax-rules ()
((_ c a b ...)
(call/cc (lambda (c) a b ...)))))
(define (puzzle2)
(let/cc exit ; --->>--------------->>------------>>-------------.
(define (local e) ; |
(let/cc local-exit ; --->>----------------------------. |
(exit (print+sub e ; | |
(let/cc new-exit ; -->>----. | |
(set! exit new-exit) ; | | |
(local-exit #f)) ; | | |
;; --<<-----* | |
))) ; | |
;; --<<-----------------<<--------* |
) ; |
(local 6) ; |
(exit 2)) ; |
;; --<<---------------<<------------------<<-----------*
)
假设您在调试器中,并且在每个
let/cc
的右括号上放置了一个断点。形式。每个延续,如果被调用,直接跳转到它的定义
let/cc
的结束括号,以便传递的值在后续计算中用作该表达式的返回值。基本上就是这样。
关于scheme - 调用 cc 示例 Racket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65305036/
我意识到“强类型”和“软类型”的定义是松散且易于解释的,但我还没有找到关于无类型 Racket (根据我的理解意味着动态类型)和类型 Racket 的明确定义。 再一次,我确定它不是那么简单和干燥,但
我来自 Java 和 Python,很难理解面向对象代码在 Racket 中的工作方式。 给定 (define food% (class object% (super-new) (i
我安装了 Sublime Text - Racket Package,但没有用。出现此错误。我该怎么办。 [Errno 2] No such file or directory: 'racke
.rkt是“常规”Racket 源代码的常规文件扩展名。在文档中,我还看到了 .rktl 和 .rkts 正在使用。什么是.rktl和 .rkts用于,还有我不知道的更多 Racket 文件扩展名吗?
假设我为具有“中心”的集合定义了一个结构体。 (struct centered-set (center elems)) 我想保证以下条件。 elems是一个集合。 center是 elems 的成员(
我想要一个函数,它接受一个字符串,由一个 python 格式的树组成,就像这样 "[0, [1, 0]]" 并输出一个可用的 Racket 列表,像这样 '(0 (1 0)) 我的第一步是将字符串转换
是否有 Racket 内置函数列表?我正在寻找类似 this one 的列表对于 python 。我似乎无法在文档中找到一个。 最佳答案 这里有一些列表: Racket文档中所有函数的索引: http
虽然 Racket 允许创建 GUI 应用程序(甚至游戏),但我想知道它是否适合与 Things 一样在视觉上发布商业应用程序或 OmniOutliner .这样的应用程序会感觉原生还是看起来像一个不
和node的npm一样,我们使用package.json来解决依赖。 我试过raco pkg,它似乎只是一种开发/发布包的方式,而不是解决外部依赖。 最佳答案 如上所述,Racket 中的 info.
我是 Racket 的新手,尽管到目前为止我已经设法使用 servlet 并让一些东西发挥作用。我现在想做的是验证一个简单的用户名/密码 POST 请求。我已经通过“web-server/formle
我正在为现场编码表演创建一个程序,为此我需要一个基本的 S 表达式代码编辑器(我输入的内容将在适当的语法上下文中评估为 Racket 代码)。 由于 DrRacket 本身是用 Racket 编写的,
和node的npm一样,我们使用package.json来解决依赖。 我试过raco pkg,它似乎只是一种开发/发布包的方式,而不是解决外部依赖。 最佳答案 如上所述,Racket 中的 info.
我正在尝试在 Racket 中编写模块元语言 mylang ,它接受将修改后的主体传递给的第二种语言,例如: (module foo mylang typed/racket body) 相当于: (m
我没有运气找到一种方法来按照我想要的方式进行这项工作,所以如果有人能提供帮助,我将不胜感激。 我想要的是能够在终端上做到这一点: > racket 然后能够输入 Racket 命令并让它们编译。像,
我来自 Java 世界,对 Racket 充满热情。 想知道类似Maven的工具在哪里。如果你不熟悉Maven,还有Scala中的SBT,Android中的gradle,Elixir中的mix等,作为
在 typed/racket 我有一个像 [(? procedure? p ) (apply p xv*)]会导致错误: Type Checker: Function has no cases in:
我是 Lisp-scheme 的新手,对整个函数范式还很陌生,我目前正在做一个任务,要求我重载一个名称相同但参数集不同的函数 racket .下面是我试图实现的一个例子: #lang racket (
有没有办法在 Racket 中获取对象的唯一标识符?例如,当我们使用 Racket 的 eq?运算符来检查两个变量是否指向同一个对象,它使用什么标识符来实现这种比较? 我正在寻找类似 python 的
当我在 Dr. Racket 或从命令行运行我的测试时,失败的测试总是在一行上。 例如, (bad (interp-t-prog (list '(class posn extends object (
我有以下代码: (plot (function sin (- pi) pi #:label "y = sin(x)")) 但是在解决 SICP 时我没有遇到这样的结构:#:label "y = sin
我是一名优秀的程序员,十分优秀!