取决于你如何看待它,Racket语言是:

  • 一种编程语言(programming language)——Lisp语言的一种方言和Scheme的一种派生语言;

    参见《Racket和Scheme的方言》以获取更多关于Lisp其它方言的信息以及它们与Racket的关系。

  • 编程语言的一个家族(family)——Racket的变体,以及更多的;

  • 一系列工具(tools)——用于编程语言的一个家族。

在不会有混乱的情况下,我们简单地使用Racket

Racket的主要工具是:

  • racket, 核心编译器、解释器和运行时系统;

  • DrRacket, 编程环境;

  • raco, 用于执行为安装软件包、建立库等等的Racket命令的一个命令行(command-line)工具。

最有可能的是,你想使用DrRacket探索Racket语言,尤其是在开始阶段。如果你要更进一步,你还可以使用命令行racket解释器和你喜欢的文本编辑器;也可以参见《命令行工具和你的编辑器选择》。本指南的其余部分介绍这个语言大多都无关于你的编辑器选择。

如果你正在使用DrRacket,就将需要选择适当的语言,因为DrRacket可以容纳许多不同Racket变体,以及其它语言。如果你以前从未使用DrRacket,启动它,在DrRacket顶上的文本区域键入这一行:

#lang racket

然后点击文本区域上方的Run(运行)按钮。DrRacket接着就明白你的意思是在Racket的正常变体下工作(相对于较小的racket/base或许多其它的可能性来讲)。

《更多的Racket》描述一些其它的可能性。

如果你之前用除了以#lang开始的一个程序之外程序使用过DrRacket,那么DrRacket会记住你使用的这个最后的语言,而不是从#lang推断这个语言。在这种情况下,使用Language|Choose Language...(语言|选择语言……)菜单项。在出现的对话框中,选择第一项,它告诉DrRacket使用通过#lang在源程序中申明的这个语言。仍然要把#lang行放在文本区域的顶部上面。

1.1 用Racket进行交互

DrRacket的底部文本区和racket的命令行程序(当不带选项启动时)都可以扮作一种计算器。你打出一个racket的表达式,按下回车键,答案就打印出来了。在Racket的术语里,这种计算器叫做一个读取求值打印循环(read-eval-print loop)或REPL

一个数字本身就是一个表达式,而答案就是数字:

> 5

5

一个字符串也是一个求值为自身的表达式。一个字符串在字符串的开始和结尾使用双引号来书写:

> "Hello, world!"

"Hello, world!"

Racket使用圆括号包裹较大的表达式——几乎任何一种表达式,而不是简单的常数。例如,一个函数调用被写为:开括号,函数名,参数表达式和闭括号。下面的表达式用参数"the boy out of the country"、4和7调用内置函数substring

> (substring "the boy out of the country" 4 7)

"boy"

1.2 定义和交互

你能够通过使用define表定义像substring那样工作的你自己的函数,像这样:

(define (extract str)
  (substring str 4 7))
> (extract "the boy out of the country")

"boy"

> (extract "the country out of the boy")

"cou"

虽然你可以在REPL中求值define表,但定义通常是你想去保持并今后使用的一个程序的一部分。所以,在DrRacket中,你通常会把定义放在顶部文本区——被称作定义区域(definitions area)——随着#lang前缀一起:

#lang racket
(define (extract str)
  (substring str 4 7))

如果调用(extract "the boy")是程序的主要行为的一部分,那么它也可以进入定义区域。但如果这只是一个例子,你用来测试extract,那么如上面那样你会更原意离开定义区域,点击运行(Run),然后会在REPL中对(extract "the boy")求值。

当使用命令行的racket代替DrRacket,你可以用你喜欢的编辑器在一个文件中保存上面的文本。如果你将它保存为"extract.rkt",然后在同一目录启动racket,你可以对以下序列求值:

如果你使用xrepl,你可以使用,enter extract.rkt。

> (enter! "extract.rkt")
> (extract "the gal out of the city")

"gal"

enter!表加载代码并将求值上下文转换到模块里面,就像DrRacket的运行(Run)按钮一样。

1.3 创建可执行程序

如果你的文件(或在DrRacket的定义区域里)包含:

#lang racket
(define (extract str)
  (substring str 4 7))
(extract "the cat out of the bag")

那么它是一个在运行时打印“cat”的完整程序。你可以在DrRacket中运行程序或在racket中使用enter!运行程序,但如果程序被保存在‹src-filename›中,你也能够从命令行运行它

racket ‹src-filename

将程序打包为可执行文件,你有几个选择:

  • 在DrRacket,你可以选择Racket|Create Executable...菜单项。

  • 从一个命令行提示符,运行raco exe ‹src-filename›,这里nonterm{src-filename}包含这个程序。参见《raco exe: Creating Stand-Alone Executables 》部分获取更多信息。

  • 对于UNIX或Mac OS,你可以通过在文件的开头插入以下行将程序文件转换为可执行脚本:

    参见脚本获取有关脚本文件的更多信息。

    #! /usr/bin/env racket

    同时,在命令行中用chmod +x ‹filename› 改变文件权限给可执行文件。

    只要racket在用户的可执行文件搜索路径中脚本就会工作。另外,在#!后面使用一个完整路径提交给racket(在#!和路径之间带一个空格),这样用户的可执行文件搜索路径无关紧要。

