取决于您的看法,Racket是:
Racket中主要的工具如下:
多数情况下,使用DrRacket浏览Racket语言,特别是在初期,如果你喜欢,也可以使用命令行工具racket作为解释器,并使用你喜欢的文本编辑器;见这里写链接内容.余下向导部分,大多数情况下,独立于你所选择的编辑器.
如果使用DrRacket,需要首先选择合适的语言, 因为DrRacket适合多种Racket语言的变体,及多种其它语言.假设你之前没用过DrRacket,启动它,并在第一行输入
#lang racket
输入之后,点击上方的 运行 按钮, DrRacket就会清楚:你想使用普通的Racket变体进行工作( as opposed to the smaller racket/base 或 其它的可能)
如果你之前使用过DrRacket(使用其它方式,而不是#lang的方式)它将会记住你最后使用的语言.如果这样的话,使用 Language|Choose Language… 菜单,之后会弹出一个对话框,选择第一项,这会告诉DrRacket,使用在源码中声明的#lang指定的语言.之后,再把 #lang放在文字编辑区的第一行.
DrRacket下面的文字区域和 racket命令行程序都是某种类型的计算器. 输入Racket表达式,按下回车键,之后答案就会打印出来.在Racket中,这个计算器叫作: 读取-计算-输出 循环 或 REPL.
> 5
5
一个数字本身就是一个表达式,计算结果就是数字本身
> "Hello, world!"
"Hello, world!"
字符串也是一个表达式,结果是它自己. 字符串使用双引号包围.
> (substring "the boy out of the country" 4 7)
"boy"
Racket使用圆括号包围大型的表达式–几乎任何类型的表达式,除了简单类型.例如,函数调用的写法: (函数名 参数表达式).下面的表达式,调用了内建函数 substring,并传入参数 “the boy out of the country”, 4, 和 7:
(define (extract str)
(substring str 4 7))
> (extract "the boy out of the country")
"boy"
> (extract "the country out of the boy")
"cou"
你可以使用 define 定义自己的函数,使其像 substring一样工作.
>#lang racket
>(define (extract str)
> (substring str 4 7))
虽然你可以计算 define在REPL中,但是定义通常你想保存并稍后使用的剖分.所以在DrRacket中,通常把定义放在上面的文本区域–这里称为 定义区域–在 #lang 语言一行的下面.
如果调用 (extract “the boy”),是程序功能的一部分, 也可以写在定义区. 如果只是展示使用extract的作为例子, 通常:点击运行按钮, 然后 在REPL中输入 (extract “the boy”).
> (enter! "extract.rkt")
> (extract "the gal out of the city")
"gal"
当使用命令行racket时,你可以保存以上文字到一个文件,如”extract.rkt”,然后,启动racket在同一个目录下,并输入以下文字:
enter! 载入代码,并切换到解释环境,替代module,就像按下了 DrRacket中的运行按钮.
如果文件(或定义在 DrRacket定义域)包含:
>#lang racket
>(define (extract str)
>(substring str 4 7))
>(extract "the cat out of the bag")
则它在运行时,编译成一个程序”cat”,你可以使用DrRacket或racket(enter!)运行它.如果保存到文件,也可以 从命令行运行:
> racket ‹src-filename›
打包程序,有一些选项:
如果了解一些Schem或Lisp,你可能会尝试这样写:
> (load "extract.rktl")
> (extract "the dog out")
"dog"
这样也可以工作,因为 Racket 乐意效访传统的 lisp 环境, 但是我们强列建议 反对使用 load或在module外写程序.
在module外面写,导至坏的错误信息, 不好的性能, 和使用人尴尬的 期待(组合及运行程序).问题不只是racket, ….