Discuss Scratch

yucca42
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

プログラム初心者の頃は「なんでわざわざ方指定するんや!めんどいだろ!もっと言語の方が頭使えよ!」と思っていました。
簡単なツールやシステムを作るなら型推定は便利ですが、
大規模な開発になってくると「なんで型指定してないんだよ!何の値が入ってるかわかりずらい!型推定に頼るな!」と思うときの方が多い気がします。(今のエディターや型推定は優秀なので本当に困ることはないですが…)

言語を作る上でも、最初は型を指定しないとエラーになるように作った方が楽だし、バグも少ないと思います。
そのうえで、型推定ができる仕組みを実装するといいと思います。

少なくとも最初から型推定ありきの言語を作ろうとすると、どこかで矛盾が生じ、あいまいな言語になってしまうと思います。
まぁ言語にわかなので個人的見解ですが
kuroge_
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

今作っている言語で廃止するかしないか迷っている関数があります
皆さんの考えをいただきたいです

1 改行しないprint文
print text
# 改行するprint文はprintln
2 calc関数(値の計算)
# 今までの書き方
var x 5
var y 3
var z 0
calc z x + y
println z
# 「8」が出力される

# 今の基本的な書き方
var x 5
var y 3
z := x + y
println z
# 結果は同じ(:=は計算したものを代入という意味)
皆さんの考えを教えていただきたいです。
rinasama_tabasi
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

yucca42 wrote:

プログラム初心者の頃は「なんでわざわざ方指定するんや!めんどいだろ!もっと言語の方が頭使えよ!」と思っていました。
簡単なツールやシステムを作るなら型推定は便利ですが、
大規模な開発になってくると「なんで型指定してないんだよ!何の値が入ってるかわかりずらい!型推定に頼るな!」と思うときの方が多い気がします。(今のエディターや型推定は優秀なので本当に困ることはないですが…)

言語を作る上でも、最初は型を指定しないとエラーになるように作った方が楽だし、バグも少ないと思います。
そのうえで、型推定ができる仕組みを実装するといいと思います。

少なくとも最初から型推定ありきの言語を作ろうとすると、どこかで矛盾が生じ、あいまいな言語になってしまうと思います。
まぁ言語にわかなので個人的見解ですが
まあ行っちゃえばそうですね
あとおまけなんですが
実装するとしたらこうしました
型推論 ver a : int = 10 (ver a = 10)
型宣言 ver int a = 10 (ver inf a = 10)
あとrustは独特で面白いので是非触って見てください
rinasama_tabasi
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

