当我执行以下操作时会发生什么?
(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是否这样做?)
我很困惑这段代码是如何工作的:
(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
?
如果第一个列表的元素在第二个列表中,我们如何在方案中验证do cicle?
我刚刚开始深入研究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) 我正在学习PLAI,现在我已经在DrRacket(带#lang plai
)中运行了第3章的代码,但我是DrRacket的新手.我可以仅在Emacs中编辑和运行代码吗?
我正在寻找一种将.jpg文件导入R5RS的方法.我想用它作为我正在制作的游戏的背景.
谢谢!
我正在学习球拍,我需要一些帮助.如何仅运行此功能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) 我想在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)
我想知道如何从中提取特定内容.
作为函数式编程的一部分,在Racket中高度推广递归.但是,堆栈溢出是递归时通常提到的一个重要问题.在Racket中是否存在可能发生堆栈溢出的情况以及应采取哪些预防措施来防止此类事件发生?
我在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中创建可执行文件时我遗漏了一些东西(可能是一些优化设置).如何将这个可执行文件缩小?