たまに Racket
たま〜〜に Racket 見るかも!
-
Racket Programming the Fun Way
クーポンで 30% 引きだった!
Racket 以前
昔見た web 記事をもう一度巡回しました:
-
Haskell、Scala、ML、Scheme:あなたが次に学ぶ関数型言語 | POSTD
ML 系の言語には StandardML や OCaml がある。 Scheme 系の言語には Gauche や Racket がある。 Scheme の言語規格は更新され続けてきた (R5RS, R6RS, R7RS) 。 -
Lisp:S式の理由
S 式で[]
を使う話はここに出ていました。なお R6RS では[]
と()
は等価らしいです。 Racket にも[]
が出てきます。 -
なんでも継続
Scheme は継続がすごいらしい! でもこの記事を最後まで読んだことがない……
Scheme と Common Lisp の違いは?:
- Scheme は関数と変数の名前空間が分かれていない?
- Scheme の方が純粋?
- Common Lisp には
[]
が無かった気がする
Common Lisp の方が好みの気はしますが、 Racket では静的型検査もできるということで、ちょっとだけ触ってみようかなと思います。 Racket Programming the Fun Way を買っちゃいましたしね。
環境構築
Racket
brew
で Racket を入れると 8.2
が入ります。それで言語サーバをダウンロードすると 7.3
が降ってきて、バージョンミスマッチエラーが出ました。
仕方が無いので、インストーラで 8.5
(最新) を入れてパスを通しました:
/Applications/Racket v8.5/bin
なんか古いパッケージ多いなぁ……。 brew install --HEAD minimal-racket
だったら良かったかもしれません。
言語サーバ
racket-langserver をインストールします:
$ # brew install --HEAD minimal-racket
$ raco pkg install racket-langserver
leaf.el
)
Emacs (Adding new language - LSP Mode - LSP support for Emacs を参考に:
(leaf racket-mode
:doc "https://github.com/jeapostrophe/racket-langserver"
:url "https://www.racket-mode.com/"
:config
(with-eval-after-load 'lsp-mode
(add-to-list 'lsp-language-id-configuration
'(racket-mode . "racket"))
(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection '("racket" "-l" "racket-langserver"))
:activation-fn (lsp-activate-on "racket")
:server-id 'racket-langserver))))
おお〜
何かが無いそうですが、とりあえず言語サーバは動いています。
Fear of Macros
マクロを解説する一連の投稿です。ざっと読みました。
datum = AST だと思います。 syntax object は datum
に加え、 ソース位置 + 構文スコープ情報を持ちます。
Syntax object または datum を使うと、既存のソースを指す形になると思います。たとえば今スコープに無い変数を指すとエラーになります。そのため単なる識別子として扱いたいという場合は with-syntax
でパタン変数に変換します。
Rust の宣言的マクロでも似た振る舞いはありました。 ty
を引数に取ると既存の型を指すことになるため、新しい型を作るときは ident
ととして受け取ります。
またマクロの外で利用可能な変数を利用する場合は parameter を使うのですが、これも分からない。 splicing-let
も分からない。悲しい。
構文メモ
-
(begin ..)
=(progn ..)
(?) -
(define (f a b c) ..)
=(define f (lambda (a b c) ..))
-
#:keyword
-
#:break
,#:final
,#:when
,#:unless
はfor
マクロの引数だった?
-
-
and
やor
はif
に展開される