全然関係ないですけど、
今のプログラミング言語を作り終わったら
LLVMを利用した
プログラミング言語を作りたいです
難易度が高いと思いますけど(;^_^A
C&RUSTで実装しようと思います。
(まあ直にアセンブリにしてもいいんですけどね
 夢は必要です。ロマンがあります)
akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

既に述べたように、僕はScratchにコンパイルするプログラミング言語を作っているのですが、
面倒臭くなって現実逃避を始めました。

こちらが、現実逃避に作ったプログラミング言語で
Scratchで動くインタプリタ「Pumpkin」です。
https://scratch.mit.edu/projects/736540036/

「Pumpkin」なのはもうすぐハロウィンだからです

Last edited by akinarin (Oct. 1, 2022 09:08:39)

akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

Pumpkin ver 0.1の仕様について

特徴
  • Scratch上で動く
  • 強い動的型付け
  • マルチパラダイムを目指す
文法
文末にはセミコロン必須(文章末には無くても良い)
リテラル
現在、整数リテラル、文字列リテラル、リストリテラル、ラムダ式をサポート
32;
"Hello World";
[2, 3, 5, 7, 11, 13];
{x -> x + 5}
演算子
四則演算, 比較演算子, @演算子が存在
0 * 2 - 4 + 5 ^ 2 > 3;
"Hello World" + "!!";
[2, 3, 5, 7, 11, 13] @ 3; "番号アクセス。他の言語と同じように番号は0から始まるので7"
変数
最初の代入で宣言、スコープも存在
a = 0;
b = (c = 3 + 4; c * 7);"他の言語と違い()内には文が書ける";
"ここではcが使えない"
関数
標準で三角関数, 対数関数, print関数をサポート
()は省略可
log 2 4;
print(asin (sin 100))
ラムダ式によって自作も可能
add = {x -> {y -> x + y}}; "returnはないが、最後の式の値が帰る";
add 4 5; "=> 9"

今後の課題
現状ではラムダ式内からは変数の書き変えができないので
できるようにしたい
x = 0
a = {
x = 5; "因みに引数がないラムダ式も書ける"
}
a 0; "ここでxが5に書き変わってほしいが現状は無理"
log関数がカリー化に見えてカリー化ではない
x = log 2; "カリー化もどきなので部分適応が不可能";
"この文はエラーになる"
if関数/if式 っぽいものが欲しい
"if式";
if x == 0: b + 3 else:(
a = 23
a * 5
)

"if関数";
if (x == 0) {b + 3} {
a = 23
a * 5
}
小数ほしい
3.2;
4.toString; "現状、小数が実装できていないのはメソッド呼び出しとの区別の仕方を
まだ考えられていないから"
型定義ができるようにしたい
typedef Mater; "strong typedef的なやつ";
length = Mater(3)

Last edited by akinarin (Oct. 1, 2022 22:03:32)

akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

Pumpkinのifの悩み事
上に書いたようにPumpkin ver0.1にはifがありません。
つまり、条件分岐がなくチューリング完全ですらありません。

「チューリング完全でないのにプログラミング言語を名乗っていいのか!」

だからこそ、早くifを実装したい訳です。
しかしながら、ifの文法に少し悩んでいるのです。

関数での提供
既に述べた通り、ifは文法にせず、関数として提供してもよいのです。
Pumpkinにはラムダ式があるので、実現可能です。
if (a < 0){
"aは0未満"
} {
"aは0以上"
}
この方法の利点は、面白さです。
「わざわざ文法を用意せずとも関数だけで実現できるんだぞ」というのが面白いし
この言語の拡張性の高さを端的に表現できます。
しかし、この方法には欠点があります。
"else if がネストになる";
if (a < 0){
"aは0未満"
} {
if (a == 0) {
"aは0"
}{
"aは0より大きい"
}
}
さらには「}{」のところが少し不細工で嫌です。

Python風if式(三項演算子)
みんな大好きPython。
"aは0未満" if a < 0 else "aは0以上"
ifの中身が前に出てて少し気持ち悪いですね。却下です。
また、ifの中身を()を使って文章にしたときとかに、読みづらいです。
(
print("aは0より小さいんだって");
print("へえ、そうなの")
) if a < 0 else print("aは0以上")

Pythonのif文風if式
PythonはPythonでもPythonのif文風if式です。(長い⋯)
if a < 0:
"aは0未満"
else:
"aは0以上"
Pythonとは違い、インデントを使っているわけではないので1行にもかけます。
if a < 0: "aは0未満" else: "aは0以上"
しかしながら、これにも欠点があります。
if a < 0:
"aは0未満"
else:
"aは0以上"
+ "です"

"if式全体に「です」を足そうとしているのにelse内しか足せていない。
↓こう書かないといけない";

(if a < 0:
"aは0未満"
else:
"aは0以上"
) + "です";
この外側()が嫌なわけです。
まあ、他のと違い許容範囲だとは思います。

Ruby風if式
PythonでだめならRubyでどうだ!
if a < 0;
"aは0未満"
else
"aは0以上"
end + "です"
「end」があるお陰でPythonの問題はカバーできています。
ですが、僕はこの「end」を書くのが嫌なのです。
(だって、C風の文法が好きなんだもん)
さらには、Pumpkinではココ以外に「end」を使う場面がないので、
言語の統一性が無くなって嫌なんです。

まあ、これが一番マシでしょう。

終わりに
PumpkinのifはPython風かRuby風のどちらかにしようと思います。
他の案があれば、お願いします。
akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

kuroge_ wrote:

今作っている言語で廃止するかしないか迷っている関数があります
皆さんの考えをいただきたいです

1 改行しないprint文
~~~~(中略)~~~~~
2 calc関数(値の計算)
~~~~(中略)~~~~~
皆さんの考えを教えていただきたいです。

「改行しないprint」はどの言語にもあるので、廃止しなくていいと思います。
Pythonでも
print("Hello World!", end = "")
こう書けば改行されませんし、改行しない方法は何かしら残しておくべきではないでしょうか。

calc関数については、廃止しても構わない気がします。
他のシンプルな手段で代用可能みたいですし、移行が簡単なら廃止してもいいと思います。
yucca42
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

改行しないprint文についてですが、
自分は考え方が逆だと思っています。
元々あるのは改行されないprint文であって、使用者が改行したい場合に「\n」のような改行文字を文字列につけるべきと思います。
それが面倒だからprintlnのような関数ができたのではないでしょうか?
これは想像なので本当はわかりませんが…
akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

yucca42 wrote:

改行しないprint文についてですが、
自分は考え方が逆だと思っています。
元々あるのは改行されないprint文であって、使用者が改行したい場合に「\n」のような改行文字を文字列につけるべきと思います。
それが面倒だからprintlnのような関数ができたのではないでしょうか?
これは想像なので本当はわかりませんが…
確かに、僕もそう思います。
でも気づいたんだと思います。
「あれ、改行しないprintってあまり使わない?」
だからPythonとかはデフォルトで改行になるんだと思います。
akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

Pumpkinのif式の決定
散々悩んだif式ですが、上に挙げたもの以外のものを採用しました。
「{}を絶対に付けないといけなくなったC風のif文」です。
if (a < 0){
"a < 0"
}
elsif (a == 0){
"a = 0"
}
else {
"a > 0"
}
当初は()だけでも省略可能(Rust, Swift, Go風(但しelsifだけ違う))にしようと思ったのですが、
ラムダ式を引数にもつ関数との区別ができないので却下となりました。
if a < 0 {
"a < 0"
};
"こう書きたかったなあ"
他の言語とは違い、ifの後にもセミコロンが必要です。
面倒臭すぎるので改善方法を考えます。
やはりScratchで改行コードが使えるようになってほしいですね
akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

Pumpkin ver 0.2 リリース

url-> https://scratch.mit.edu/projects/739589527/

Pumpkin ver 0.2の仕様について

主な変更点

文末セミコロンが必須じゃなくなった
"文末セミコロンが要らないぞー"
"解放された~!"

if式ができた
if (a < 0) {
"aは0未満"
}
else{
"aは0以上"
}

ラムダ式で外側の変数が書き換えられるようになった
a = 0
{
a = 3
} ()
print a; "=> 3"

logを部分適用できるようになった
log2 = log 2
print(log2 8); "=> 3"

パイプライン演算子ができた
1 + 2 |> print; "=> 3"

add関数サポート
a = []

add 5 a
print(a @ 0); "=> 5"

a |> add 5; "こういう書き方が便利"

以下記入漏れ

新しいリテラル
ture; false; "bool型"
0.3; "小数"
本当は小数はver 0.1から使えたのですが、わざと使えないことにしてました。

boolの演算子
true | false; "=> true"
true & false; "=> false"
bool型のリテラルのついでです

Last edited by akinarin (Oct. 3, 2022 13:13:47)

akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

Pumpkin ver 0.2ではこんな感じに「while文」を手作りできます。
"while文を実装するコード"
while = {cond -> {func ->
if(cond()){
func()
while cond func
}
}}

i = 0
while {i < 5} {
print i
i = i + 1
}

実行結果
0
1
2
3
4
kuroge_
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

今作っている新しい言語を紹介します。
名前はまだありません

hello world文
print: ("hello world!");

関数 func
func: ("hello_world")
print: ("hello world!");
END: ("hello_world");

変数の宣言・変更
var: (x, 10);

printf文
printf: ("hello `", "world");
#             ↑変数名も可
akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

kuroge_ wrote:

今作っている新しい言語を紹介します。

今までにないような文法で興味深いです。
拡張性がとても高そうですし、
ほんのり漂うlisp感から神の言語となる可能性を感じます。

2つ質問があります。

どの言語で実装していますか?
引数ありの関数などは、どのように書きますか?

Last edited by akinarin (Oct. 4, 2022 13:07:49)

kuroge_
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

#216
言語を作っている言語自体は前のと同じPythonです
関数の引数は、基本ローカル変数やグローバル変数の区別はしませんが、
もし良い案が思い浮かべば、考えて作りたいと思います。

Last edited by kuroge_ (Oct. 5, 2022 07:16:05)

kuroge_
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

例の言語を更新しました。

変更点1
行末セミコロン必須化

変更点2
引数内を改行可能に
# before
var: (x, 12);
# after
var: (
x,
12
);

変更点3
funcよりすこーし楽に書けるdef文の追加
def: (
hello_text,

print: ("hello!!")\
print: ("how are you?")
);

call: (hello_text);
# 呼び出しは同じcall文(funcと名前がかぶらないように注意)
また、defはセミコロンがいらないですが、行末の「\ (バックスラッシュ)」が必須に
kuroge_
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

例の言語にwhile文を追加しました

例(10回繰り返す)
var: (x, 1);

while: (x <= 10,

printf: ("` 回目\n", x)\
var: (x, x + 1)
);
rinasama_tabasi
Scratcher
100+ posts

プログラミング言語を作ろう(合作ではないです)

報告!
主が諦めてscratchでやるのを辞め
c++pythonで作ると言っています。

Last edited by rinasama_tabasi (Oct. 7, 2022 11:48:52)

akinarin
Scratcher
500+ posts

プログラミング言語を作ろう(合作ではないです)

kuroge_ wrote:

例の言語を更新しました。

変更点1
行末セミコロン必須化

変更点2
引数内を改行可能に

–(以下略)–

なるほど、引数内を改行可能にする為に、セミコロンを必須化させたのですね。

Powered by DjangoBB