Racket
Racket 把语言本身当作可组合的库。文件首行 #lang 选择 Reader、宏、绑定与工具链,模块可以定义新的 #lang。这使它特别适合教学语言、DSL、静态检查和语言导向编程。
独特能力
#lang决定整个模块的语言,而不仅是导入一组函数。- Contract 在模块边界检查值与行为,并把错误责任定位到提供方或调用方。
- 透明 Struct 提供可模式匹配、可打印的结构化数据。
- Syntax Object 同时携带代码、词法上下文和源位置信息,是可靠宏扩展的基础。
rkt
#lang racket
(require racket/contract)
(struct point (x y) #:transparent)
(define/contract (distance-squared value)
(-> point? exact-integer?)
(+ (sqr (point-x value)) (sqr (point-y value))))
(define-syntax-rule (report label value)
(printf "~a=~a\n" label value))
(report "lang" "racket")
(report "struct" (point 3 4))
(report "contract" (distance-squared (point 3 4)))
(report "syntax-object" (syntax? #'(+ 1 2)))📸 Unverified Snapshot📋
hello-lang-racket:9.3Not verified
lang=racket
struct=#(struct:point 3 4)
contract=25
syntax-object=#t