许多宏的例子似乎都是关于隐藏lambda,例如在CL中使用open-file.我正在寻找一些更奇特的宏用途,特别是在PLT Scheme中.我想了解何时考虑使用宏与使用函数.
我正在使用Dr. Racket开发环境和语言定义#lang scheme为课程工作.但是,我不确定如何最好地使用此工具进行调试.我希望能够执行一个函数并逐步执行它,在执行的各个点观察不同函数的值.
这可能吗?如果没有,那么逐步执行Scheme程序并调试它的典型方法是什么?
在Scheme中,您可以定义以下过程:
(define (proc . vars)
(display (length vars)))
Run Code Online (Sandbox Code Playgroud)
这将允许您发送任何数量的args到proc.但是当我尝试这样做时:
(define proc (lambda (. vars)
(display (length vars))))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
读:非法使用"."
我似乎无法找到获取任意数量参数的lambda表达式的正确语法.想法?
(我正在使用DrScheme,版本209,语言设置为PLT(图形))
谢谢!
我试图让Geiser的REPL在Emacs中工作,但它似乎无法找到Racket.
racket 在我的路上,但任何时候我打字
run-geiser
Run Code Online (Sandbox Code Playgroud)
其次是
racket
Run Code Online (Sandbox Code Playgroud)
它抱怨:
无法启动REPL:搜索程序:没有这样的文件或目录,球拍
我在Geiser文档中读到,我可能需要手动告诉Geiser在哪里找到racket,但我不知道在哪里配置Geiser的这个属性.
谢谢你的帮助.
我在阅读dr drcket的输出时遇到了麻烦.默认情况下,它使用mcons显示列表.例如,sicp exercise 2.32产生:
> (subsets (list 1 2 3))
(mcons
(mcons
'()
(mcons
(mcons 3 '())
(mcons
(mcons 2 '())
(mcons
(mcons 2 (mcons 3 '()))
(mcons
(mcons 1 '())
(mcons
(mcons 1 (mcons 3 '()))
(mcons
(mcons 1 (mcons 2 '()))
(mcons (mcons 1 (mcons 2 (mcons 3 '()))) '()))))))))
'())
Run Code Online (Sandbox Code Playgroud)
我读这篇文章时遇到了麻烦.有没有办法使输出看起来像:
(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在尝试从循环语句的给定索引的列表中获取项目.
(define decision-tree-learning
(lambda (examples attribs default)
(cond
[(empty? examples) default]
[(same-classification? examples) (caar examples)] ; returns the classification
[else (lambda ()
(let ((best (choose-attribute attributes examples))
(tree (make-tree best))
(m (majority-value examples))
(i 0)
(countdown (length best)) ; starts at lengths and will decrease by 1
(let loop()
(let example-sub ; here, totally stuck now
; more stuff
(set! countdown (- countdown 1))
; more stuff
)))))])))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,best是列表,我需要在countdown索引处获取其值.你可以帮帮我吗?
我将通过SICP进行自学,并参与第2章的图片语言部分.我一直在使用DrRacket进行早期练习,但在尝试基于"画线"进行练习时出现编译错误本书这一部分的图片功能.
具体来说,这段代码......
(define (segments->painter segment-list)
(lambda (frame)
(for-each
(lambda (segment)
(draw-line
((frame-coord-map frame) (start-segment segment))
((frame-coord-map frame) (end-segment segment))))
segment-list)))
Run Code Online (Sandbox Code Playgroud)
...产生这个错误......
draw-line: unbound identifier in module in: draw-line
Run Code Online (Sandbox Code Playgroud)
所以我在这个论坛做了一些研究,并安装了Neil Van Dyke提供的SICP软件包(http://www.neilvandyke.org/racket-sicp/#(part._usage)).我按照所有步骤,按照指示将语言更改为SICP,但仍然得到相同的错误.
我认为这个软件包的目的是定义这个"内置"函数(以及书中的其他函数).只是为了预测一些问题,我在文件中没有'require'语句并使用'#lang planet neil/sicp'来指定语言而不是使用菜单(我也尝试使用菜单将语言更改为SICP并获取一个更奇怪的错误;请参阅下面的附言).我的环境是Windows 7,DrRacket的版本是5.3.1.
也许我只是犯了一个菜鸟错误; 任何见解将不胜感激.
谢谢.
PS:对于那些感兴趣的人,当我使用菜单将语言设置为'SICP(PLaneT 1.17)'时,对于我尝试编译的任何定义(即使是最微不足道的),我都会收到以下错误...
<unsaved editor>:1:0: #%top-interaction: unbound identifier;
also, no #%app syntax transformer is bound in: #%top-interaction
Run Code Online (Sandbox Code Playgroud) 我刚刚在几天前发现了Racket,我正试图通过编写一个生成图像来代表源代码的小脚本来更加熟悉它#lang slideshow.
我知道在函数范式编程时,最好用几乎所有变量创建let,但我发现它引入了太多级别的嵌套,并且Racket的let有一个过于复杂的API,需要多余的括号.我确信这是为了消除在使用let更强大的方式时的歧义,但就我的目的来说,这只是一个烦恼.因此,我正在创建我的所有变量define,并begin在需要时编写块(例如在if语句的正文中).
问题是我一再得到看似非常神秘的错误.我确定我只是犯了一些愚蠢的初学者的错误,对语言不熟悉,但我似乎无法找到投诉的来源.
这是有问题的代码:
(define sub-code (foldr ht-append (rectangle 0 0) (map internal-style (rest code))))
Run Code Online (Sandbox Code Playgroud)
虽然我们所定义sub-code的内容似乎非常无关紧要.如果我用它替换它
(define sub-code '())
Run Code Online (Sandbox Code Playgroud)
我收到同样的错误.DrRacket说define正在表达语境中使用.我理解这个错误通常意味着什么 - 当你编写代码时它会引发IE (print (define x 10)),但是我看不到会在这里触发什么.
如果它有帮助,这define是在一个begin块的开头,在一个if语句中
(if (list? code)
(begin
(define sub-code '())
; a few more define statements and finally an expression ))
Run Code Online (Sandbox Code Playgroud)
DrRacket正在打印的特定错误消息是
define: not allowed in an expression context in: (define sub-code …Run Code Online (Sandbox Code Playgroud) 我可以在无类型的Racket中编写一个简单的函数,curry-all它接受一个函数列表,所有这些函数都接受第一个参数的相同类型的值,并生成一个函数列表,其第一个参数是curried.
(define (curry-all fs arg)
(map (? (f) (curry f arg)) fs))
Run Code Online (Sandbox Code Playgroud)
有关上述函数的运行示例,请参阅pasterack上的此代码段.
这是一个有效的函数,但我不确定是否甚至可以输入Typed Racket给出其多态类型构造.curry它本身的类型已经相当复杂,显然其类型curry-all必然更复杂.
我做了一个相对简单的尝试来输入这个函数,虽然我很清楚它不会像我喜欢的那样起作用:
(: curry-all
(All [a c b ...]
(Listof (-> a b ... b c)) a
-> (Listof (-> b ... b c))))
(define (curry-all fs arg)
(map (? ([f : (-> a b ... b c)])
(curry f arg))
fs))
Run Code Online (Sandbox Code Playgroud)
显然,如果所有函数都具有相同的类型(这并非毫无价值!),则可以正常工作,但如果它们具有不同的arities,即使它们的第一个参数的类型是共享的,它也会失败.
有没有办法指定这个函数的类型,以便它可以在更一般的情况下工作?