标签: racket

无法实现Y组合器的工作

这是代码(也在这里):

#lang racket
(define poorY
  ((lambda length
    (lambda (ls)
      (cond
        [(null? ls) 0]
        [else (add1 ((length length) (cdr ls)))])))
  (lambda length
    (lambda (ls)
      (cond
        [(null? ls) 0]
        [else (add1 ((length length) (cdr ls)))])))))
Run Code Online (Sandbox Code Playgroud)

当我运行它:

> (poorY '(9 7 8))
. . application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '(#<procedure>)
  arguments...:
   '(#<procedure>)
Run Code Online (Sandbox Code Playgroud)

屏幕截图如下所示:

在此输入图像描述

我正在使用DrRacket作为代表.代码有什么问题?

scheme functional-programming combinators y-combinator racket

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

语法 - 规则语法

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

我想用这个签名定义一个规则:(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
查看次数

方案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
查看次数

变量和函数定义的顺序

为什么是这样:

  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
查看次数

我为什么要在我的缺点列表中获取mcons细胞?

我编写了一个非常简单的函数来为我提供两个边界之间所有整数的列表.

但是,它不是输出一个列表,而是给我一个由嵌套的mcons单元格构成的数据结构.

我究竟做错了什么?

#lang racket

(require rnrs/base-6)

(define (enumerate low high)
        (if  (> low high)
                '()
                (cons low
                    (enumerate (+ low 1) high))))

(enumerate 1 10)
;(mcons 1 (mcons 2 (mcons 3 (mcons 4 (mcons 5 (mcons 6 (mcons 7 (mcons 8 (mcons 9 (mcons 10))))))))))
Run Code Online (Sandbox Code Playgroud)

scheme racket

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

为什么这个尾递归函数变得更加复杂?

所以,我正在摆弄一些基本的数学,我想要一个函数来在基数之间进行转换.

我写了这个函数:

(define (convert-base from to n)
  (let f ([n n])
    (if (zero? n)
        n
        (+ (modulo n to) (* from (f (quotient n to)))))))
Run Code Online (Sandbox Code Playgroud)

这适用于我的所有个人测试<基础10,并且就我所能想象的功能完全正常的测试>基数10,如果我只是添加了对其他数字的支持.

令我感到困惑的是,当我试图使函数尾递归时,我最终得到了这个混乱(我为SO的好处添加了一些间距,因为我的代码通常不清晰或漂亮):

;e.g. 10 2 10 should output 1010, 10 8 64 should output 100 etc.

(define (convert-base-tail from to n)
  (let f ([n n]
          [acc 0]
          [zeros 0])

    (begin (printf "n is ~a. acc is ~a. zeros are ~a.\n" n acc zeros)

    (cond [(zero? n) (let exp 
                       ([x acc]
                        [shft zeros])
                       (if (zero? shft) …
Run Code Online (Sandbox Code Playgroud)

recursion tail-recursion racket

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

racketunit检查不是抛出异常

(check < 4 3)在屏幕上返回错误消息,但该函数也返回#<void>.我期待它只返回一个例外,而不是无效.我是否正确理解以下球拍文档:

"如果条件成立,则检查评估为(void).如果条件不成立,则检查会引发exn:test的实例:检查详细说明失败的信息."

> (display (check < 4 3))
--------------------
FAILURE
name:       check
location:   (|interactions from an unsaved editor| 75 11 1868 13)
expression: (check < 4 3)
params:     (#<procedure:<> 4 3)

. . Check failure
--------------------
#<void>
>
Run Code Online (Sandbox Code Playgroud)

testing racket

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

Lisp-family:对符号调用和符号的不同评估作为参数

在lisp-family(EDIT:lisp-1)语言中是否有一种方法可以区分符号评估关于其作为函数或作为参数的位置(即,在评估它时,覆盖此符号的eval)?
作为一个例子(我不需要这个功能,这是一个例子),我想对一组对象实现某种中缀操作,这可以由对象本身调用

(my-obj some-operator arg1 ...)  
Run Code Online (Sandbox Code Playgroud)

这实际上将函数some-operator应用于my-obj和arguments.
但是当这个对象在代码中的任何其他位置用作参数时,例如:

(some-function my-obj &args...) 
Run Code Online (Sandbox Code Playgroud)

它将评估为my-obj的值.
谢谢.

lisp scheme clojure s-expression racket

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

在球拍中使用lambda进行迭代?

这可能是一个简单的问题,但我似乎无法弄明白.在下面的示例中,我想创建一个list-of-obj递归创建项列表的函数.

例:

> (list-of-obj 'a 5)
'(a a a a a)
Run Code Online (Sandbox Code Playgroud)

代码:

#lang racket
(define (list-of-obj obj n)
  (letrec ((helper
           (lambda (obj n result)
             (if (> n 0)
               (helper obj (- n 1) (cons obj result))
               result))))
      helper obj n 0))
Run Code Online (Sandbox Code Playgroud)

然而,这导致输出0.有什么指针吗?我是球拍/计划的新手.

lisp lambda scheme racket

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