标签: scheme

按方案中对的第二个元素对对列表进行排序

我在方案中有一个程序,它给了我一个对列表,我需要按对的第二个元素对这个列表进行降序排序。像这样:

((1 . 1) (2 . 3) (3 . 2)) --> ((2 . 3) (3 . 2) (1 . 1))
((1 . 1) (x . 3) (2 . 1) (3 . 1)) --> ((x . 3) (1 . 1) (2 . 1) (3 . 1))
((1 . 3) (3 . 4) (2 . 2)) --> ((3 . 4) (1 . 3) (2 . 2))
Run Code Online (Sandbox Code Playgroud)

我不知道我应该如何为此使用排序。

sorting scheme

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

方案:不能在 if 语句中使用 #t

如果问题标题有点混乱,请见谅。也许在你读完之后,你可以给我推荐一个更好的标题。

作为在线课程家庭作业的一部分,我编写了一个迭代过程mit-scheme来显示从 1 到给定数字的数字。

下面的代码工作正常:

(define (count2-iter num)
    (define (iter counter)
        (cond ((> counter num) #t)
              (else (display counter)
                (iter (+ counter 1)))))
    (iter 1))
Run Code Online (Sandbox Code Playgroud)

输出:

1 ]=> (load "count2-iter.scm")

;Loading "count2-iter.scm"... done
;Value: count2-iter

1 ]=> (count2-iter 10)
12345678910
;Value: #t
Run Code Online (Sandbox Code Playgroud)

我个人不喜欢cond仅用于 2 个分支,因此我尝试使用if它。

(define (count2-iter1 num)
    (define (loop idx)
        (if (> idx num)
            #t
            ((display idx)
             (loop (+ idx 1)))))
    (loop 1))
Run Code Online (Sandbox Code Playgroud)

输出:

1 ]=> (count2-iter1 5)
5
;The object #!unspecific is …
Run Code Online (Sandbox Code Playgroud)

iteration scheme mit-scheme

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

变量和函数定义的顺序

为什么是这样:

  1. 函数定义可以使用在它之后定义的定义
  2. 而变量定义不能。

例如,

a) 以下代码片段是错误的:

; Must define function `f` before variable `a`.
#lang racket
(define a (f)) 
(define (f) 10)
Run Code Online (Sandbox Code Playgroud)

b) 虽然以下片段是正确的:

; Function `g` could be defined after function `f`.
#lang racket
(define (f) (g)) ; `g` is not defined yet
(define (g) 10)
Run Code Online (Sandbox Code Playgroud)

C)

; Variable `a` could be defined after function `f`
#lang racket
(define (f) a) ; `a` is not defined yet
(define a 10)
Run Code Online (Sandbox Code Playgroud)

lisp scheme definition operator-precedence racket

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

具有无限数量参数的球拍宏

我想要一个可以接受任意数量参数并返回每个参数列表的宏,如下所示:

(TEST first second third)
=> '(first second third)
Run Code Online (Sandbox Code Playgroud)

lisp macros scheme racket

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

Racket 中除 + 以外的应用示例

如果 'apply' 将给定的函数应用于列表的所有元素,为什么以下不起作用:

> (apply println (list "a" "b" "c"))
. . println: contract violation
  expected: output-port?
  given: "b"
  argument position: 2nd
  other arguments...:
> 
Run Code Online (Sandbox Code Playgroud)

https://docs.racket-lang.org/reference/procedures.htmlhttps://docs.racket-lang.org/guide/application.html 中给出的示例与添加 (+) 功能有关。有人可以提供其他应用示例并解释它是如何工作的。谢谢。

scheme racket

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

let in 方案的语法

我无法理解let在我发现的示例中的这种用法。我正在使用鸡肉计划。

(let loop ()
    (print "hello world")
    (loop)
)
Run Code Online (Sandbox Code Playgroud)

这是一个简单的无限循环,它递归地调用自己,我无法理解的是语法。我知道第一个参数必须是一个成对列表,((<var[1]> <value[1]>)...(<var[n]> <value[n]))其他参数是 let 的主体。那么,为什么这个片段有效呢?

scheme loops let named chicken-scheme

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

如何从python PLY中的方案解释“do”循环

我正在使用 PLY (Python Lex-Yacc) 为 Scheme 做一个解释器,但我无法使用堆栈中的值来实现“do”循环,该值跟踪与变量对应的 ID(例如 i 用于环形)。

这是一个编译器设计课程的最终项目,主要问题是向堆栈添加值的那一刻,我使用字典将变量名作为键,然后是值,但它不是在它应该分配的那一刻,它尝试在一个值和变量之间进行比较,但它失败了,因为堆栈仍然是空的。

这是代码中最重要的部分:

ids = { }

def p_program(p):
    'program : form'
    #return p
    print(p[1])

def p_form_a(p):
    '''
    form : definition
         | expression
    '''
    p[0] = p[1]

def p_expression(p):
    '''
    expression : constant
               | do_expression
               | ID
               | display
    '''
    p[0] = p[1]

def p_do_expression_a(p):
    #       0           1      2    3      4     5         6      7    8      9         10        11              12              13        14
    'do_expression : OPEN_PAR DO OPEN_PAR ID constant OPEN_PAR symbol ID …
Run Code Online (Sandbox Code Playgroud)

python scheme interpreter loops ply

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

当特殊形式 cond 缺少关键字 else 时,过程是否会被视为谓词 &lt;p&gt; ?

我不小心忘记else在下面的cond表达式中输入 ,发生了一些奇怪的事情。

(define (abs x)
  (cond ((< x 0) x)
        ((= x 0) 0)
        (+ 1 2 1001)
        ))

> (abs 1)
1001
> 
Run Code Online (Sandbox Code Playgroud)

的结果(abs 1)不是(+ 1 2 1001)?的结果,即 1004,而是表达式参数的最后一个元素(+ 1 2 1001)

cond形式是

(cond (<p1>,<e1>)
      (<p2>,<e2>)
      (<p3>,<e3>)
      ...
      (<pn>,<en>))
Run Code Online (Sandbox Code Playgroud)

表达式中没有谓词(+ 1 2 1001),所以我想知道该过程+是否被视为谓词,并且它是否总是评估为真,选择最后一个元素返回。是这样操作的???

lisp scheme racket

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

Lisp/Scheme/Racket:如何定义带有省略号的函数

我想在 Racket 中定义一个带有未定义参数数量的函数,所以我使用省略号,但它不起作用:

(define (f x ...) (printf x ...))
(f "~a ~a" "foo" "bar")
Run Code Online (Sandbox Code Playgroud)

错误:

Arity mismatch
Run Code Online (Sandbox Code Playgroud)

如何用省略号在 Racket 中定义一个函数?

scheme function variadic-functions racket arity

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

使用方案调用函数

我正在尝试运行以下代码:

(define (myadd x y)
    (+ x y)
)

(myadd '(3 4))
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

Error: +: number required, but got (3 4) [myadd, +]
Run Code Online (Sandbox Code Playgroud)

如何让 myadd 函数返回 7?

scheme functional-programming

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