标签: scheme

语法 - 规则语法

我一直在寻找定义语法规则的语法,但我仍然卡住了.

我想用这个签名定义一个规则:(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一样.

scheme racket

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

在Scheme返回值中有一个函数(或做其他事情)并调用自身

我想在函数体中评估两个表达式.我该怎么办呢?

鉴于以下内容:

(define (f)
  ((+ 2 2) (+ 4 4)))
Run Code Online (Sandbox Code Playgroud)

我希望两者都有2 + 2和4 + 4评估(显然上面不起作用).

基本上,如果我理解正确,在我可以完成一件事的地方,我想做两件事.例如,我不想只调用一个函数作为if表达式的结果,而是想调用两个函数.或者理想情况下返回一个值并让函数调用自身.

我不确定这是否有意义,但在概念上有这样的机制似乎是合理的.

scheme

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

按顺序在单个列表中映射多个函数

我想按顺序在一个列表中映射三个不同的函数.为了证明我的意思,我们想要做以下三个映射:

(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)

你会怎么做?

lisp scheme racket

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

检查连续的数字时,"应用程序:不是程序"

#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)

scheme racket

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

方案if语句

我正在和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"?)

谢谢.

lisp scheme the-little-schemer racket

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

他们为什么在Scheme中引用空列表?

我要通过这个计划教程和第3(制作清单)的人说you should write '() to represent an empty list.但是对于我写的每一个测试,它似乎与使用just一样具有相同的效果().

此外,据我了解,该报价意味着解释器将不计算表达式,但似乎在解释知道之后有什么'符号,因为这样做(cons 1 '())收益率(1),而这样做(cons 1 'abc)的产量(1 . abc),因此它知道'()是一个空的列表,但'abc为不.

scheme

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

方案中的原子是什么?

我认为'a应该是计划中的一个原子。但是,当我使用在线解释器并评估以下内容时,我会回来#f

(atom? 'a)
Run Code Online (Sandbox Code Playgroud)

scheme

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

为什么C保留goto和while,涉及尾递归

尾递归执行与goto相同的效果.或者说,在lang C中,whilegoto替换了Scheme中尾递归的作用.是什么让设计师决定在C中保留gotowhile实现?我认为人们在实际情况下几乎不会使用'goto'.

如果gotowhile要弥补C不能通过递归方式写入来实现迭代的错误,那么它们是否处于相同的特殊构造中? - 避免正常递归.(就像'cond'不同'如果'在Scheme中)这个问题是否与他们保留这两个词的原因有关?

c recursion scheme sicp

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

压扁一次程序

我正在努力编写一个程序,这个程序(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),所以我想它会使列表的一部分变平.我尝试通过递归继续定义,但这只是错误,所以我想我错过了一些东西.

lisp scheme racket

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

DrRacket/Scheme:合同违规,预计会有多少?

所以我在方案中定义了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)

上周我刚刚介绍它,我仍然是新的计划,但它真的很令人沮丧......我做错了什么?

scheme racket

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

标签 统计

scheme ×10

racket ×6

lisp ×3

c ×1

recursion ×1

sicp ×1

the-little-schemer ×1