Christian Queinnec写了一篇名为LISP In Small Pieces的杰作,其中包括11个Lisp Interpreters和两个Lisp编译器.
当你去从网站下载的代码在这里 -它的评论:
The programs of this book are available on the net.
These programs used to run with some Scheme systems around 1994.
Run Code Online (Sandbox Code Playgroud)
任何的想法:
(a)当时运行的计划系统是什么,更重要的是;
(b)今天会运行哪些计划系统?
所以我必须删除方案中列表的最后一个元素.
例如,假设我有一个列表(1 2 3 4).我需要回复:
(1 2 3)
Run Code Online (Sandbox Code Playgroud)
我的想法:
reverse(list)
car(list)
reverse(list)
Run Code Online (Sandbox Code Playgroud)
reverse方案(球拍)中有功能吗?
我在网上找到了本课的代码(http://groups.csail.mit.edu/mac/ftpdir/6.001-fall91/ps4/matcher-from-lecture.scm),我有一段时间了试图调试它.该代码看起来与Sussman所写的相当:
;;; Scheme code from the Pattern Matcher lecture
;; Pattern Matching and Simplification
(define (match pattern expression dictionary)
(cond ((eq? dictionary 'failed) 'failed)
((atom? pattern)
(if (atom? expression)
(if (eq? pattern expression)
dictionary
'failed)
'failed))
((arbitrary-constant? pattern)
(if (constant? expression)
(extend-dictionary pattern expression dictionary)
'failed))
((arbitrary-variable? pattern)
(if (variable? expression)
(extend-dictionary pattern expression dictionary)
'failed))
((arbitrary-expression? pattern)
(extend-dictionary pattern expression dictionary))
((atom? expression) 'failed)
(else
(match (cdr pattern)
(cdr expression)
(match (car pattern)
(car expression)
dictionary)))))
(define (instantiate skeleton …Run Code Online (Sandbox Code Playgroud) 或者需要做的基本工作是创建GUI.我知道GUI的基本组件,但从哪里开始.我只是一个自学者,我正在阅读本书末尾的"如何设计程序"(HtDP),作者认为GUI和CGI计算机网络的知识需要成为程序员.最后两个的信息很容易找到.但似乎很少有人谈论如何创建GUI.我想也许在设计计算机程序的过程中它太"低",很少有人关心.
是否有可能让flymake-mode知道racket文件中的语法(或其他)错误,例如erlang或python?如果重要的话,我正在使用geiser-mode进行球拍.
我正在尝试从Racket中的大型csv文件中解析日期.
最直接的方法是创建一个新date结构.但它需要week-day和year-day参数.当然我没有这些,这似乎date是我不理解的模块的真正弱点.
因此,作为替代方案,我决定使用find-seconds将原始日期值转换为秒,然后将其传递给seconds->date.这有效,但是非常慢.
(time
(let loop ([n 10000])
(apply find-seconds '(0 0 12 1 1 2012)) ; this takes 3 seconds for 10000
;(date 0 0 12 1 1 2012 0 0 #f 0) ; this is instant
(if (zero? n)
'done
(loop (sub1 n)))))
Run Code Online (Sandbox Code Playgroud)
find-seconds需要3秒才能完成10000个值,我有几百万个.创建date结构当然是即时的,但我没有周日,年日值.
我的问题是:
1.)为什么week-day/ year-day需要创建日期结构?
2.)find-seconds应该是这么慢(即bug)?或者我做错了什么?
3.)是否有任何替代方法可以快速解析日期.我知道srfi/19有一个string->date功能,但我必须改变一切以使用该模块的结构而不是球拍的内置结构.并且它可能遭受同样的性能命中,我不确定.
可以(或应该)宏观扩张有副作用吗?例如,这是一个实际上在编译时抓取网页内容的宏:
#lang racket
(require (for-syntax net/url))
(require (for-syntax racket/port))
(define-syntax foo
(lambda (syntx)
(datum->syntax #'lex
(port->string
(get-pure-port
(string->url
(car (cdr (syntax->datum syntx)))))))))
Run Code Online (Sandbox Code Playgroud)
然后,我可以做(foo "http://www.pointlesssites.com/"),它将被取代"\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\r\n\t <and so on>"
这是好习惯吗?我是不是觉得Racket只运行一次这段代码?如果我(display "running...")在宏中添加一行,它只打印一次,但我不想从一个例子中推广......
PS - 我问的原因是因为我实际上认为这有时候非常有用.例如,这是一个库,允许您从Google API Discovery服务加载(在编译时)发现文档,并自动为其创建包装器.我认为,如果库实际上是从Web获取发现文档而不是本地文件,那将会非常酷.
另外,举一个具有不同副作用的宏的例子:我曾经构建了一个宏,它将一小部分Racket翻译成(eta-expanded)lambda演算(当然,它仍然可以在Racket中运行).每当宏完成翻译函数时,它都会将结果存储在字典中,以便稍后调用宏可以在自己的翻译中使用该函数定义.
这是一个一直困扰着我的问题,我想知道这里是否有人可以提供帮助.
我有一个名为lambdaLVar的PLT Redex模型,它或多或少是一个花园种类的无类型lambda演算,但扩展了包含"格子变量"或LVars的商店.LVar是一个变量,其值只能随时间增加,其中"增加"的含义由语言用户指定的部分有序集(也称为格子)给出.因此lambdaLVar实际上是一个语言系列 - 用一个格子实例化它,你得到一种语言; 有一个不同的格子,你得到另一个.你可以看看这里的代码; 重要的是lambdaLVar.rkt.
在lambdaLVar的纸上定义中,语言定义由用户指定的晶格参数化.很长一段时间,我想在Redex模型中进行相同类型的参数化,但到目前为止,我还没弄清楚如何.部分麻烦在于语言的语法取决于用户如何实例化格子:格子的元素成为语法中的终端.我不知道如何在Redex中表达格式上的抽象语法.
与此同时,我试图将lambdaLVar.rkt尽可能地模块化.该文件中定义的语言专用于特定晶格:具有max最小上限(lub)操作的自然数.(或者,相当于,自然数字排序<=.它是一个非常无聊的格子.)特定于该格子的代码的唯一部分是(define lub-op max)靠近顶部的线,并natural出现在语法中.(有一个lub元函数是根据用户指定的lub-op函数定义的.后者只是一个Racket函数,所以lub必须逃避到Racket调用lub-op.)
除非能够以一种抽象的方式实际指定lambdaLVar,这种方式对于格子的选择是抽象的,似乎我应该能够编写一个lambdaLVar的版本,其中最简单的格子 - 只有Bot和Top元素,其中Bot <= Top - 然后define-extended-language用来添加更多东西.例如,我可以定义一种名为lambdaLVar-nats的语言,它专门用于我描述的自然格点:
;; Grammar for elements of a lattice of natural numbers.
(define-extended-language lambdaLVar-nats
lambdaLVar
(StoreVal .... ;; Extend the original language
natural))
;; All we have to specify is the lub operation; leq is implicitly <=
(define-metafunction/extension lub lambdaLVar-nats …Run Code Online (Sandbox Code Playgroud) 似乎为了在Racket中使用多个返回值,我必须使用define-values或将它们收集到列表中(call-with-values (thunk (values-expr)) list).在后一种情况下,为什么有人会选择返回多个值而不是列表,如果只是必须将它们收集到列表中呢?此外,这些都非常冗长,并且难以适应大多数代码.我觉得我必须误解一些关于多重回报价值的基本信息.就此而言,如何编写接受多个返回值的过程?
我在最新版本的OS X,Yosemite上使用DrRacket,但是当我打开DrRacket时,系统告诉我"DrRacket意外退出".我已经尝试重新启动计算机了,我确定我有64位版本的Racket,所以这里出了什么问题?
racket ×10
scheme ×4
lisp ×3
common-lisp ×1
datetime ×1
emacs ×1
flymake ×1
macros ×1
osx-yosemite ×1
plt-redex ×1
sicp ×1
side-effects ×1
syntax-error ×1