1.4 给有LISP/Scheme经验的读者的一个说明

如果你已经知道一些关于Scheme或Lisp的东西,你可能会试图这样将

(define (extract str)
  (substring str 4 7))

放入"extract.rkt"并且按如下运行racket

> (load "extract.rktl")
> (extract "the dog out")

"dog"

这将会工作,因为racket会模仿传统的Lisp环境,但我们强烈建议不要使用load或在模块之外编写程序。

在模块之外编写定义会导致错误消息、糟糕的性能以及难以组合和运行的脚本程序。这些问题并非特定于racket,它们是传统顶层环境的基本限制,Scheme和Lisp实现在历史上与特别的命令行标志、编译器指令和构建工具进行斗争。模块系统是为了避免这些问题而设计的,所以用#lang开始,从长远来看,你会更喜欢Racket。

Racket编程指南——1 欢迎来到Racket!相关推荐

  1. Racket编程指南——21 运行和创建可执行文件

    21 运行和创建可执行文件 在开发程序时,很多Racket程序员使用DrRacket编程环境.要在没有开发环境的情况下运行程序,请使用racket(用于基于控制台的程序)或gracket(对于GUI程 ...

  2. Racket编程指南——23 Racket和Scheme的方言

    23 Racket和Scheme的方言 我们使用"Racket"来指Lisp语言的一种特定方言,它基于Lisp家族的Scheme分支.尽管Racket与Scheme相似,但模块上的 ...

  3. Racket编程指南——4 表达式和定义

    4 表达式和定义 <Racket概要>这一章介绍了一些基本的Racket的句法表:定义.过程程序.条件表达式等等.本节提供这些形式的更详细信息,以及一些附加的基本表. 4.1 标记法 4. ...

  4. Racket编程指南——8 输入和输出

    8 输入和输出 一个Racket端口对应一个流的Unix概念(不要与racket/stream的流混淆). 一个Racket端口(port)代表一个数据源或数据池,诸如一个文件.一个终端.一个TCP连 ...

  5. Racket编程指南——20 并行

    20 并行 Racket提供两种形式的并行(parallelism):前程(futures)和现场(places).在提供多个处理器的平台上,并行可以提高程序的运行时性能. 关于Racket里顺序性能 ...

  6. Racket编程指南——13 类和对象

    13 类和对象 本章基于一篇论文[Flatt06]. 一个类(class)表达式表示一类值,就像一个lambda表达式一样: (class superclass-expr decl-or-expr . ...

  7. 学习大数据分析python编程指南

    每个人都喜欢Python.如果您打算开始从事数据科学事业,我们可以肯定Python在您心中已经占有特殊的位置.它直观且易于在任何平台上运行,并且具有大量令人惊叹的库和工具.与其他编程语言相比,Pyth ...

  8. 《树莓派Python编程指南》——2.2 一个Python游戏:猫和老鼠

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第2章,第2.2节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  9. 《树莓派Python编程指南》—— 1.3 树莓派快速指南

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第1章,第1.3节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

  10. 《树莓派Python编程指南》——2.3 小结

    本节书摘来自华章计算机<树莓派Python编程指南>一书中的第2章,第2.3节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区"华章 ...

最新文章

  1. mybatis-plus入坑指南
  2. Hadoop科普文—常见的45个问题解答 #183; Hadoop
  3. matlab 读取fig数据
  4. 一份C++学习资源整理,咬牙切齿地好用。
  5. Gym102832K. Ragdoll(CCPC长春)
  6. Java基础17:Java IO流总结
  7. K8S之kubectl命令详解及常用示例??
  8. 如何绘制高大上的词云图?
  9. Keepalived高可用(原理、安装、启动、单实例配置、双实例双主配置实战篇)
  10. 卡牌大师怎么玩_LOL卡牌大师技巧 卡牌大师攻略
  11. Canvas常用API
  12. 中国十大骨干网,了解互联网的真实结构
  13. Office之word如何把尾注的上标加括号,尾注里的上标改为普通数字
  14. Mac安装truffle框架时出现✓ Preparing to download box ✖ Downloading Unbox failed! Error: connect的解决方法
  15. 物联网(IoT)及其未来应用方向
  16. 使用xlsxwriter简单的将截图插入excel表格中
  17. 【2020 ACM Fellow 华人学者】 任奎 浙江大学
  18. BFS - Dungeon Master
  19. 分析方法4---多维度拆解分析
  20. 虚拟机里的linux磁盘空间扩容

热门文章

  1. 计算机 无法自检,电脑开机不能自检的五大原因
  2. jsonp跨域请求用法
  3. java opts配置_JAVA_OPTS设置
  4. android开机画面在uboot里吗,iTOP-6818开发板-Android5.1修改uboot和内核开机LOGO
  5. ubuntu resolution
  6. advanced option里面没有resolution
  7. Base64 UUE 文件编码解码工具及使用说明
  8. elastic serach学习
  9. 2022研究生数学建模ABCDEF思路
  10. php 模拟登录163邮箱,PHP模拟登陆163邮箱发邮件及获取通讯录列表的方