◆ シンプルすぎて他言語の感覚で使うのは辛め
  ◆ 16進数リテラルが無いとか文字列リテラルにエスケープが無いとか
  ◆ true ⇨ 1, false ⇨ 0, null ⇨ ""
  ◆ ソースコードも短い
◆ その割に DB 接続とか GUI や Android 対応とか 言語機能以外のできることは多い

なんで Ring ?

前記事を書いてるときにもうちょっと言語増やしたいなっと思って増えたものの一つが Ring です
他の増えたのは Prolog と Racket

新しめな言語がいいなと Wikipedia を見てました
https://en.wikipedia.org/wiki/Timeline_of_programming_languages#2010s

Rust ……は一応ある
Ceylon ……はすでに調べたけどいいのなかった
Dart ……は WebAssembly があれば好きな言語を実行できるようになって JavaScript を置き換える言語の必要性もないしもう終わった言語なのでパス (2 がでるとかでないとかきいたけど)
C++11 ……はある
Kotlin ……はある
Red ……は聞いたこと無い言語
Opa ……も聞いたこと無い言語
Elixir ……はある
Elm ……はある
TypeScript ……は個人的にキライ
Julia ……はある
P ……は聞いた覚えあるけど詳しく知らない
Ada2012 ……は Ada って昔の言語だったと思うけど C++ みたいに続けられてるのかな
Crystal ……は聞いたこと無い
Hack ……はインストール苦戦中
Swift ……も fedora バイナリ提供されてないのでインストールしてない けどあるらしい
C++14 ……は 11 と一緒
Perl6 ……はある
Ring ……は聞いたこと無い
C++17 ……は 11 と一緒

という感じで Red, Opa, P, Crystal, Ring あたりから選んでみることにしました
Ring は一番新しいし頻繁にバージョン上がってるし 公式サイトがそれなりにキレイだしということでこれにしました


ところで他の言語もですが 最近の言語の名前ってほとんどが一般単語なのでググりづらいんですよね
特にマイナーなうちは
上にあげた一覧で TypeScript と数字付いてるの以外は単体でググっても一番最初にプログラミング言語が来ないと思います
一単語で自作のワードとか使ってくれると良いのですけどね
そういう視点だと関数型言語って独自の名前率高い気がします
Lisp とか Erlang とか Haskell とか Clojure とか

使ってみて

目的は 1+1 を REPL で動かすだけなのでなんでもよかったのですが ドキュメントのページは意外と多めで公式サイトもいい感じだったし REPL まであったので軽く使ってみました

結果はいろいろと使いづらい言語でした
他言語みたいに情報が多ければまだいいのですが ググっても全然情報がないのでほぼ公式のドキュメントと付属してるサンプルしか参考にできません
ドキュメントにないけどできる みたいな機能があっても把握できてません

Boolean 型がない

文字列型と数値型とリストとオブジェクトしかないそうです
JavaScript だって ES5 までは null/undefined を除けば 数値と文字列と真偽値とオブジェクトしかなかったですしね

そういうわけで Boolean 型がないので比較結果は 1 か 0 です
まあ C 言語もそうですし困るかと言えば困らないけど true/false くらいはあってほしいかなって思います
出力したときに数値としての値なのか真偽値としての値がわかりづらいです

一応 Ring には null/true/false というキーワードはあって null は空文字列で true/false は数値型の 1/0 になります
正確には自動で作られる変数なので上書き出来ます
ここの関数内で作られてます

= が代入兼比較

代入するときも値が等しいか確認するときも 「=」です
文脈で変わるみたいですが なんかイヤです
変数はイミュータブルで宣言時のみ 代入になるならいいのですが いつでも上書き代入出来る上に宣言構文がなくて最初に代入したら変数が作られる仕様なので これはどっちなのか判断がし辛いです

変数の大文字小文字の区別がない

ちょっとしたミスが合っても動くので場所によって大文字小文字がバラバラだったりして気持ち悪いコードになります
PHP もそうなのですが 良いと思ったことのない仕様です
特に クラス名とファイル名を合わせるという PSR に沿った作りにすると ファイル名の大文字小文字の区別をしない Windows のファイルシステムだと動くのに Linux に持っていったら動かないということが起きたりします

