Ring 思ったより使えなかった
- カテゴリ:
- その他プログラミング言語
- コメント数:
- Comments: 2
◆ シンプルすぎて他言語の感覚で使うのは辛め
◆ 16進数リテラルが無いとか文字列リテラルにエスケープが無いとか
◆ true ⇨ 1, false ⇨ 0, null ⇨ ""
◆ ソースコードも短い
◆ その割に DB 接続とか GUI や Android 対応とか 言語機能以外のできることは多い
◆ 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 と一緒
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 環境でも実行したり ゲームエンジンがあったり
そういう意味では思ったよりかなりすごかったです
COMMENT
コメント一覧 (2)
-
- 2018/05/13 01:55
-
Ring 1.7 の日本語粗訳ドキュメントなら下記にありますよ (Ring-docs-1.7jp_ppv01.7z)。
よろしければどうぞ。
https://osdn.net/users/megumi_engines/pf/at/wiki/FrontPage
実際に開発で使ってはいますが、ドキュメントの質が悪くてあまり使いやすくはないのが難点ですね。
-
- 2018/05/15 22:22
-
情報ありがとうございます
次 Ring 使う機会があったら見てみます
Ring の公式ドキュメントはいろいろ書いているのですが うまくまとまってなくて求めている情報を見つけづらいのですよね
日本語化してローカルファイルとして見れるのならそれっぽい単語で grep を書けて探すのもできそうですね