Racket是
- 一種編程語言-一種lisp方言繼承自Scheme
- 一系列的編程語言家族-各種Racket變體
- 一個工具集-為了使用一個系列的編程語言家族
Racket主要的工具包括 - racket,核心編譯器,解釋器,運行系統
- DrRecket 編程環境
- raco 命令行工具,可以用來執行Racket命令,比如安裝包,構建庫等等。
一般情況下,你可以使用DrRacket探索Racket語言,特別是剛開始的時候。你也可以使用命令行racket解釋器和你最喜歡的文本編輯器。
如果你使用DrRacket,你需要選擇合適的語言,因為DrRacket包含了各種Racket語言的變體,和其它語言。如果你從來沒有使用過DrRacket,啟動它,然后輸入
#lang racket
到最上方的文本區域,然后點擊上方的運行按鈕。DrRacket就會運行在正常的Racket變體上。(你也可以運行在racket/base或者其它的語言上)
如果你已經使用過DrRacket運行以#lang開頭的程序,DrRacket會記住你最后使用的語言,而不是通過#lang來推理。在這種情況下,使用語言選擇菜單來告訴DrRacket使用#lang申明的語言類型。它仍然會吧#lang放在文本的第一行。
1.1和Racket交互
DrRacket底部的文本區域和racket命令行程序都像是一個計算器。輸入一個racket表達式,敲入回車鍵,結果就會被打印出來。這種交互被叫做讀取求值打印循環簡稱REPL。
數字是一個表達式,它求值的結果就是一個數字。
>5
5
字符串也是一個表達式并被求值成它自己。一個字符串以雙引號開始和結束。
Racket使用括號來表示大型的表達式,幾乎任何表達式或者簡單的常量。比如,函數調用寫成(函數名 參數···)。
1.2 定義和交互
你能使用define定義自己的函數。盡管你能在REPL里執行define,定義經常被保留并在之后使用。所以,在DrRacket里,你一般吧定義放在頂部區域-叫做定義區-并使用#lang作為前綴。
#lang racket
(define (extract str)
(substring str 4 7))
如果調用(extract "the boy")是主程序的一部分,那么應該放置在定義區。但是如果它只是一個例子表達式,用來探索exttact的用法,那么你他它留在定義區,點擊運行,然后在repl里執行(extract "the boy")。
當使用命令行程序而不是在DrRacket里面運行,你可以使用你最喜歡的編輯器來保存上面的代碼。如果你保存成"extract.rkt",然后在同一目錄運行racket,你可以像下面這樣執行
>(enter! "extract.rkt")
>(extract "the gal out of the city")
"gal"
enter!形式加載文件的代碼并切換執行環境到模塊內部,和DrRacket的運行按鈕執行相同的操作。
1.3創建可執行文件
如果你的文件或者DrRacket的定義區域包含下列代碼
#lang racket
(define (extract str)
(substring str 4 7))
(extract "the cat out of the bag")
它是一段完整的程序當執行時打印出“cat”,在DrRacket里面或者使用enter!形式在命令行里。但是如果程序被保存在<src-filename>的文件里,你可以在命令行里使用命令運行
racket <src-filename>
為了打包程序變成一個執行文件,你可以使用以下方法
- 在DrRacket里,你可以選擇Racket|Create Executable菜單。
- 在命令行里,運行raco exe <src-filename>。查看raco exe: Creating Stand-Alone Executables 可以看到更多信息。
- 在unix或者mac os x里,你可以把程序文件轉變成一個可執行的腳本只要插入
#! /user/bin/env racket
在文件開頭的地方。當然,使用chmod +x <filename>改變文件的執行權限。
這種情況需要racket在用戶的執行搜索路徑上。你也可以指定一個全路徑指向racket在#!之后,在這種情況下用戶的執行搜索路徑就沒關系了。
1.4Lisp/Scheme的備注
如果你已經知道了Scheme或者Lisp,你可以把下面代碼
(define (extract str)
(substring str 4 7))
放在"extract.rktl"里面并使用下面命令運行
>(load "extract.rktl")
>(extract "the dog out")
"dog"
這樣也可以運行,因為racket會模仿傳統的lisp環境,但是我們強烈建議不要使用load或者在一個模塊外層運行代碼。
定義運行在模塊外部會產生很多問題。比如不好的錯誤信息,性能不好,不能很好整合。模塊系統設計可以很好的避免問題。