Essen3
の編集
https://khfdpl.osask.jp:443/wiki/?Essen3
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
2016_10
2016_11
2016_12
BracketName
Essen
Essen0
Essen1
Essen2
Essen3
Essen4
EssenMemo0001
EssenMemo0002
EssenMemo0003
EssenMemo0004
EssenMemo0005
EssenMemo0006
EssenMemo0007
EssenMemo0008
EssenMemo0009
EssenMemo0010
EssenMemo0011
EssenR2
EssenR2_ess03f
EssenR2_ess03h
EssenR2_ess03i
EssenR2_ideas
EssenR2_jit00
EssenR2_jit01
FormattingRules
FrontPage
Help
IP
InterWiki
InterWikiName
InterWikiSandBox
K
KHPC
KHPC_v000doc01
KHPC_v001doc01
KHPC_v002doc01
KHPC_v003doc01
MenuBar
OSC
OSC20181027
OSC20190222
OSC20191123
OSC20230401
OSC20230528
OSC20231021
OSC20240310
OSC20241026
OSC20250221
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
SltVA
VariableArray
WikiEngines
WikiName
YukiWiki
advcal20161205
advcal20161206
advcal20161209
advcal20161210
advcal20161215
eoml0001
eoml0002
essen_ex01_0001
impressions
kcl_malloc
khfdpl_result1
members
memo0001
memo0002
note0001
note0002
note0003
note0004
note0005
note0006
oldworks
oldworks00
oldworks06
oldworks12
oldworks13
osaskjp_index
persistent_C
populars
pr20161105
pr20161105b
scsc
seccamp2017
spam_test
uxf
uxf_01
uxf_02
uxp
* プログラミング言語 Essen #3 -(by [[K]], 2016.08.07) ** これはなに? -まずは[[Essen]]と[[Essen1]]を読んでね。ここは続きを書きます。 -このページでは、なぜEssenがこういう仕様を目指したのかという話を書いておきます。 ** (1) scanfから考えてみる -scanfは代入したい変数が引数側にある。[[K]]はこれがどうにも許せない。 --scanf("%d %d", &a, &b); -このaやbは関数の返値として記述したい。その方が[[K]]にとっては直感的だ。 --(a,b)=scanf("%d %d"); -Essenでは、この形式を目指したけど、それはうまくいかなかった。でも以下の書き方ならいけそうである。そしてこれは十分に許容範囲だ。 --&(a,b)=scanf("%d %d"); -C言語などの場合、scanfがどんな型を返すのか定義時に固定しなければいけない。しかし上記みたいなことをしたいのならそれはできない。 --stdarg.hによって引数のほうはかなり自由に書けるけれど、返値については自由にする方法がない。 -そこでEssenは関数がどんな型を返すのかを固定しないことにした。変数にも型はない。値に型がある。 -しかしこの仕様はコンパイラを作るうえでは高速化の障害になるだろう。それはわかっている。でもまずはコンパイラのことは気にしないでやってみることにした。 ** (2) 変数の交換 -変数を交換する関数swapがあったとする。C言語なら swap(&a, &b); と書いて呼び出すことになるだろう。C++なら参照型が使えるから swap(a, b); と書くことができるだろう。これはすばらしい。毎回&を付けるのは煩雑になるだけだから。 --もちろん&を付けることによって、この関数呼び出しによってaやbが書き換わりうることを表現できているともいえるのだけど。 -しかしやはり引数のほうが書き換わるという仕様は[[K]]には気持ち悪い。値の変更は代入によって引き起こされるべきである。そんなわけでEssenではこうなった。 --&(a, b) = (b, a) -これはわかりやすいし簡潔だ。ちなみに同様のことはRubyでもできる。 -もちろんEssenでも、 swap(a, b) みたいな書き方をすることはできる。 ** (3) セミコロンの省略 -現在のEssenの仕様では、文末のセミコロンは省略できる。そのため、 a = 3 b = 4 c = 5 -みたいな書き方ができる。これは気持ち悪いと感じるかもしれない。 -まず、セミコロンの省略は「可能な選択肢」なのであって「義務」ではない。だから気持ち悪ければ省略しなければいいだけである。 -なぜこんな仕様を採用したのか。・・・初期のEssenではif文やfor文や関数宣言の末尾にセミコロンが必須だった。なぜならそれは「文末」だから。でもCやC++ではそんなものは書かない。だからできれば書かなくてもいいようにしたかった。 -加えて、行の末尾のセミコロンが省略できたら、ちょっと便利かもしれないなと思うことは何度かあった。現在の仕様ならこれも受け入れられるので、面白いなと思った。 ** (4) 関数宣言の構文 -Essenの関数宣言構文は以下のとおりである。 func = function(x, y, z) { ... } -つまりfunctionが関数を作る演算子で、その結果を変数funcに代入しているだけである。 -関数も第一級のオブジェクトとして扱われるべきだし、それにはこの構文が一番適していると思う。 ** (5) ローカル変数の定義# -当初Essenでは、未定義の変数への代入を発見したら、無条件で変数を生成して代入する仕様だった。 -しかしそれはやめた。なぜなら、ローカル変数域に作ったらいいのか、それともグローバル変数域に作ったらいいのか判断に迷うケースがあるからである。 -さらに、あるコード片があったとして、そのスコープの外側で宣言された変数があるかないかでコード片中の変数がローカルになるかならないかが変わってしまうというのは、コード片の「部品化」を妨げる仕様であって非常に良くない。バグの温床になる。 -ということで、ローカル変数は初出時に#をつけさせることにした。これで問題は起きないはずである。 * こめんと欄 #comment
タイムスタンプを変更しない
* プログラミング言語 Essen #3 -(by [[K]], 2016.08.07) ** これはなに? -まずは[[Essen]]と[[Essen1]]を読んでね。ここは続きを書きます。 -このページでは、なぜEssenがこういう仕様を目指したのかという話を書いておきます。 ** (1) scanfから考えてみる -scanfは代入したい変数が引数側にある。[[K]]はこれがどうにも許せない。 --scanf("%d %d", &a, &b); -このaやbは関数の返値として記述したい。その方が[[K]]にとっては直感的だ。 --(a,b)=scanf("%d %d"); -Essenでは、この形式を目指したけど、それはうまくいかなかった。でも以下の書き方ならいけそうである。そしてこれは十分に許容範囲だ。 --&(a,b)=scanf("%d %d"); -C言語などの場合、scanfがどんな型を返すのか定義時に固定しなければいけない。しかし上記みたいなことをしたいのならそれはできない。 --stdarg.hによって引数のほうはかなり自由に書けるけれど、返値については自由にする方法がない。 -そこでEssenは関数がどんな型を返すのかを固定しないことにした。変数にも型はない。値に型がある。 -しかしこの仕様はコンパイラを作るうえでは高速化の障害になるだろう。それはわかっている。でもまずはコンパイラのことは気にしないでやってみることにした。 ** (2) 変数の交換 -変数を交換する関数swapがあったとする。C言語なら swap(&a, &b); と書いて呼び出すことになるだろう。C++なら参照型が使えるから swap(a, b); と書くことができるだろう。これはすばらしい。毎回&を付けるのは煩雑になるだけだから。 --もちろん&を付けることによって、この関数呼び出しによってaやbが書き換わりうることを表現できているともいえるのだけど。 -しかしやはり引数のほうが書き換わるという仕様は[[K]]には気持ち悪い。値の変更は代入によって引き起こされるべきである。そんなわけでEssenではこうなった。 --&(a, b) = (b, a) -これはわかりやすいし簡潔だ。ちなみに同様のことはRubyでもできる。 -もちろんEssenでも、 swap(a, b) みたいな書き方をすることはできる。 ** (3) セミコロンの省略 -現在のEssenの仕様では、文末のセミコロンは省略できる。そのため、 a = 3 b = 4 c = 5 -みたいな書き方ができる。これは気持ち悪いと感じるかもしれない。 -まず、セミコロンの省略は「可能な選択肢」なのであって「義務」ではない。だから気持ち悪ければ省略しなければいいだけである。 -なぜこんな仕様を採用したのか。・・・初期のEssenではif文やfor文や関数宣言の末尾にセミコロンが必須だった。なぜならそれは「文末」だから。でもCやC++ではそんなものは書かない。だからできれば書かなくてもいいようにしたかった。 -加えて、行の末尾のセミコロンが省略できたら、ちょっと便利かもしれないなと思うことは何度かあった。現在の仕様ならこれも受け入れられるので、面白いなと思った。 ** (4) 関数宣言の構文 -Essenの関数宣言構文は以下のとおりである。 func = function(x, y, z) { ... } -つまりfunctionが関数を作る演算子で、その結果を変数funcに代入しているだけである。 -関数も第一級のオブジェクトとして扱われるべきだし、それにはこの構文が一番適していると思う。 ** (5) ローカル変数の定義# -当初Essenでは、未定義の変数への代入を発見したら、無条件で変数を生成して代入する仕様だった。 -しかしそれはやめた。なぜなら、ローカル変数域に作ったらいいのか、それともグローバル変数域に作ったらいいのか判断に迷うケースがあるからである。 -さらに、あるコード片があったとして、そのスコープの外側で宣言された変数があるかないかでコード片中の変数がローカルになるかならないかが変わってしまうというのは、コード片の「部品化」を妨げる仕様であって非常に良くない。バグの温床になる。 -ということで、ローカル変数は初出時に#をつけさせることにした。これで問題は起きないはずである。 * こめんと欄 #comment
テキスト整形のルールを表示する