lispでゲーム作れないか調べてた。
始めはCommon Lispでできないか調べてたのだけど、ドンピシャなものが見つかった。なんであるんだよ...
Fennel まぁいけそう。
squuint x Phaser あんまり例がないけどできなくはないと思う。 型情報とか見れないからAPIとコードを行ったり来たりする羽目になりそう。
Hy x Ren'Py どんな感じか分からない。 でも技術的には可能な部類だとは思ってる。 (そもそもゲーム開発にPython使うメリットがそんなに感じられない...)
今日やったこと
リンクラ
リンクラを始めた。
音ゲーだと思ってたので縦画面のカードゲームだと知ってびっくりした。音ゲーそんなに得意じゃないので正直助かった...
リンクラのアプリ自体が活動記録にも出てくるスクールアイドルコネクトの機能を持っていて、没入感がすごいなと思った。 また、with meetsというライブ配信や実際にライブをしている様子を生配信で見ることができる。
ラブライブは現実世界と時間軸を共有しているので2年生は3年生になっているし、 次の配信は13日になっている(冬休みなのと、実家に帰っている人がいるため配信ができない)ところなど、 現実感を持ってコンテンツを楽しめるようになっている。
最近のアイマスにもこの「現実に乗り出してくる」コンテンツが増えている(シャニソンのOurSTREAMが顕著)けど、その本家とも言うべき ラブライブは乗り出し具合がずば抜けているなと感じた。
この衝撃はかなり大きかったのでこれはまた改めて文章にしてみたい。
記事書いた
新年一発目の記事を上げた。
サラっと書けたので幸先が良いなと思った。
Clojure
babashkaでURLを組み立てる方法を調べていた。 URLの組み立てにはjava.net.URI
クラスを使うのが一般的らしい。
これを呼び出すにはこんな感じで書く。
(java.net.URI. "https" "comamoca.dev" "/diary/1/")
そのままだとJavaクラスのままなので、文字列に変換する。
(-> (java.net.URI. "https" "comamoca.dev" "/diary/1/")
(str)) ;; => "https:comamoca.dev#/diary/1/"
(import)
っていう関数を使うと、java.net.URI
名前空間を実行してる名前空間に突っ込める。 そうすることで修飾無しで呼び出せる。
(URI. "https" "comamoca.dev" "/diary/1/")
なお、URI.
と末尾にドットが付いているのはそれがClojureでJavaのクラスを生成する方法だから。 つまり、末尾にドットを付けることとJavaのnew
は同等の意味を持つ。
LispとJavaをどうやって融合させてるんだろうと思ったけど、ここまでシームレスにJavaを呼び出せるとは思わなかった。
Clojureのモジュールまわりを調べてた時に見つけた。よくまとまっていて良い。
外部ライブラリはランタイムに存在しないからrequire
して、javaの標準ライブラリはランタイムに同封されてるからそもそも普通に使える。 だからjava.*
はrequrieするとエラーになるんだなと納得した。
ASDFの地獄よりかはマシだけど、ASDFの感覚でClojureのモジュール扱うと混乱するから気を付けようと思った。
ClojureをJSで動かす方法を調べている時にsquuintを見つけた。 これはJS組み込みのデータ型を使うcljs方言で、cljsと比べて出力されるスクリプトが軽量になる(ランタイムファイルが薄い)のが特徴。
ClojureライブラリではなくJSライブラリを使う場面ではこっちの方が使い勝手良さそう。
babashka
結局はClojureなのだけどClojureが長いので分けて書く。 昨日はURLの組み立てで詰ってしまったけれど、それも解消したので気象庁APIを叩くところまでいけた。
使い勝手良さそうなのでRubyの代替として使っていきたい。
vim-jpでNode.js版 babashkaとも言えるnbbを教えてもらった。 こちらはSCIというClojureランタイム?を使ってbabashka相当の機能を実現したもの。
Promiseなども使えるのでこちらも良さそうだなと思った。
明日以降やりたいこと
Common Lispのhex <-> bytesの実装の目処が付いたのでそれをやっていきたい。
Clojureに関する知見とかも貯まってきたので、それも放出していきたい。