2018-11-01: リバーズ・エッジを読んだ
やったこと
衝突判定
衝突してる。
実装が無駄に多くてしんどい。なぜなのか‥‥。
Welcome to the Black Parade
https://www.youtube.com/watch?v=RRKJiM9Njr8
聴きながら「ここが最高の盛り上がりだろう」と思うと、その次のパートでその予想を覆して更に盛り上げてきて、それが最後まで続く。最後まで聴いて良かったというより、最初から最後まで良かったと思える曲は稀有だと思う。
リバーズ・エッジを読んだ
平坦な戦場で僕らが生き延びること。どうもこの歌詞はウィリアム・ギブソンの曲の歌詞らしい。
最後まで読んだ。山田君が二人を河原に呼んでからの終盤の展開で引き込まれて最後まで読んでしまったというのが正しい。すごかった。
難しい話ではないんだと思う。ストーリーは当時の作者の思うがままに作られていて、その上で表現されているのだろうな、と感じた。阪神淡路大震災よりも、オウムの地下鉄サリン事件よりも前に描かれた、ある種記念碑的な作品、なのだろう。彼(彼女)達の青春には東北に津波が来たことも無いしトランプが政権を取ったことも無くて、バブルが崩壊してからの空白のような時代に描かれた、ということに意義があるのだと思う。
分からんけど。
11月になっていた
そういうこともある。
思うところ
スタリラ
一日の回復回数とか制限多すぎると思う。もっと課金者に優しくすればいい。
というか、対人戦のバランス調整をゲーム内でやる自信が無いからそういう設計になってるんだろうな、というのが見え見えで何だかなぁ、という感じ。
NamedTuple
何が正しい仕様なのかよく分からない。滅びればいいのに。
# (1).
# 上はキャストに失敗して、下は成功すべきじゃない?
{foo: true ? 1 : 2.34}.as?({foo: Int32}) # => nil
{foo: true ? 1 : 2.34}.as?({foo: Float64}) # => nil
# (2).
# どうして下の定義しか呼ばれないんだろう‥‥。
# (1)が正しいとすると、コンパイルエラーになるほうが正しいような気がする。
def foo(x : {foo: Int32})
:Int32
end
def foo(x : {foo: Float64})
:Float64
end
foo({foo: true ? 1 : 2.34}) # => :Float64
foo({foo: false ? 1 : 2.34}) # => :Float64
(1)はTupleでもこうなので正しいのかもしれない。
{true ? 1 : 2.34}.as?({Int32}) # => nil
{true ? 1 : 2.34}.as?({Float64}) # => nil
反対に、(2)はTupleだとコンパイルエラーになる。
def bar(x : {Int32})
:Int32
end
def bar(x : {Float64})
:Float64
end
bar({true ? 1 : 2.34})
bar({false ? 1 : 2.34})
# Error in bar.cr:10: no overload matches 'bar' with type Tuple(Float64 | Int32)
# Overloads are:
# - bar(x : ::Tuple(Int32))
# - bar(x : ::Tuple(Float64))
#
# p bar({true ? 1 : 2.34})
# ^~~
(2)がコンパイルエラーになるように直したいところ。
スプラット引数の前に引数のあるメソッドで、スプラット型制約を置くとIndexErrorになるやつ
https://github.com/crystal-lang/crystal/pull/6648#issuecomment-434648696
RX14がさらっと報告してるけど、これを直すのかなり大変だと思う。
表面上動くようにするパッチは書けたんだけど、正しいか全く自信がないし、そもそも何が正しい挙動なのか全く分からない。
Crystalしんどいね。