标签: mit-scheme

使用MIT-Scheme,有没有办法检查复合过程对象?

使用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向导是否知道获取这些细节的方法?谢谢.

lisp debugging scheme mit-scheme

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

如何在方案中将字符串作为函数名传递?[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)

scheme mit-scheme

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

设置的车!并用计划语言

我对这个例子的结果有点困惑:

(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第一个例子中的两个都被替换了?

lisp scheme racket mit-scheme

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

如何在MIT Scheme中获取我的函数定义?

在JavaScript中,我可以检索函数的"源代码"定义,例如:

?function alert_Hi() {
    alert("Hi");
}

alert(alert_Hi);
Run Code Online (Sandbox Code Playgroud)

将返回我输入的内容.http://jsfiddle.net/DuCqJ/

我怎么能在麻省理工学院计划中做到这一点?

我记得看过一些返回的#compound-procedure东西,但我真正想要的是"源代码".

scheme mit-scheme

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

方案参数不适用

我开始学习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.
但是那应该是什么意思?

奇怪的是,我实现了一个非常简单的函数,它添加了两个数字,它工作正常,也是一个绝对值函数,工作正常; 难道有条件的搞砸了吗?

谢谢

lisp scheme functional-programming mit-scheme

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

通过附加向量在方案中突变向量

我不知道Scheme中向量的底层实现,因此不知道如何编写 vector-append!

原型:

(define (vector-append! vect . vects)
  ; definition here 
  )
Run Code Online (Sandbox Code Playgroud)

PS首选使用向量列表,因为vector-ref是一个恒定时间操作[src]

scheme functional-programming vector mit-scheme

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

评估顺序,SICP 练习

所以,我正在努力通过 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 sicp mit-scheme

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

如何在Scheme中的列表中使用lambdas

我在查找如何使用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)

有人能帮助我理解我做错了什么吗?

lisp lambda scheme higher-order-functions mit-scheme

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

支持set-car的方案!并设置-cdr!在 scp

我正在阅读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!到 …

scheme sicp org-mode racket mit-scheme

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

为什么 Racket 实现比 MIT Scheme 快这么多?

下面的代码使用欧几里得算法计算 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

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