プログラミングの備忘録

プログラムをつくる過程を残すもの

プログラミング言語「Chef」を触ってみる

こんにちは。
今回は、プログラミング言語「Chef」を紹介します。


一風変わったプログラミング言語シリーズ (?) の4つ目です。

プログラミング言語「Piet」を使ってみる - プログラミングの備忘録

プログラミング言語「Uiua」を使ってみる - プログラミングの備忘録

プログラミング言語「Shakespeare」を触ってみる - プログラミングの備忘録


目次


「Chef」とは

Chef (DM's Esoteric Programming Languages - Chef) はプログラミング言語のひとつです。
これは全くの偶然なのですが、Chef の開発者と以前紹介した Piet の開発者は同じ方のようです。

名前の通り料理に関係しており、「コードがレシピに見えるように」というコンセプトがあるそうです。
(実際に「Hello World!」を出力するコードをつくり、そのコード (レシピ) 通りに「Hello Worldケーキ」をつくった方 (Baking a Hello World Cake | Products of Mike's Mind) もいます。)


仕様

DM's Esoteric Programming Languages - Chef の内容を要約していきます。

Chef の "レシピ" には以下の要素が登場します。(一部は無くても良いです。)
各要素はここに示した順で、間に1行の空白行を挟んで書いていきます。

レシピタイトル

プログラムが何をするものなのかを記述します。
1行目でピリオドまでがタイトルになります。

コメント

何かあれば書いてください。

材料リスト

プログラム内で使う変数を材料として示し、各材料は量として数値を指定します。
初期値 単位 材料名 の形で羅列していきます。
(初期値や単位は無く材料名だけを宣言しても良いようです。)

単位と、固体・液体の関係
固体: gkgpinch[es] (つまみ)、heaped (山盛りの)、level (一杯の)
液体: mlldash[es] (少量)
未特定: cup[s]teaspoon[s]tablespoon[s]

Ingredients.
101 eggs
108 g lard
1 cup white sugar
119 ml water

出力においては、液体は Unicode で対応する文字として、固体 or 未特定の材料は数値として出力されます。

調理時間

記載は任意です。
単位は hour[s]minute[s] です。
(コードの作成時間でも書いておけば良いでしょうか。)

Cooking time: 30 minutes.

オーブンの温度

記載は任意ですが、焼く工程があるときは予熱をしておく必要があるでしょう。

degrees Celsius は摂氏温度 [℃]、gas mark はイギリスなどで使われるオーブンの温度単位 (Gas mark - Wikipedia) のようです。
(gas mark は書かなくても良いです。)

Pre-heat oven to 200 degrees Celsius (gas mark 6).

手順

調理手順を記載します。
プログラムの本文にあたります。

ボウルと耐熱皿

Chef にはスタックのような役割を持つボウルと耐熱皿が存在します。

ボウルと耐熱皿は材料を入れることができ、パンケーキを積み重ねるように順番に入っていきます。
材料に対応する値が変わったとしてもこれらの容器の中では材料の値は変わりません。

容器が複数あっても序数 (1st, 2nd, 3rd, 4th, ...) で区別可能です。

命令

以下、命令とその意味です。

  • Take 材料名 from refrigerator.: 入力を受け取り、指定した材料に代入する

  • Put 材料名 into mixing bowl.: ボウルに材料を入れる

  • Fold 材料名 into mixing bowl.: ボウルから一番上の値を取り出し、指定した材料に代入する

  • Add 材料名 [to mixing bowl].: ボウルの一番上の値に指定した材料の値を足す

  • Remove 材料名 [from mixing bowl].: ボウルの一番上の値から指定した材料の値を引く

  • Combine 材料名 [into mixing bowl].: ボウルの一番上の値と指定した材料の値をかける

  • Divide 材料名 [into mixing bowl].: 指定した材料の値をボウルの一番上の値で割る

  • Add dry ingredients [to mixing bowl].: 固体の材料の値を全て足し、ボウルに入れる

  • Liquefy 材料名.: 指定した材料を液体にする

  • Liquefy contents of the mixing bowl. ボウルの中の全ての材料を液体にする
    (液体化は Unicode で対応する文字として出力するためなどに使う)

  • Stir [the mixing bowl] for 数値 minutes.: ボウルの一番上の値を数値の分だけ "ロール" する
    (ロール: 一番上の値を 数値 個下に動かし、それより上の値を上に動かす)

  • Stir 材料名 into the mixing bowl.: ボウルの中の指定した材料を、その値分だけロールする

  • Mix [the mixing bowl] well.: ボウルの中の材料をランダムに並べ替える

  • Clean mixing bowl.: ボウルから全ての材料を消す

  • Pour contents of the mixing bowl into the baking dish.: ボウルの中の全ての材料を耐熱皿にコピーする

  • 動詞 the 材料名.: ループを始める
    ループでは以下を実行する
    1) 材料の値をチェック
    2-1) 0でなければ、"until" に達するまで処理が続く
    2-2) 0であれば、ループを抜けて "until" の後の命令を実行する

  • 動詞 [the 材料名] until 動詞(過去形?).: ループ区間の終わりを示す
    過去形 (?) の動詞は、ループ開始時の動詞と同じものを使う
    材料名が指定された場合、これが実行されるたびに材料の値を -1 する

  • Set aside.: 最も内側のループが終了し、"until" の後の命令が実行される

  • Serve with 補助レシピ.: 副料理長を呼び、補助レシピ (後述) を実行する

  • Refrigerate [for 数値 hours].: 処理を終了する
    補助レシピ内なら副料理長からボウルを受け取る
    時間が指定された場合は、耐熱皿の値を出力する

