使用MIT-Scheme 9.x,是否有一种方法可以使用调试器或其他工具来检查匿名复合过程(通过返回lambda函数创建),例如,确切地找出它来自哪一行的代码?
例如,我目前正在做类似的事情:
(foo 2 3)
Run Code Online (Sandbox Code Playgroud)
我看到一条错误消息:
;The procedure #[compound-procedure 65] has been called with 2 arguments; it requires exactly 0 arguments.
Run Code Online (Sandbox Code Playgroud)
... foo正在进行一些进一步的调度(foo不是问题,它更深层次).在这个例子中,我真的想知道#[compound-procedure 65]的内部结构,因为它显然不是我的预期.Lisp/Scheme向导是否知道获取这些细节的方法?谢谢.
问题如下,它可以在http://www.cs.indiana.edu/classes/b551-leak/scheme_practice.html中找到.
问题定义:编写一个函数cxr,它是Scheme中提供的car/cdr运算符的泛化.cxr应该取一串"a"和"d"表示要执行的car和cdr操作的序列,并返回一个能够执行该序列的函数.
因此(cxr"ad")相当于函数cadr.
((cxr "ad") '(i ii iii iv v vi vii)) ==> ii
(define sixth (cxr "addddd"))
(sixth '(i ii iii iv v vi vii)) ==> vi
Run Code Online (Sandbox Code Playgroud)
我的尝试:我使用string-append将cxr"ad"转换为字符串"cadr".[这很容易] ..现在我如何在"cadr"与cadr之间建立链接...我尝试了string->符号,但输出被引用,并且该函数从未被执行. - 那么有什么方法可以取消引用吗?!
真正的问题:如何解决这个问题?
更新:感谢所有人的回答.它们都是正确的,我甚至在发布问题之前就已经解决了这个问题.当输入是(cxr adddd)时,我主要是想找到一种实际调用caddddr的方法... Everbody和caddddr一样功能,但实际上并没有调用cadddr.
也就是说,如何使功能与cadr caddr等具有相同的命名类型.
更新:(我想我找到了解决方案,它如下 - 但正如下面所说,它不适用于更长的时间):
(define cxr
(lambda (ad l)
( (eval (string->symbol (string-append "c" ad "r"))) l)
)
)
Run Code Online (Sandbox Code Playgroud) 我对这个例子的结果有点困惑:
(define mk-q
(lambda ()
(let ([l '(x)])
(cons l l))))
(define q (mk-q))
q
=> ((x) x)
(set-car! (cdr q) 'y)
=> ((y) y)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么两个x原子都被set-car!程序所取代(我对结果的第一个猜测是什么((x) y))?
例如:
(define mk-q2
(lambda ()
(let ([l '(x)])
(cons l (cons l l)))))
(define q2 (mk-q2))
(set-car! (cdr q2) 'y)
=> ((x) y x) which fits my understanding of set-car!
Run Code Online (Sandbox Code Playgroud)
为什么x第一个例子中的两个都被替换了?
在JavaScript中,我可以检索函数的"源代码"定义,例如:
?function alert_Hi() {
alert("Hi");
}
alert(alert_Hi);
Run Code Online (Sandbox Code Playgroud)
将返回我输入的内容.http://jsfiddle.net/DuCqJ/
我怎么能在麻省理工学院计划中做到这一点?
我记得看过一些返回的#compound-procedure东西,但我真正想要的是"源代码".
我开始学习Scheme了,我正在尝试实现我自己的max函数,它只给出两个参数的最大值.
我写了这样的函数:
(define (myMax x y) (cond ((> x y) (x)) ((< x y) (y))))
但每次我尝试调用它(myMax 100 40)(例子)我都会收到一条错误消息:
The object 100 is not applicable.
在搜索GNU的MIT-Scheme文档时,他们说:
This type indicates an error in which a program attempted to apply an object that is not a procedure. The object being applied is saved in the datum field, and the arguments being passed to the object are saved as a list in the operands field.
但是那应该是什么意思?
奇怪的是,我实现了一个非常简单的函数,它添加了两个数字,它工作正常,也是一个绝对值函数,工作正常; 难道有条件的搞砸了吗?
谢谢
我不知道Scheme中向量的底层实现,因此不知道如何编写 vector-append!
原型:
(define (vector-append! vect . vects)
; definition here
)
Run Code Online (Sandbox Code Playgroud)
PS首选使用向量列表,因为vector-ref是一个恒定时间操作[src]
所以,我正在努力通过 SICP。第 4 章的第一个练习是:
练习 4.1。请注意,我们无法判断元循环求值器是从左到右还是从右到左计算操作数。它的求值顺序是从底层 Lisp 继承而来的:如果值列表中 cons 的参数是从左到右求值的,那么值列表将从左到右求值;如果 cons 的参数是从右到左计算的,那么值列表将从右到左计算操作数。编写一个从左到右计算操作数的值列表版本,而不管底层 Lisp 中的计算顺序如何。还要编写一个从右到左计算操作数的值列表版本。
原来的功能是
(define (list-of-values exps env)
(if (no-operands? exps)
'()
(cons (eval (first-operand exps) env)
(list-of-values (rest-operands exps) env))))
Run Code Online (Sandbox Code Playgroud)
我的解决方案如下:
;;; left-to-right
(define (list-of-values-l2r exps env)
(if (no-operands? exps)
'()
(let ((first-exp (eval (first-operand exps) env)))
(cons first-exp
(list-of-values-l2r (rest-operands exps) env)))))
;;; right-to-left
(define (list-of-values-r2l exps env)
(list-of-values-l2r (reverse exps) env))
Run Code Online (Sandbox Code Playgroud)
但是,我不确定我所做的是否正确。我的直觉是 let 语句强制执行 eval,有人可以确认吗?
我在查找如何使用Scheme中列表中包含的lambda时遇到了一些麻烦.例如,我有以下代码:
(define abc '((lambda (x) (* x x))))
Run Code Online (Sandbox Code Playgroud)
我想从列表中取出第一个lambda并将其应用于某些数字.这是我到目前为止:
(map (car abc) '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
;The object (lambda (x) (* x x)) is not applicable.
Run Code Online (Sandbox Code Playgroud)
但是,当我直接使用lambda尝试同样的事情时,它的工作原理是:
(map (lambda (x) (* x x)) '(1 2 3))
;Value 15: (1 4 9)
Run Code Online (Sandbox Code Playgroud)
有人能帮助我理解我做错了什么吗?
我正在阅读SICP 4.1.3 Evaluator Data Structures
(define (make-frame variables values)
(cons variables values))
(define (frame-variables frame) (car frame))
(define (frame-values frame) (cdr frame))
(define (add-binding-to-frame! var val frame)
(set-car! frame (cons var (car frame)))
(set-cdr! frame (cons val (cdr frame))))
Run Code Online (Sandbox Code Playgroud)
然而,set-car!据报道,球拍是无界的。
然后尝试了“GNU Guile 2.2.6”的实现,“GNU mit-scheme 10.1.10”,不幸的set-car!是,都没有绑定。
搜索原版全书:
find . -type f -iname "*.org" -exec grep --color -nH --null -e "set-car!" \{\} + |wc -l
27
Run Code Online (Sandbox Code Playgroud)
在第 3、4 和 5 章中出现了 27 次,
在第 3 章中我更改了 setcar!到 …
下面的代码使用欧几里得算法计算 gcd(a,b) 和整数 s, t 使得 sa+tb=gcd(a,b)(对于离散数学课程)。我用 C 编写了它,也许这会清楚地说明算法。
gcd.c :
#include <stdio.h>
int gcd_st(int m, int n, int *s, int *t) {
int a, b, res, tmp;
a = m>n?m:n;
b = m>n?n:m;
if(!b) {
*s = 1;
*t = 0;
return a;
}
res = gcd_st(b, a%b, s, t);
tmp = *t;
*t = *s - *t*(a/b);
*s = tmp;
return res;
}
int main() {
int st[2];
for(int i=0; i<100000000; i++)
gcd_st(42, 56, st, st+1);
for(int i=0; …Run Code Online (Sandbox Code Playgroud) performance scheme language-implementation racket mit-scheme
mit-scheme ×10
scheme ×10
lisp ×4
racket ×3
sicp ×2
debugging ×1
lambda ×1
org-mode ×1
performance ×1
vector ×1