在工作中,我在尝试使用Scheme实现配置脚本时遇到了一个基本问题.为了避免发明一种人为的和受限制的语言,脚本应该包含实际的代码.稍后将对此代码进行评估.要使配置按需工作,必须能够访问某些变量.这些变量仅在评估的上下文中已知.因此,必须在当前环境中评估配置脚本.这是我所说的一个原始的例子:
(let ((a #t))
(wr "a is ..."
(eval '(if a "true" "false"))))
Run Code Online (Sandbox Code Playgroud)
运行此代码时,我总是收到一条错误消息,告诉我变量'a'未知.所以问题是:你知道如何评估当前环境中的冻结代码吗?
PS:我使用bigloo编译器.
/////////////////////////////////////////////编辑:/// ////////////////////////////////////////////////// /
当使用Chris建议的方法时,我遇到了另一个有趣的问题,即case关键字的用法.以下两个示例都使用相同的case结构,它应该触发输出"yes!".线.不幸的是,他们表现得不同
通常 - >输出是"是的!" 正如所料:
(define testit "test")
(case testit
(("test")
(begin (newline) (write "yes!") (newline)))
(else
(begin (newline) (write "no!") (newline)))))
Run Code Online (Sandbox Code Playgroud)
使用eval - >输出令人惊讶地"不":
(define env (null-environment 5))
(eval '(define testit "test") env)
(eval '(case testit
(("test")
(begin (newline) (write "yes!") (newline)))
(else
(begin (newline) (write "no!") (newline)))))
Run Code Online (Sandbox Code Playgroud)
这有任何意义吗?
在Racket中,我试图在"cond"语句中打印多个表达式,如下所示,
(let ((var `(make))
(exp '(1 2)))
(cond
[(number? 2) `(hi ,var)
`(bye ,exp)]))
Run Code Online (Sandbox Code Playgroud)
但只有"再见"声明被返回/打印在屏幕上.第一个"hi"根本没有被删除.我如何退回/打印两者?
我正在尝试编写一个计划程序,它将标记列表作为输入,并将输出作为等级列表.
我到目前为止,...我不知道什么是错的我得到一个错误,对象()作为第一个参数传递给cdr不是正确的类型....
这是代码
(define (grades list1)
(cons (cond ((= (car list1) 100) 'S)
((= (car list1) 90) 'A))
(cons (grades (cdr list1)) '())))
Run Code Online (Sandbox Code Playgroud) 假设我在R 5 RS方案中有以下宏:
(define-syntax pair-test
(syntax-rules ()
((_ (a b . c))
(quote (a b . c)))))
Run Code Online (Sandbox Code Playgroud)
宏将输入对转换为输出对,正如人们所期望的那样:
(pair-test (1 2 . 3))
==> (1 2 . 3)
Run Code Online (Sandbox Code Playgroud)
我也可以将规则传递给宏,如规范允许的那样.但是,输出是列表而不是一对:
(pair-test (1 2 3))
==> (1 2 3)
Run Code Online (Sandbox Code Playgroud)
到底发生了什么?为什么输出是列表而不是一对?
假设我在Scheme中有一个列表列表,如下所示:
(define a-list (list (list a b) (list c d) (list e f) (list g h) (list i j)))
Run Code Online (Sandbox Code Playgroud)
我将如何定义一个消耗此列表的函数,以便我可以使用另一个函数来使用列表中的每个字母?
例如,我有另一个功能
(define (smorg a)
(...))
Run Code Online (Sandbox Code Playgroud)
那么,我怎么去做smorg a,smorg b,smorg c ......?
我的列表抓取用户输入,并创建一个列表 - 此列表以字符为单位.
我想能够检查是否(car myList)是一个性格像#\1或者#\2,然后更改名单的车进1或2.
我正在使用DrRacket.
到目前为止,这个问题一直试图打电话给(set! (car myList) 1)或(list-set! (car myList) 1 )
两者都是我环境中未定义的引用.
我刚刚开始参与计划,参加大学任务.
如果有人有时间,任何帮助将不胜感激
谢谢
寻找一个类似于以下内容的函数:
(foo 3 2) => '( ( (1 1) (1 2) (1 3) )
( (2 1) (2 2) (2 3) ) )
Run Code Online (Sandbox Code Playgroud)
DrRacket中是否有任何内置函数可以实现这一功能?
好的,我正在大学上学这门课程,我们刚刚完成了第一次任务.我遇到了这个奇怪的事情.有时程序会冻结,绝对不做任何事情而不给我任何形式的警告,为什么这是......
采取以下程序:
(define (calc-week-day y1 m d w y2) ; anta y2 > y1
(define (days-between-months m1 m2 y)
(if (= m1 m2)
0
(+ (month-length y m1) (days-between-months (+ m1 1) m2 y))))
(define (days-between-years y1 y2)
(if (= y1 y2)
0
(+ (year-length y1) (days-between-years (+ y1 1) y2))))
(define (days-til-months-end d m y)
(- (month-length y m) d))
(define (calculate-day day offset)
(cond ((> day 6) (calculate-day 0 (- offset 1)))
((= offset 0) day)
(else (calculate-day …Run Code Online (Sandbox Code Playgroud) 我正在尝试添加列表中的所有奇数元素.
我无法弄清楚出了什么问题.它适用于所有赔率的列表,但如果甚至只有一个偶数,则会导致错误 - 它表示它期望一个数字作为第二个元素,而是传入一个列表,这不应该发生.
我的代码出了什么问题?
(define list-sum-odd
(lambda (list)
(cond
((null? list)
0)
((odd? (car list))
(+ (car list) (list-sum-odd (cdr list))))
(list-sum-odd
(cdr list)))))
Run Code Online (Sandbox Code Playgroud) 我的《编程范例》教科书,《编程语言基础》(第3版)第1章有一个练习:
练习1.12
通过用subst-in-s-exp的定义代替它的定义并简化生成的过程,消除对subst-in-s-exp的一次调用。结果将是不需要subst-in-s-exp的subst版本。这项技术称为内联,用于优化编译器。
原始代码将具有两个功能:subst并且subst-in-sexp基本上将输入符号中所有出现的旧符号替换为新符号。
(define subst
(lambda (new old slist)
(if (null? slist) '()
(cons
(subst-in-s-exp new old (car slist))
(subst new old (cdr slist))))))
(define subst-in-s-exp
(lambda (new old sexp)
(if (symbol? sexp)
(if (eqv? sexp old) new sexp)
(subst new old sexp))))
Run Code Online (Sandbox Code Playgroud)
这个问题的答案是消除subst-in-sexp,这就是
(define subst
(lambda (slist old new)
(cond
[ (null? slist) '()]
[ (eqv? (car slist) old) (cons new (subst (cdr slist) old new))]
[ else (cons (car …Run Code Online (Sandbox Code Playgroud)