我正在努力通过编译器: Abdulaziz Ghuloum的后端到前端(并再次回到前面).它似乎缩写为完整课程/研讨会中的预期,所以我试图自己填写这些内容.
例如,我试图在DrScheme的R5RS风格中使用他的测试框架,但它似乎不喜欢宏的东西:
src/ghuloum/tests/tests-driver.scm:6:4: read: illegal use of open square bracket
Run Code Online (Sandbox Code Playgroud)
我已经阅读了他关于课程的介绍文章,编译器构建的增量方法,它对所使用的技术进行了很好的概述,并提到了一些可能需要为"额外信用"实现的功能的方案,但他没有没有提到他在课程中使用的计划.
更新
我还在深入研究原始问题(调查以下Eli建议的Petit Scheme等选项),但发现了一个与Gholoum工作有关的有趣链接,所以我将其包括在内.
[Ikarus Scheme](http://en.wikipedia.org/wiki/Ikarus_ (Scheme_implementation ))是Ghuloum的想法的实际实现,并且似乎是他的博士学位的一部分.工作.它应该是R6RS的首批实现之一.我现在正在尝试安装Ikarus,但是配置脚本不想识别我的系统安装的libgmp.so,所以我的问题仍未得到解决.
例
以下示例似乎适用于使用Pretty Big在DrEd中运行的PLT 2.4.2
(require lang/plt-pretty-big)
(load "/Users/donaldwakefield/ghuloum/tests/tests-driver.scm")
(load "/Users/donaldwakefield/ghuloum/tests/tests-1.1-req.scm")
(define (emit-program x)
(unless (integer? x) (error "---"))
(emit " .text")
(emit " .globl scheme_entry")
(emit " .type scheme_entry, @function")
(emit "scheme_entry:")
(emit " movl $~s, %eax" x)
(emit " ret")
)
Run Code Online (Sandbox Code Playgroud)
尝试用#lang方案替换require指令会导致错误消息
foo.scm:7:3: expand: …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个宏来定义具有相关函数的特殊数据结构类.
我知道这是可能的; 它在核心语言本身中多次完成.
作为一个具体的例子,我如何define-struct在Scheme本身中定义宏.它需要创造make-struct,struct-<<field>>等功能.
我试过这样做define,但是,这只定义了宏的词法范围中的函数.
如何在宏中实际定义函数?
我正在学习Racket(以前的PLT Scheme,一种LISP方言)并试图发现如何处理不同的事件paint-callback(也许它甚至不是一个).
我希望有很多来自商务部的这一部分,但on-char并on-event似乎什么都不做,可以让我感兴趣(或者什么都没有).
另外,我不了解事件空间,队列回调及其用途.一个例子是一件很酷的事情!我会感谢能给我写一个的好男人:).
这是我的代码:
(define game (new frame%))
(define gameLay (class canvas% (super-new)))
(new gameLay
[parent game]
[paint-callback (? (canvas dc) #|draw things|#)])
Run Code Online (Sandbox Code Playgroud)
我想使用"on-mouse-click-left"(不存在)之类的东西,我使用"paint-callback",但我想我需要添加步骤(我已经读过有关事件空间等).我知道它不起作用,但这是我正在寻找的假设代码:
(new gameLay
[parent game]
[paint-callback (? (canvas dc) #|draw things|#)]
[on-mouse-click-left (? (canvas dc) #|do other things|#)])
Run Code Online (Sandbox Code Playgroud) 任何人都可以帮助我更好地了解如何编写流吗?
我理解一个流是一个无限的值序列,我学会编程它们的方式是将它们表示为一个thunk,当被调用时产生一对(1)序列中的第一个元素和(2)代表一个thunk第二个无限元素的流
例如:
(define powers-of-two
(letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
(lambda () (f 2))))
Run Code Online (Sandbox Code Playgroud)
我在这里理解它只是产生2的幂并且访问它们,例如调用(car (powers-of-two))将导致2并且调用(car ((cdr (powers-of-two))))将导致4
现在我正在尝试编写一个称为red-blue在字符串之间交替的流red,blue但我对如何构造它有点困惑
我试图写一个简单的方案函数,返回列表的最后一个元素.我的功能看起来应该可以工作,但我设法失败了:
(define (last_element l)(
(cond (null? (cdr l)) (car l))
(last_element (cdr l))
))
(last_element '(1 2 3)) should return 3
Run Code Online (Sandbox Code Playgroud)
DrRacket继续给我错误:
mcdr: contract violation
expected: mpair?
given: ()
Run Code Online (Sandbox Code Playgroud)
既然(null? '())是真的,我不明白为什么这是行不通的.
这是一个函数,我认为我需要做一个家庭作业(编写函数last-element不是赋值),而且说明说我不能使用内置函数reverse,所以我不能只做(car (reverse l))
我该如何修复这个功能?
假设我有一个类似的文件
#lang racket/base
(define (hello) (print "Hello"))
... more definitions ...
Run Code Online (Sandbox Code Playgroud)
我想在文件中加载定义,以交互方式在(X)REPL中使用它们.我怎么做?
如果我启动(X)REPL (load "/tmp/hello.rkt"),那么该hello函数不可用于我:
-> (hello)
; hello: undefined;
Run Code Online (Sandbox Code Playgroud)
如果我(require (file "/tmp/hello.rkt")),结果是一样的.现在我可以 (enter! (file "/tmp/hello.rkt")),然后(hello)工作,但这似乎相当......不直观和初学者不友好.
这确实是应该这样做的方式吗?我应该简单地阅读模块和命名空间以轻松浏览和试验我的代码,还是有一种更简单的方法可以忽略?
注意我发现如何通过命令行将文件加载到球拍?,但这只解释了如何运行该文件.不是如何在REPL中加载它,因此您可以测试/调试某些特定的定义,然后编辑,重新加载等.
问题标题说明了一切,真的:在球拍中将一个函数映射到列表中的最佳方法是什么?谢谢.
当然,这是一个微不足道的工具,但我觉得Racket内置了一些内容.我是否正确直觉,如果是,那么功能是什么?
我刚刚安装了DrRacket,并尝试了"如何设计程序 - 开始学生"的语言.
我跑了(+ 1 1),这需要十几秒才能出现:
Welcome to DrRacket, version 6.5 [3m].
Language: Beginning Student; memory limit: 128 MB.
2
>
Run Code Online (Sandbox Code Playgroud)
据我所知,我的安装几乎是"开箱即用".
我想知道的是,如果我的经验是不寻常的,
如果有任何明显的方法来解决它(如果是这样的话
(我查看了设置并没有找到任何明显的调整),
或者如果整个HTDP语言可能是悄悄地放弃了什么......?
我有这些文件:
/usr/share/racket $
find -iname "*htdp*.zo"
./pkgs/htdp-lib/lang/private/compiled/create-htdp-executable_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-reader_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-beginner-abbr-reader_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-langs-save-file-prefix_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-advanced-reader_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-intermediate-lambda-reader_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-advanced_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-beginner-abbr_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-intermediate_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-intermediate-reader_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-langs_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-beginner_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-intermediate-lambda_rkt.zo
./pkgs/htdp-lib/lang/compiled/htdp-beginner-reader_rkt.zo
./pkgs/htdp-doc/scribblings/htdp-langs/compiled/htdp-langs_scrbl.zo
./pkgs/htdp-doc/scribblings/htdp-langs/compiled/htdp-ptr_scrbl.zo
./pkgs/htdp-doc/htdp/compiled/htdp_scrbl.zo
./pkgs/htdp-doc/htdp/compiled/htdp-lib_scrbl.zo
./pkgs/htdp-doc/teachpack/htdp/scribblings/compiled/htdp_scrbl.zo
./pkgs/htdp-doc/teachpack/2htdp/scribblings/compiled/2htdp_scrbl.zo
Run Code Online (Sandbox Code Playgroud)
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : …Run Code Online (Sandbox Code Playgroud) 我用Racket编写了一个程序(源代码在顶部的.rkt文件中#lang racket)。我还用(主要)便携式R7RS Scheme写了一个库。我可以以干净的方式在程序中使用该库吗?
我的目标是使该库在Scheme实现之间具有广泛的可移植性(至少是与R7RS兼容的实现,理想情况下还应是其他实现)。Racket有一个第三方R7RS填充程序,但据我所知,它要求我#lang r7rs在源文件的顶部键入内容。我猜想该#lang指令会使Racket之外的Scheme感到困惑。
我可以将库的核心放在一个或多个可移植的.scm源文件中,然后.rkt使用#lang r7rs指令告诉Racket以某种方式包括可移植文件的文件来包含一个文件吗?Racket是否了解某种库定义文件,例如.sld用在雪地上的库定义文件?
我试图浏览整个Racket文档,但在任何地方都找不到。我也没有找到通用的计划可移植性常见问题解答或最佳做法文档。