高校で情報処理の授業が始まってからずいぶんとたつわけですが、2022からいつの間にやら必修科目になっていたようですね。
Infrabbitです。なんでこんな話を始めているか、というとDNCLとかいうわけわからん言語の名前を目にし、それが「Daigaku Nyushi Center Language」の略だとか言われたら気持ち悪くてしょうがない。Language使うならその前も全部英語にしろよと思う。
で、DNCLの言語仕様を眺めていると、いやー気持ち悪いですねぇ。
varは変数だけどVarだと配列として扱う。いやいや待て待て。VARは定数である。
いやいやいやいやいやいや待て。変数記法ひとつで型が変わってしまうってキツいって。そんなんするくらいなら型宣言ちゃんとやれや。var/array/constの宣言を定義するだけだろ。
とかまあ普通に実用の際の問題みたいなところが真っ先に目についたんですが、よーく考えてみればこれって大学入試のロジック記述のための記法なわけだ。型宣言とかマクロとかついてたら逆に問題として組みにくい、ということなんだろうかな、と思い至ったわけですね。
foo = 1
Bar[0] = foo * 3
のほうが、
var foo = 1
array bar=[]
bar[0] = foo * 3
行数減るから。いやでも直感的に後者のほうが読みやすい気がするんだが…。四則演算子、論理演算子、比較演算子あたりに違和感がないだけに変数の型の取り扱いがすごくキモい気がする。というか文字列型も数値型もいっしょくたに変数、で扱うのか。文字列と数値の加法したらどっちにキャストするのか、それとも型不一致エラーなのか気になるな。文字列型とか数値型、という定義そのものがどーも見当たらないので、そういう意味では「変数型」とやらになるのだろうか。
そもそも配列も何の型の配列、という定義がないので、array[0] = “abc” ; array[1]=4 とか成り立つわけだ。まあそれ自体はできてもいいんだけど、実装考えたらかなりキモイ仕様と言わざるを得ない。というか世にある言語ってきちんとしてんだなぁというどうでもいいところに感心してしまう。
まあ世の言語系非依存を目的にした試験用言語にごちゃごちゃいうてもしょうがないんだけど、授業でPythonとかやったうえで試験のためだけにこのクソキモい記法を頭に入れるのかと思うと脳みそがもったいない。
というかインクリメント演算子と加算減算代入とsplit/joinとかください。というか果てしなく手続き的よな、ファンクションすらないとか。制御文が日本語なのもマジ気持ち悪い…。
日本語プログラミング言語なでしこを思い出す。
と思って久々に公式覗いたら更新されててビビる。まさかの現役。
とても懐かしい気分になって、マニュアルを読み始めたらとんでもないことが書かれていた。
加えて、命令の引数には必ず助詞を指定します。助詞はそれぞれ異なっています。そのため、命令は語順ではなく助詞によって引数を判別します。つまり、「AからBへファイルコピー」と書いても「BへAからファイルコピー」と書いても同じ意味になります。
は? 何言ってんの。
だいぶ自然言語に近づけたのか。意外とめんどくせぇことやってるぞ、これ。一回分かち書きでパースして助詞単位で文節処理を通すみたいなコンパイラ作ってるのか。
そのまま読んでいくと、変数名の制約がかなりきつい。日本語の助詞文字を含むとアウトだから、とまととかがダメ、と。まあ《》や${}でくくれ、という話のようだがさすがに《》は違和感。
${}が現実的だなぁ。
ちなみになでしこで便利、とされる「それ」構文はPerlでいうところの省略記法の一つ、暗黙変数ですね。Perlが普段使わない人々から蛇蝎のごとく嫌われた最大の理由の一つ。
なんせ、Perlの省略記法はとにかくほとんどの要素を省略しまくることができたせいで、Perlのやりすぎスクリプトはもう書いた本人すら数日後に見るとわからないレベルになる。
例えばこんなのとか。
ぱっと見で最終系を素直に読める人は少ないんじゃないですかね、特に高級言語に慣れている人々。
やってることは本当に単純で、三項演算でnullかfuzz/buzz、そうじゃなければ$_という式を文字列結合して後置forでぶん回しているだけですね。awkなんかはこの辺の省略芸からしてみればかわいいものです。Perl書いてるとたまに文法なんか何でもいいんだよ的気分になり、Syntaxとはいったい何かとかわけのわからない宇宙に飛び立ちそうになる時があります。
Perl書いてた頃だとここまで圧縮することは少なかったですが、$_の暗黙変数は多様しますし、三項演算もわりと正義扱いで使用します。foreachなんかまともに使った記憶もありません。読みやすさ? 知るかボケ、動きゃあいいんだようごきゃあ。まあさすがにprintよりsayのほうがタイプ数少ない、は吹き出しましたけどw 二文字くらいいいじゃねぇかwwwww
まあでも便利なんすよ暗黙変数。
なお、後置ifは私が愛用するTerraformにおけるfor文処理の中で現役です。
public_domains = { for k,v in domains : k => v if v.public }
とか書きます。読みにくいけど宣言的なんですよねぇ。
などとちょいちょい横道にそれながらなでしこのマニュアルを読んでいたんですが、しまいのほうに
なでしことDNCLは同じ日本語をベースとしたプログラミング言語であり、文法も非常に似ています。しかし微妙なところで違いがありました。そこで、なでしこにDNCL互換モードが実装されました。
普通に吹いた。何互換実装してんだよおおおおおお!w
まあ完全互換じゃないようですが、なでしこ、結構いろいろ変わっていて自分が知っているv1からはずいぶん変わったんだな、というのとそれなりに結構洗練されていて、以外と悪くないじゃないの、という感想。
ぱっと手元に使える環境作っておいても損はないかもしれません。もっともVSCodeにExtentionがないと使う気が起きませんが。
言語仕様って結構ちゃんと考えられて作ってるんだね、というお話でした。