标签: racket

计算中的Curried函数的实现

当我执行以下操作时会发生什么?

(define ((func x) y)
    (if (zero? y)
        ((func x) 1)
        12))
Run Code Online (Sandbox Code Playgroud)

我明白我可以这样做:

(define curried (func 5))
Run Code Online (Sandbox Code Playgroud)

而现在我可以使用咖喱.我很好奇的是函数的定义.是行吗?

((func x) 1)
Run Code Online (Sandbox Code Playgroud)

用x作为参数创建一个新的lambda,然后在1上调用它?或者它比那更聪明,它只是重新使用现有的.(例如,如果我这样做(curried 0),该((func x) 1)行将等同于(curried 1)- PLAI Scheme是否这样做?)

scheme programming-languages currying racket

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

方案:与集合混淆!

我很困惑这段代码是如何工作的:

(define m (list 1 2 3 '(5 8)))
(let ((l (cdr m)))
(set! l '(28 88))) ==>(1 2 3 (5 8))

(define o (list 1 2 3 '(5 8)))
(let ((l (cdr o)))
(set-car! l '(28 88))) ==> (1 (28 88) 3 (5 8))
Run Code Online (Sandbox Code Playgroud)

为什么不(set! l '(28 88)))更新m

scheme racket

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

(方案)验证一个列表中的元素是否在第二个列表中与do cicle一起

如果第一个列表的元素在第二个列表中,我们如何在方案中验证do cicle?

scheme racket

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

球拍宏 - 制作对

我刚刚开始深入研究Racket宏,并试图制作一个简洁的简单宏定义宏.我想扩展一个这样的表达式:

(macro id
    (param) replacement1
    (params ...) replacement2)
Run Code Online (Sandbox Code Playgroud)

进入这样的事情:

(define-syntax id
    (syntax-rules ()
        ((id param) replacement1)
        ((id params ...) replacement2)))
Run Code Online (Sandbox Code Playgroud)

因此,原始表达式的cddr被转换为表达式对(用于语法规则体),并且id被插入到这些对中的每一对的汽车中.

当仅使用语法规则提供的模式匹配时,我无法递归地思考(我一直想要操纵表达式,就像它是普通的列表一样).我应该使用什么样的模式?或者,我可以以某种方式将其作为普通列表进行操作,然后取消引用结果以用于扩展吗?

非常感谢

编辑 - 暂时的解决方案,由Taymon的回答提供信息

我在这里好奇的一部分是关于摆脱那些配对的括号.我研究了语法案例,但有点困惑,所以试图用模式匹配的子语言来完成它.我最终使用Taymon的宏结合另一个宏来"配对"给定的模板(它有点像累加器函数):

(define-syntax-rule (macro-aux id ((param ...) expr) ...)
  (define-syntax id
    (syntax-rules ()
      ((id param ...) expr)
      ...)))

(define-syntax pairize
  (syntax-rules ()
   ((pairize id (pairs ...) p b) (macro-aux id pairs ... (p b)))
   ((pairize id (pairs ...) p b rest ...) (pairize id (pairs ... (p b)) rest ...))))

(define-syntax macro
  (syntax-rules ()
    ((macro …
Run Code Online (Sandbox Code Playgroud)

macros scheme define-syntax racket

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

如何使用DrRacket 5.2.1在Emacs中编辑和运行PLAI代码

我正在学习PLAI,现在我已经在DrRacket(带#lang plai)中运行了第3章的代码,但我是DrRacket的新手.我可以仅在Emacs中编辑和运行代码吗?

scheme racket plai

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

如何在R5RS中使用图像

我正在寻找一种将.jpg文件导入R5RS的方法.我想用它作为我正在制作的游戏的背景.

谢谢!

scheme jpeg image racket r5rs

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

重复代码次数

我正在学习球拍,我需要一些帮助.如何仅运行此功能4次而不是无限运行?

(define loop
  (? ()
    (define delay (random 5))
    (digital-write led1 HIGH)
    (sleep delay)
    (displayln delay)
    (digital-write led1 LOW)
    (sleep delay)
    (loop)))
Run Code Online (Sandbox Code Playgroud)

scheme racket

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

如何从Racket中的html中提取元素?

我想在reddit中提取网址,我的代码是

#lang racket

(require net/url)
(require html)

(define reddit (string->url "http://www.reddit.com/r/programming/search?q=racket&sort=relevance&restrict_sr=on&t=all"))
(define in (get-pure-port reddit #:redirections 5))

(define response-html (read-html-as-xml in))
(define content-0 (list-ref response-html 0))

(close-input-port in)
Run Code Online (Sandbox Code Playgroud)

上面的内容为0

(element
 (location 0 0 15)
 (location 0 0 82)
...
Run Code Online (Sandbox Code Playgroud)

我想知道如何从中提取特定内容.

scheme racket

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

在Racket的递归中堆栈溢出

作为函数式编程的一部分,在Racket中高度推广递归.但是,堆栈溢出是递归时通常提到的一个重要问题.在Racket中是否存在可能发生堆栈溢出的情况以及应采取哪些预防措施来防止此类事件发生?

lisp recursion racket

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

可执行大小可以优化吗?

我在Racket中创建了以下代码的可执行文件(选择Racket而不是GRacket):

#lang racket
(print "Hello World!")
Run Code Online (Sandbox Code Playgroud)

它创建了一个3.6 MB的tgz,可执行文件为6.2 MB.对于这个最简单的程序来说,这似乎非常大.Chicken Scheme使用相同代码创建的可执行文件(print "Hello World!")仅为16984字节(16.6 kb).

我认为在Racket中创建可执行文件时我遗漏了一些东西(可能是一些优化设置).如何将这个可执行文件缩小?

scheme executable racket chicken-scheme

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