---
# System prepended metadata

title: 'Weekly Crystal-JP #06 (2020/05/08開催)'
tags: [Weekly Crystal-JP, Crystal]

---

# Weekly Crystal-JP #06 (2020/05/08開催)

###### tags: `Weekly Crystal-JP`, `Crystal`

## 会場

- Issue (開催準備用): <https://github.com/crystal-jp/weekly/issues/7>
- Googleハングアウト: <https://hangouts.google.com/call/Nu-XeFbQUe9Vh8vzw-jtAAEM>
- HackMD: <https://hackmd.io/@makenowjust/SJcrN2fcL>

## 参加者

- [@MakeNowJust][] (主催)
- [@msky026][]
- [@at-grandpa][]
- [@arcage][]

[@MakeNowJust]: https://github.com/MakeNowJust
[@at-grandpa]: https://github.com/at-grandpa
[@msky026]: https://github.com/msky026
[@arcage]: https://github.com/arcage

## 話題

### 今週マージされたPull Request

crystal-lang/crystalで[今週マージされたPull Request](https://github.com/crystal-lang/crystal/pulls?q=is%3Apr+is%3Amerged+updated%3A2020-05-02..2020-05-08)は全部で18個でした。

ここで紹介する機能はすでにマージされてはいますが、まだこれらを取り込んだバージョンはリリースされていません。
そのため、リリースされるときには機能が変わっていたり、削除されていたりする可能性もあります。
その点には注意してください。

#### DragonFlyBSDのサポートの追加 ([#9178](https://github.com/crystal-lang/crystal/pull/9178))

DragonFlyBSDのサポートが追加されました。
これまでBSD系ではFreeBSDとOpenBSDはサポートされていたのですが、これはサポートされていませんでした。

基本的にはこういったサポートするOSの追加は、`src/lib_c`以下に新しいアーキテクチャのlibcのバインディングを追加して、コンパイラのビルドフラグを追加することで可能です。
サポートするOSを追加したいと思う人は中々いないかもしれませんが、こういった仕組みを覚えておくと例えばLinuxとmacOS間で挙動が違うときに、標準ライブラリのどこを見ればいいのか、などが分かって便利かもしれません。

#### ドキュメント中の例の修正 ([#9203](https://github.com/crystal-lang/crystal/pull/9203))

maihaさんの出したPull Requestです。
maihaさんはドキュメントコメント中のコードの、`# =>`のようなコメントが正しいかを[検証するツール](https://github.com/maiha/crystal-examples)を開発していて、それを使った成果を定期的に報告しています。

こういったコンリビュートも面白いな、と思います。

#### `String#titleize`の追加 ([#9204](https://github.com/crystal-lang/crystal/pull/9204))

Ruby (Rails)のActiveSupportにあるような`String#titleize`メソッドが追加されました。

これは次のように動作するようです。

```crystal
"over the rainbow" # => "Over The Rainbow"
```

ActiveSupportにあるような、キャメルケースやスネークケースを空白区切りに変換する機能などは無く、単に空白区切りの語の先頭を大文字、残りを小文字にするような実装になっています。

個人的にはこの程度のメソッドなら`split`して各語に対して`capitalize`して、もう一度`join`すればいいのではないかと思うのですが、案外とあっさりマージされていることに驚きます。
もしかしたらGitterやフォーラムなどで議論があったのかもしれません。

### 注目のIssue/Pull Request

気になったIssue/Pull Requestなどをピックアップして紹介します。
これから紹介する提案は、まだCrystalに取り入れられたわけではないので注意してください。

#### 半精度浮動小数点数(`Float16`)の追加 ([#9237](https://github.com/crystal-lang/crystal/pull/9237))

半精度浮動小数点数(`Float16`)を追加するPRです。
とくにそれ用のリテラルなどはなく、型として`Float16`を追加するもののようです。

CBORなどに半精度浮動小数点数があるらしく、それに対応するために必要なようです。
LLVMが対応しているためか、実装はかなりシンプルでした。

#### `Proc`ポインタ構文がインスタンス変数を受け入れない問題 ([#9239](https://github.com/crystal-lang/crystal/issues/9239))

Crystalには`Proc`ポインタ構文と呼ばれるものがあります。
これは`->x.foo`という構文で、`x`に対して`foo`メソッド呼ぶ`Proc`を作成できる、というものです。

このIssueは、それがインスタンス変数に対して動作しない、という問題について報告したものです。
つまり、`->@x.foo`は構文エラーになります。

この構文は単純な`Proc`リテラルと違って、その場の値を保存するという性質があります。

```
x = "foo bar"

proc1 = ->x.gsub(String, String)
proc2 = ->(a : String, b : String) { x.gsub(a, b) }

x = "foo foo"

p proc1.call("foo", "xxx") # => "xxx bar"
p proc2.call("foo", "xxx") # => "xxx xxx"
```

ただ、それがなぜ変数(と定数)しか受け入れない、という理由につながるのかはよく分からないです。

個人的に、この辺りの構文は謎が多い気がします。

#### end-lessなメソッド定義の提案 ([#9080](https://github.com/crystal-lang/crystal/issues/9080))

ここ最近は議論が止まっています。

とりあえずRubyがどうなるかの様子見をしたいところです。

#### `@[Sealed]`アノテーションの追加 ([#9116](https://github.com/crystal-lang/crystal/issues/9116))

こちらは議論が少し進んでいます。

個人的には`@[Sealed]`は期待する効果(サブクラスに対して網羅チェックができるようになる)とそのための制約(同一ファイル内でしか継承できない)の関連性が見えづらいので、Scala 3の`enum`のような、より直感的な構文の方がいいんじゃないかという想いもあるのですが、そこまで議論が活発なわけでもないので何とも言い難いです。

#### 型まわりのパーサーの書き直し ([#9208](https://github.com/crystal-lang/crystal/pull/9208))

先週に筆者が出したPull Requestです。
思っていたよりもレビューされたので、早くマージされないかな、と思っています。

### その他の話題

#### 型の不思議な挙動

at-grandpaさんの報告した不思議な挙動です。

<https://play.crystal-lang.org/#/r/8ndw>

次のコードは、

```crystal
class Hoge < Array(String)
end
 
class Fuga
  def my_method : Array(NamedTuple(xxx: Array(Int32)))
    [
      {
        xxx: [1],
      },
    ]
  end
end
 
puts Fuga.new.my_method
```

以下のようなエラーになります。

```
Showing last frame. Use --error-trace for full trace.

error in line 5
Error: method must return Array(NamedTuple(xxx: Array(Int32))) but it is returning Array(NamedTuple(xxx: Array(Int32)))
```

しかし、最初の`class Hoge`の定義を削ると期待通りに動作します。

これはエラーメッセージの期待している型と実際の型が同じことから分かるように、もちろんバグなのですが、今のところ修正されていません。

この手の型周りのエラーは修正が大変な場合が多いので、これも何が原因なのか気になるところです。

#### ヒアドキュメントのフォーマット

[以前話題にあったもの](https://crystal-jp.github.io/weekly/#/minutes/2020-04-10?id=名前付きタプルの中でヒアドキュメントがあるとインデントがおかしくなる)について筆者が色々と調査してみました。
調査の結果は筆者の[日記](https://diary.quine.codes/post/2020-04-28-diary/)にまとめてあります。

結論から言うと、ヒアドキュメントのフォーマットまわりは何が期待されてるのかよく分からない挙動をしているので、修正がしづらく、今のところは放置しています。
時間があるときに直したいです。

また、この[Pull Request](https://github.com/crystal-lang/crystal/pull/9231)はヒアドキュメントのフォーマットの調査をしているとこに見つけたものを反映しています。

#### Crystalで数値計算をするテキスト

神戸大学の教授の方が書いたようです。

<https://twitter.com/jun_makino/status/1257330947466211329>

講義などで学生に教えたりしているのか気になるところです。

### 翻訳の進捗

125ファイル中90ファイル翻訳が終わりました。

そろそろWebで公開しているものも新しいものに切り替えたいな、と思っています。
今週末くらいには。

## あとがき

せっかく花金なのにこういうのをやるのはどうかと思ったので次回は土曜日にやりたいと思います。

よろしくお願いします。