我一直在寻找定义语法规则的语法,但我仍然卡住了.
我想用这个签名定义一个规则:(define-syntax-rule(for {val in lst} return res).
基本上它只是应用val和lst的地图.但我正在努力学习语法.这就是我到目前为止所提出的......(syntax-rules()((对于lst中的val)(map(val lst))))...
输入将是这样的:
(对于{val in'(0 1 2 3 4)} return( - val 1))
并输出(-1 0 1 2 3),就像在列表中调用了map一样.
我想在函数体中评估两个表达式.我该怎么办呢?
鉴于以下内容:
(define (f)
((+ 2 2) (+ 4 4)))
Run Code Online (Sandbox Code Playgroud)
我希望两者都有2 + 2和4 + 4评估(显然上面不起作用).
基本上,如果我理解正确,在我可以完成一件事的地方,我想做两件事.例如,我不想只调用一个函数作为if表达式的结果,而是想调用两个函数.或者理想情况下返回一个值并让函数调用自身.
我不确定这是否有意义,但在概念上有这样的机制似乎是合理的.
我想按顺序在一个列表中映射三个不同的函数.为了证明我的意思,我们想要做以下三个映射:
(map foo mylist)
(map bar mylist)
(map foobar mylist)
Run Code Online (Sandbox Code Playgroud)
如果我们将mylist定义为'(1 2 3),并且我们一次运行一个上述函数,我们得到:
(map foo mylist) ===> (foo1 foo2 foo3)
(map bar mylist) ===> (bar1 bar2 bar3)
(map foobar mylist) ===> (foobar1 foobar2 foobar3)
Run Code Online (Sandbox Code Playgroud)
相反,我希望输出采用以下格式:
===> ((foo1 bar1 foobar1) (foo2 bar2 foobar2) (foo3 bar3 foobar3))
Run Code Online (Sandbox Code Playgroud)
你会怎么做?
#lang scheme
(define consecutive?
(lambda(a b c)
((cond [(and (= (- b a) 1) (or (= (- c b) 1) (= (- a c) 1))) "true"]
[(and (= (- a b) 1) (or (= (- c a) 1) (= (- b c) 1))) "true"]
[(and (= (- c a) 1) (or (= (- a b) 1) (= (- b c) 1))) "true"]
[(and (= (- a c) 1) (or (= (- c b) 1) (= (- b a) 1))) "true"] …Run Code Online (Sandbox Code Playgroud) 我正在和The Little Schemer一起学习Scheme,遇到了一个奇怪的麻烦.这是我的代码:
(define rember
(lambda (a lat)
((if (null? lat)
'()
(cond
((eq? a (car lat)) (cdr lat))
(else (rember a (cdr lat))))))))
(rember 'aaa '(bbb aaa))
Run Code Online (Sandbox Code Playgroud)
我在教科书中使用了"if"而不是"cond".从尾递归返回时,它显示以下错误:
application: not a procedure;
expected a procedure that can be applied to arguments
given: '()
arguments...: [none]
Run Code Online (Sandbox Code Playgroud)
我想这是因为它将if语句中的'()视为函数,尾递归的返回值作为参数.但由于这本书没有给我这么多关于语言的细节,你能否为我解释一下这个?(例如,这实际上是某种语言特征吗?在这段代码中我有什么办法可以坚持"if"吗?我什么时候可以安全地使用"if"?)
谢谢.
尾递归执行与goto相同的效果.或者说,在lang C中,while和goto替换了Scheme中尾递归的作用.是什么让设计师决定在C中保留goto和while实现?我认为人们在实际情况下几乎不会使用'goto'.
如果goto和while要弥补C不能通过递归方式写入来实现迭代的错误,那么它们是否处于相同的特殊构造中? - 避免正常递归.(就像'cond'不同'如果'在Scheme中)这个问题是否与他们保留这两个词的原因有关?
我正在努力编写一个程序,这个程序(flatten-once '((b) (c f) ((d)(e))))会使列表变平一次,即
产生'(b c f (d) (e))).我查看了几个关于标准flatten过程如何工作的来源,但它实现了intermediate student with lambda我需要使用的语言形式中未包含的函数.据我所知,它foldr会有所帮助,并设法得到这个
(define (flatten-once lst)
(cond
[(empty? lst) lst]
[else
((foldr cons (first (rest lst)) (first lst)))]))
Run Code Online (Sandbox Code Playgroud)
返回'(b c f),所以我想它会使列表的一部分变平.我尝试通过递归继续定义,但这只是错误,所以我想我错过了一些东西.
所以我在方案中定义了3个函数,sumlist将列表中的所有数字相加,并且mean给出了列表的平均值.mean2调用意味着并做同样的事情,但我得到一个错误.它说错误来自sumlist功能.
(define (sumlist lst)(if(null? lst)0 (+(car lst)(sumlist(cdr lst)))))
(define mean (lambda x(/(sumlist x)(length x))))
(define mean2 (lambda x(mean x)))
Run Code Online (Sandbox Code Playgroud)
这就是我称之为功能的方式
(mean 1 2 3 4 5)
=>3 ;it works
(mean2 1 2 3 4 5)
+: contract violation
expected: number?
given: '(1 2 3 4 5)
argument position: 1st
other arguments...:
0
Run Code Online (Sandbox Code Playgroud)
上周我刚刚介绍它,我仍然是新的计划,但它真的很令人沮丧......我做错了什么?