※このマニュアルは書きかけです! どんどん更新していくつもりです!
初めに。 本記事は、私 tukinyanJP の言語開発についての記事ではなく、開発しているその言語の新しいマニュアルです。ぜひ、ご覧ください。
※このマニュアルの誤字・脱字を見つけた場合は、 編集リクエスト などで修正してくださると大変助かります。
追記: 2026年4月28日
ついに、 BE-Lang の無名関数が実装されました。
f = ->(f) { return f * f }
puts(f(10)) /* 100 */
また、コメント形式として // をサポートします。
// This is Comment
目次
- 著作権情報
-
BE-Langとは? - はじめの第一歩 ( こんにちは、世界! ・基本的な演算 )
-
BE-Langに値を覚えさせよう! ( 変数 ) -
BE-Langに繰り返しをさせよう! ( もし ~ なら ~ でなければ ~ (if) ・ ~ が本当じゃなくなるまで (while / for) -
BE-Langで関数を定義させてDRYにしよう! (Don't Repeat Yourself) -
BE-Langの癖ありオブジェクト指向プログラミングで遊ぼう -
BE-Langが、httpリクエストを送ってくれるよ! -
開発者向け
BE-LangのAPI
1. 著作権情報
本ソフトウェアの著作権情報を以下に記します。 ( 本記事は除外されます。 BE-Lang のインタプリタおよび処理系に適応されます。 )
Copyright (c) [2026] tukinyanJP
Apache LICENSE 2.0
※このほかに、ライブラリである Open SSL 、 Boehm - GC も含みますが、この記事では省略します。 ( 詳しくは、 BE-Lang の処理系に付属している LICENSE ファイルをご覧ください )
2. BE-Lang とは?
次に、 BE-Lang に、ついてです。 BE-Lang とは、私 tukinyanJP が C で開発した動的な型を持っていて、 C と Ruby が独特に合わさった独特な文法を持つプログラミング言語です。
3. はじめの第一歩 ( こんにちは、世界! ・基本的な演算 )
Hello, World!
さて、プログラミング言語で最初にすることは.... Hello, World! ( こんにちは、世界! ) ですよね。まず、 BE-Lang の Hello, World! の前に、 その文化を作った C 言語では、こんなに冗長なことを書いています。
#include <stdio.h>
int main(void)
{
printf("Hello, World!");
return 0;
// c 言語ではいちいち main 関数を定義して...
// 関数の返り値の型を指定して... 引数の型も...
// #include もしないといけない...
}
しかし、 BE-Lang を見てください。 main なんて定義しなくてもいいですし、余計な「オマジナイ」も書かなくてもよいのです。 ( puts はターミナル1 に値を表示する構文です。 )
puts("Hello, World!")
これで、アウトプットは
"Hello, World!"
となり、最初のプログラムはかけたことになります。
数式
また、文字列だけではなく数式も、扱うこともできます。 1 + 1 や、 1 * 2 、 1 - 1 、 1 / 1 、 1 % 1 などをサポートしています。もちろん、 puts (1 + 1) のように書くこともできます。
puts(1 + 1) /* => 2 */
puts(2 * 2) /* => 4 */
puts(2 / 1) /* => 2 */
puts(2 - 2) /* => 0 */
puts(4 % 2) /* => 0 */
これを実行すると、
2
4
2
0
0
と、表示されます。
1 + 1 で 2 が返されるのなら、 "Hello," + "World!" もできます。数値同士、文字列同士なら演算できますが、違う型同士の場合は、計算結果は 0 になります。もし、数値を文字列で扱いたい場合は 数値または数式.to_s() を使用して下さい。詳しくは 第七章の「 BE-Lang の癖ありオブジェクト指向プログラミングで遊ぼう」にて書いています。
比較式
数式を、比較することもできます。比較の結果は真偽値 ( true , false ) が返ってきます。
puts(1 + 1 > 2) /* => false 2 > 2 と同じ意味 */
puts(1 + 1 <= 2) /* => true */
puts(1 + 1 >= 2) /* => true */
puts(1 + 1 < 2) /* => false */
これを実行すると上から順に、
false
true
true
false
となります。
論理演算式
また、論理演算式と言って ~ かつ ~ や、 ~ または ~ 、 ~ ではない という条件式を簡単に書くことができる式です。
puts(1 == 1 && 2 == 2) /* 1 と 1 は等しい。 2 と 2 は等しい。 && は ~ かつ ~ なので、 等しい かつ 等しい ので、 true */
puts(1 == 1 || 2 == 1) /* 1 と 1 は等しい。 2 と 1 は等しくない。 || は、どれか一つが本当(等しい)であればいいので、 true */
puts(! 1 == 1) /* 1 と 1 は等しい。その反対で等しくない。 */
結果は、
true
true
false
となります。
配列とハッシュ
数式 や、 式 などではありませんが、値を複数まとめることができる 配列 と、 ハッシュ というものがあります。配列は、 [値・数式・式, ...] のように記述します。
puts([1, 2, 3]) /* 配列自体を表示。 */
また、配列の値にアクセスするには、 配列の値・式 [インデックス] でアクセスできます。
puts([1, 2, 3][0]) /* 1 が表示される。 0 番目が 1, 1番目が 2, 2番目が, 3 */
1
と表示されます。
実は、BE-Lang は設計上、配列の中に配列を作ることも可能です。これは、多次元配列といわれるもので、 Ruby や C などでも同じようなことができます。
puts([[1, 2, 3], [2, 4, 6]]) /* この配列は、要素数が2の二つの配列が入った配列 */
puts([[1, 2, 3], [2, 4, 6]][0]) /* この配列の 0 番目は [1, 2, 3] */
puts([[1, 2, 3], [2, 4, 6]][1]) /* この配列の 1 番目は [2, 4, 6] */
puts([[1, 2, 3], [2, 4, 6]][0][0]) /* この配列の 0 番目は [1, 2, 3] で、 [1, 2, 3] の 0 番目は 0 なので 0 */
次に、ハッシュです。ハッシュは、 [キー -> 値] と記述します。
puts({ "Love" -> "Ruby", "Like" -> "Python" }) /* ハッシュ自体が表示される */
puts({ "Love" -> "Ruby", "Like" -> "Python" }["Love"]) /* "Love" というキーがないか探し、あったら表示する */
4. BE-Lang に値を覚えさせよう! ( 変数 )
みなさん、変数って知っていますか? 値を メモリー と呼ばれる場所に保存するのが変数です。ちなみに、 C 言語では メモリー を自分で 確保 して、いらなくなったら自分で 解放 しないといけないのですが、2 BE-Lang では、 GC , といういらなくなった変数や値を自動的に回収(解放)する便利なツールを標準搭載しているのでメモリーバグはないといっても過言ではないでしょう。3 さて、BE-Lang で、どのように変数を作るのかというと、たったこれだけです。
変数名 = 値
BE-Lang は、動的な型を持っているので冗長な型名を書かなくてもよいのです。例えば、1 + 1 の結果を変数 x に保存して、表示させてみるコードはこんな感じです。
x = 1 + 1
puts(x) /* 2 */
ちなみに、変数に 1 を加算したい! 1 を引きたい というときは、
x = 1
x = x + 1
x = x - 1
のように書くよりも、
x = 1
x += 1
x -= 1
のように書くことをお勧めします。
もちろん、
x = "Hello,"
x += "World!"
としても、変数 x は Hello,World! になります。
先ほどの、配列とハッシュで、インデックスを使って再代入することもできます。
hash = { "Love" -> "Ruby", "Like" -> "Python" }
puts(hash["love"]) /* Ruby */
hash["love"] = "Ruby and C"
puts(hash["love"]) /* Ruby and C */
5. BE-Lang に繰り返しをさせよう! ( もし ~ なら ~ でなければ ~ ( if ) ・ ~ が本当じゃなくなるまで ( while / for )
さて、ここまで 変数 や、 式 、 ハッシュ そして puts ですね。ですが、これだけでプログラミングするのは難しすぎます。 BE-Lang では、 if や while 、 for という便利な構文を持っています。では、順番に if から説明しましょう。
if ( その条件が本当である場合 )
さて、 if 文ですね。 if 文は、 if 条件式 { 本当である場合に実行される式・プログラム } このように書きます。
if 文は、任意で条件式が本当ではないときに実行するプログラムをつけることができます。 if 条件式 { 本当であるときの式・プログラム } else { 本当じゃないときに実行する式・プログラム } と書けます。 else のすぐ隣に if を書くことで、もし~であれば~~、でなければもし~~ と書くことができます。
例えば、配列 fruit の 0 番目が apple の場合、 love apple と表示するプログラムはこのようになります。
/* みんなだいすき りんご! */
fruit = ["apple", "orange"]
if fruit[0] == "apple" {
puts("love apple")
}
結果はもちろん、
"love apple"
ですね。
while その条件式が本当の間
次に、 while ですね。 while は while 条件式 { 本当の間に実行したい式・プログラム } と書きます。例えば、変数 i が 10 になるまで変数 i を 1 づつ加算して、 puts するプログラムはこのようになります。
i = 0
while i <= 10 {
puts(i)
i += 1
}
while ・ for はとても便利ですが、条件式によっては 無限にループするかもしれません。無限ループは、 異常終了 や、 メモリーバグ の原因になる可能性があります。どうしても、無限ループにしたい場合は
while (1) {
}
か、
for i -> i, i == i {
}
のようにしてください。
for ( 配列処理がとっても得意 )
次に、 for ですね。 for は、 for 仮変数->仮変数がどのように変わるか, 続ける条件式 と書きます。そうですね。例えば、配列 fruits の中身を 0 番目から順番に取り出す。のような処理はこんな感じです。
fruits = ["apple", "banana", "orange"]
for i -> i += 1, i <= 3 {
puts(fruits[i])
} // "apple", "banana", "orange"
簡潔に書けますね。
このサンプルコードでは、配列 fruits の長さがわかっているのでいいのですが、いつか fruits に値を追加するかもしれません。追加して、条件式を柔軟にしたいときは、 3 を fruits.size() に置き換えて使ってください。これも、 第七章の「 BE-Lang の癖ありオブジェクト指向プログラミングで遊ぼう」にて書いています。
6. BE-Lang で関数を定義させて DRY にしよう! ( Don't Repeat Yourself )
さて、皆さん、突然ですが、 DRY って知っていますか? お酒じゃないほうの DRY です。 DRY とは、上記にも書いてある通り Don't Repeat Yourself ( 冗長なこと何回も繰り返すな ) の略です。冗長をなくすためにあるのが 関数 です。正確に言えば、 とある一定の処理を抽象化して呼び出せるようにするのが 関数 ですね。 def 関数名(引数) { まとめたいプログラム } と書いて、 関数名(引数) で呼びます。関数の結果(返り値) を設定する場合は、 明示的に return を書いてください。
初期のバージョンでは還元・競合を防ぐために ->関数名.(引数) となっていた時がありましたが、冗長なので還元・競合しないように修正をしました。
例えば、関数 plus に引数 x と y を渡し、それらを加算してその値を返すプログラムはこうなります。
def plus(x, y) {
return x + y
}
puts(plus(1, 1)) /* => 2 */