Method.
Sift the flour.
Put flour into mixing bowl.
Serve with caramel sauce.
Stir for 2 minutes.
Remove egg.
Rub the flour until sifted.
Stir for 2 minutes.
Fold the butter into the mixing bowl.
Pour contents of the mixing bowl into the baking dish.

提供

全ての耐熱皿が空くまで、一番上の値を取り出しては出力、を繰り返します。

記載は任意ですが、出力をしたい場合は必須です。

Serves 数値.

補助レシピ

特殊な材料 (ソースなど) を得るために必要な小さなレシピです。
補助レシピはメインのレシピの後に続けて書きます。

メインレシピのどこかで例えばソースを呼び出したとき、副料理長が料理長のボウルや耐熱皿の中身をコピーしてソースをつくり始めます。
副料理長の仕事は料理長のボウルなどには反映されませんが、調理が終わると1つ目のボウルの中身を料理長に渡します。


実行環境

Python でもいけるようなことが書いてありましたが、やり方わからず。

ブラウザ上で動かせるものがあったのでそちらを利用すると良いでしょう。

Chef | Esolang Park


コーディング

ここからは、実際にいろいろつくってみます。

Hello World!

Hello World Cake.

Tutorial of Chef.

Ingredients.
32 g butter
87 g flour
111 ml water
114 g egg
108 ml milk
100 g sugar
33 g salt

Method.
Put salt into the mixing bowl.
Put sugar into the mixing bowl.
Put milk into the mixing bowl.
Put egg into the mixing bowl.
Put water into the mixing bowl.
Put flour into the mixing bowl.
Put butter into the mixing bowl.
Serve with toppings.
Liquefy contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.

Serves 1.

toppings.

Ingredients.
72 g cherry
101 g strawberry
108 g orange
108 g melon
111 g grape

Method.
Clean the mixing bowl.
Put grape into the mixing bowl.
Put melon into the mixing bowl.
Put orange into the mixing bowl.
Put strawberry into the mixing bowl.
Put cherry into the mixing bowl.
Refrigerate.

ケーキ本体とトッピングで分け、それぞれ「 World!」と「Hello」を出力するようにしてみました。
ここで、「Hello World Cake」はメインレシピ、「toppings」は補助レシピにあたります。

プログラム自体は文字に対応する数をそのまま材料の数量として、ひたすらボウルに入れた後に出力する、という単純なものです。


フィボナッチ数列

Fibonacci Chocolate.

Ingredients.
10 ml milk
1 chocolate

Method.
Put milk into the mixing bowl.
Put milk into the 2nd mixing bowl.
Remove chocolate from the mixing bowl.
Remove chocolate from the mixing bowl.
Fold milk into the mixing bowl.
Put chocolate into the mixing bowl.
Put chocolate into the mixing bowl.
Shake the milk.
Serve with butter.
Shake the milk until shake.
Fold milk into the 2nd mixing bowl.
Transfer the milk.
Fold chocolate into the mixing bowl.
Put chocolate into the 2nd mixing bowl.
Transfer the milk until transfer.
Pour contents of the 2nd mixing bowl into the baking dish.

Serves 1.

butter.

Ingredients.
1 ml milk
1 g salt

Method.
Fold milk into the mixing bowl.
Fold salt into the mixing bowl.
Clean the mixing bowl.
Put milk into the mixing bowl.
Add salt to the mixing bowl.

チョコレートのバター乗せみたいな変なものになりましたが、同時に milk 項分のフィボナッチ数列の出力ができるようになりました。
(初めの構想ではチョコレートが増殖する感じにしたかったのですが、結局バターが増殖するようになりました。)

流れ
初めにボウルに chocolate を2つ入れます。
ここで副料理長にバトンタッチし、牛乳を振りながらボウルから上2つを取り出しては足し、を繰り返して料理長に渡します。
これでフィボナッチチョコレートはほぼできているのですが、提供の順番は小さいものからにしたいので、2つ目のボウルを使って順番を逆にしています。

先程紹介したサイトではプログラムを段階的に進めることもできますので、どこで何が起こっているかわかりやすいかと思います。


まとめ

以上、Chef を触ってみました。

一風変わった言語シリーズの中では単純な方なのではないでしょうか。
ですが、if文がないようなのでできることは限られるかもしれません。
(こちら (If in esoteric programming language "chef") を見るとできなくはなさそうですが、どう実装すれば良いかわからず。)


「chef プログラミング言語」と調べるとサーバー構築 (?) かなんかの別の「Chef」がヒットしてしまい日本語の記事は見つけられなかったので、Chef やりたいけど英語やだという方はこの記事が助けになれば幸いです。
(英語の記事はたくさんありましたので問題ない方はそちらの方がいいかもしれません。)


最後まで読んでいただいてありがとうございました。また次回。