Open5

たまに Racket

toyboot4etoyboot4e

Racket 以前

昔見た web 記事をもう一度巡回しました:

Scheme と Common Lisp の違いは?:

  • Scheme は関数と変数の名前空間が分かれていない?
  • Scheme の方が純粋?
  • Common Lisp には [] が無かった気がする

Common Lisp の方が好みの気はしますが、 Racket では静的型検査もできるということで、ちょっとだけ触ってみようかなと思います。 Racket Programming the Fun Way を買っちゃいましたしね。

toyboot4etoyboot4e

環境構築

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

Emacs (leaf.el)

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))))

おお〜

何かが無いそうですが、とりあえず言語サーバは動いています。

toyboot4etoyboot4e

Fear of Macros

マクロを解説する一連の投稿です。ざっと読みました。

https://www.greghendershott.com/fear-of-macros/all.html

datum = AST だと思います。 syntax object は datum に加え、 ソース位置 + 構文スコープ情報を持ちます。

Syntax object または datum を使うと、既存のソースを指す形になると思います。たとえば今スコープに無い変数を指すとエラーになります。そのため単なる識別子として扱いたいという場合は with-syntax でパタン変数に変換します。

Rust の宣言的マクロでも似た振る舞いはありました。 ty を引数に取ると既存の型を指すことになるため、新しい型を作るときは ident ととして受け取ります。

またマクロの外で利用可能な変数を利用する場合は parameter を使うのですが、これも分からない。 splicing-let も分からない。悲しい。

toyboot4etoyboot4e

構文メモ

  • (begin ..) = (progn ..) (?)
  • (define (f a b c) ..) = (define f (lambda (a b c) ..))
  • #:keyword
    • #:break, #:final, #:when, #:unlessfor マクロの引数だった?
  • andorif に展開される