Ring もファイル名とクラス名を合わせる作りにするなら同じ問題を抱えそうです

基本型にメソッドがない

ここも JavaScript じゃなくて PHP よりだと思いました
文字列のサイズを求めたり部分文字列を取り出したりするときに文字列型のメソッドというのはなく 関数に入れないといけないようです
パイプライン演算子相当のものもなさそうなので関数ネストがつらそうです

文字列リテラルにエスケープが存在しない

探したのですがエスケープの情報が全然見当たらなかったです
"\t" や "\n" などを書いても全てそのまま出力されます
"\" ですらシンタックスラーにならず通るので 「\」 が特別な文字ですらなくただの文字の一つのようです

なので \u3042 とか \x3042 とか \u{3042} といった Unicode 形式で文字列を書けません

? char(number("0x61"))
// a

としないといけないです

日本語は対応していないので

? char(number("0x3042"))
// B

こうなります

UTF-8 の 3 バイトを書けば可能です

? hex2str("e38182")
// あ

ところで 「?」 が print や echo にあたるものです
REPL のプロンプトではありません
「see」 でも一緒です

tab や CR/LF は一応キーワード(変数)が用意されていて

text = tab + tab + "foo" + cr + nl

のように書けます
nl が LF です
文字列がマルチライン対応なので直接 CRLF 改行やタブを含めれば可能ですが 空白文字は見づらいですから ただ改行を含めたいと言うだけ以外ならエスケープシーケンスのほうがいいです

今のところこれだけみたいで \f や \b などは char 関数で作らないとダメです

16 進数表記がない

上の例で 「char(number("0x61"))」 としていたように number 関数を通さないと 16 進数の数値が扱えないです
リテラルで 16 進数を書こうとしてもシンタックスエラーになります

正規表現がない

探しても見当たらずサンプルアプリの中で Qt の機能を使ってる QRegularExpression というのだけがありました
言語機能として用意されてないみたいです

Qt なので GUI を使う時限定でしょうか
GUI を起動しないでライブラリ関数使うだけならできそうな気もしますけど

構文

if や for などの構文は end で終わって Lua とか Ruby に近い感じかなと思っていたら

  • elseif を but にしてもいい
  • else を other にしてもい
  • if の end を ok にしてもいい
  • キーワードじゃなくて {} にしてもいい
  • switch の case は on にしてもいい
  • switch の end は off にしてもいい

などなど 構文の決まりがゆるすぎて読みづらいです
統一してほしいです

それぞれ意味が違ってるなら別にいいのですが 単純にああ書いてもいいこう書いてもいい となってます

そういえば PHP にも endif を使う構文があるんでしたっけ
あれはテンプレートエンジンとして使う時向けといえますが こっちは完全に使う人の好みでバラバラになりそうです

さらには自分でキーワードやオペレータを変える機能もあります

ChangeRingKeyword  func function

これで 関数定義のコマンドが function になります
JavaScript 風の関数構文の出来上がりです

function foo(x, y) {
? 100
}

オペレータは

changeringoperator + _+

とすると + を _+ に変えられます

http://ring-lang.sourceforge.net/doc1.7/syntaxflexibility.html#using-put-and-get-as-see-and-give

ソース

シンプルでいろいろ足りてないけど 変なところには力が入ってる言語に思います
ソースは C 言語で書かれていて 700KB と 1MB もない短さです
高機能で何でも出来ると言うよりはコンパクトなものを目指してるみたいですね

自分でソースまで読んだり書き換えたりしたい人には向いてるのかもしれません
Node.js が思い通り動いてくれなくてソースみてもたいていわからないで諦めますからね……


言語ソース自体は短くても付属されてる ring で書かれたライブラリが多くて 出来ることは意外とありました
Mysql や SQLite に接続してデータベースを操作したり Qt を使って GUI 画面を作ったり WebServer を作ったり Android 環境でも実行したり ゲームエンジンがあったり
そういう意味では思ったよりかなりすごかったです