我想设置我的球拍REPL交互使用的语言,如下所示:
-> #lang typed/racket
; readline-input:15:0: read: #lang not enabled in the current context [,bt for
; context]
; typed/racket: undefined;
; cannot reference undefined identifier
; [,bt for context]`
Run Code Online (Sandbox Code Playgroud)
但它给了我这个错误:
-> ,bt
; typed/racket: undefined;
; cannot reference undefined identifier
Run Code Online (Sandbox Code Playgroud)
我的错误是什么?
背景故事:我在Java中做了很多大型且相对复杂的项目,在嵌入式C编程方面有很多经验.我已经熟悉了scheme和CL语法,并用racket编写了一些简单的程序.
问题:我已经计划了一个相当大的项目,并希望在球拍中做到这一点.我听说过很多的"如果'获取’口齿不清,你会成为一个更好的程序员"等,但每一次我尝试计划或编写一个程序我还是"分解"的任务与接口熟悉的有状态的对象时.
是否有针对lisp的"设计模式"?如何"获得"lisp-family"mojo"?如何逃避面向对象约束你的思考?如何运用强大的宏观设施推动的功能性编程思想?我尝试在github上研究大项目的源代码(例如Light Table)并且更加困惑,而不是开悟.
EDIT1(不那么暧昧的问题):关于这个主题是否有很好的文献,你可以推荐或者是否有用cl/scheme/clojure编写的高质量的开源项目,可以作为一个很好的例子吗?
我正在使用Dr. Racket开发环境和语言定义#lang scheme为课程工作.但是,我不确定如何最好地使用此工具进行调试.我希望能够执行一个函数并逐步执行它,在执行的各个点观察不同函数的值.
这可能吗?如果没有,那么逐步执行Scheme程序并调试它的典型方法是什么?
我试图让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,即使它们的第一个参数的类型是共享的,它也会失败.
有没有办法指定这个函数的类型,以便它可以在更一般的情况下工作?