ぼくのかんがえるさいきょうのプログラミング言語
TODOkembo.icon型システム入門とか関数型プログラミングとかまだまだ学ぶべきことは多い でも全てを学び終えてからやろうなどと考えてると永遠にやらないので今考えうる最高を成すことを考える
学びによって今ある不満と満足も変化するかもしれない
それはそれとして今ある不満と満足は今のうちは大事にしたい
異論反論は積極的に聞きたい
既存のプログラミング言語に思うこと
一貫性
Pythonはオブジェクト指向で基本メソッド呼び出しなのに組み込み関数だけ特別扱い これが気持ち悪い 例
誤list.length
正len(list)
インデントブロックが好き
括弧を書くのは構わないけど、括弧の始まりと終わりが遠いと混乱する
1,2行の時にもわざわざ括弧やendを書くのは煩わしい
Python のインデントブロックって概念滅茶苦茶好みなんだけど何故流行らないのか 変数と定数は全くの別物
正直「変数に const を付けると定数になる」みたいなのが気に食わない
定数とは特定の値やオブジェクトに名前をつけたもの
変数とはポインタのように何らかの値やオブジェクトを指し示すもの
ついでにミュータブルとイミュータブルも別物のはず
ミュータブルなリストは定数であっても中身を書き換えられる
イミュータブルなリストは変数であっても中身は書き換わらない
ただリストやオブジェクトがイミュータブルであってもメンバがイミュータブルではないため部分的に状態が変化してしまうみたいなややこしいケースもある……
定数/変数/ミュータブル/イミュータブル この区別をもうちょっと明確化できないか
table: プログラムが持つデータの編集状態
変数 定数
ミュータブル 副作用があるし指すものも変わる 副作用の影響受けるかも
イミュータブル 副作用だけはないが指すものは変わる 永遠不変
これらの違いを文法に組み込みたいんだけどどうだろうか
型は欲しいけど型だけじゃ物足りない
本当に欲しいのは始域・終域・値域の集合
例えば除算の除数は0であってはならない
それは型だけでは表現できてない
本当に欲しいのは引数と返り値が満たす条件
if 文を活用したい
if (x > 0) { ... }とあったら...の部分では x が 0 より大きいことが保証されてるのにその情報はif文判定後は全く活用できない
先述の型の話も含めて、変数に値域みたいな情報も持たせられたら……
変数名を考えたくない
しかし型が無い変数は変数名が適切である必要がある
誤解なく伝わる変数名を考え整理するのは面倒くさいのでやりたくない
それよりもその変数の「値の範囲や性質」が書いてある方が意味を推察しやすい
オブジェクト志向?
object.methodに違和感
「私がコンピューターに〇〇させる」だよね?
英語ならI command the computer to do method object.だよね?
語順おかしくない?
カプセル化に異論は無いけど、メソッドがオブジェクトに付随するというのが違和感 関数型言語っぽい話になってきたな
要はモジュールの中に、値の型と関数の集合があればいいはず
これを継承とかインポートとか出来れば実質クラスと同様のことができるはず
とは言えf(x)じゃなくてxにfを適用すると書きたい場合もある
メソッドチェーンとか
正直メソッドチェーンがすごく長くなるのもあまり好きじゃない
でも後で書くけど変数名何度も書くのもそれはそれで嫌
例えば引数に$とか書くと自動的に1つ前の式の結果が入るとかやれば割とイケる?
引数と関数の関係が分からない
関数に引数を代入する時、引数の順番とか考えるのが面倒くさい
前置詞とか付けようよ
例えばlist.map(f)よりmap(f, to: list)とかの方が明白だし引数の順序に悩まされることもない
sub(x, y)よりsub(y, from: x)の方が意味が明白
無名引数は1つまでに制限して、2つ目以降はキーワード引数強制みたいにしたい
変数名を何度も書きたくない
なんかitとかthatとかで適当によろしくやってほしい
一方で識別子の指すものが不明確だと人はキレる
変数の適切な名称は文脈によって変化する
コードをブロックで区切って文脈での変化を推奨したい
メソッド呼び出しと変数の違いは分かるようにして
Rubyの特徴かもしれないけど 括弧も引数もつかなかった時それが呼び出ししてんのか値を読んでるのか分からんのはつらい 既存の表記法もハック出来るの楽しい
メソッドを定義することで、オリジナルのオブジェクトにも演算子を定義出来たりする たのしい!
というわけで色々考えてみた
文法
プログラム
プログラムは1つの式ブロックである
式ブロック
1つ以上の式のリストであり、最後の式の返り値を返す式である
表記方法が2つある
ブレイス表記
{}で括り、各式を;で区切る
途中で改行はできない
インデント表記
その行のインデントよりさらに1つ下げ、
式
式は任意の処理を行い、1つの結果を返すものである