Raspberry Piで何かを作ろうと思ったら、おそらく_抵抗器_を使うことになるでしょう。この演習では、抵抗器について2つのことを知っておく必要があります。
この問題を回避するために、メーカーは抵抗器にカラーコードの帯を印刷して、抵抗値を示しています。それぞれの帯には位置と数値があります。
抵抗器の最初の2本の帯には、シンプルな符号化の仕組みがあります。それぞれの色が1つの数値に対応するのです。たとえば、brownの帯(値1)の次にgreenの帯(値5)が印刷されていれば、それは15という数値になります。
この演習では、帯の値を覚えておかなくても済むように、便利なプログラムを作ります。このプログラムは色の名前を入力として受け取り、2桁の数値を出力します。入力が2色より多くても同じです。
帯の色は次のように符号化されています。
上の例では、 brown-greenは15を返し、 brown-green-violetも、3番目の色を無視して15を返すはずです。
この演習はResistor Colorの続きとして位置づけられており、その内容を土台にしています。
演習はどの順番で解いてもかまいませんが、推奨の順序に沿って進めることをおすすめします。
この演習では、c*という接頭辞を使ってあらかじめ定義された色の構文が与えられます。たとえばc*blackです。
次に、指示にしたがって、色の並びを数値に対応づける構文を定義します。
色は*[[と]]の間にあり、, で区切られます。たとえば*[[c*black, c*yellow, c*violet]]です。
この課題では、おそらく記法かマクロのどちらかを使うことになります。 リファレンスを確認するとよいでしょう。
新しい構文はコンパイル時に展開されるため、必要な構文がすべて定義されていないと、どのテストもコンパイルに失敗します。
そのため、従来の実行時テストに頼る代わりに、#guard_msgsを使います。
このコマンドは、与えられたdocstringと、別のコマンド(ここでは#eval)が生成したメッセージを比較し、異なっていればエラーを報告します。
エラーが出ないことをテスト合格とみなしてかまいません。
ローカルで作業する場合も、Leanのオンラインプレイグラウンドで作業する場合も、#guard_msgsが報告したエラーはLean InfoViewを通じてすぐに確認できます。
オンラインのテストランナーは、現在、Leanのメタプログラミングライブラリ全体のインポートに対応していません。
Leanで標準的に使える機能(Lean名前空間にあるものを含む)は自由に使えますが、import Leanを追加したり、Lean名前空間から特定のモジュールをインポートしたりすると、Exercismに提出したときに解答が失敗します。
なお、この演習を解くのにLeanライブラリをインポートする必要はありません。