EssenMemo0009
の編集
http://khfdpl.osask.jp/wiki/?EssenMemo0009
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
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
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
* 実現したい機能のために仕様を考える#1 -(by [[K]], 2017.06.14) ** 引数の渡し方 -[1] -C言語では、変数aと変数bを交換する関数を書くとしたら、呼び出し時には swap(&a, &b); と書かなければいけない。 -私はこれはかっこよくないと常々感じている。この&を書かずに済ませる方法はないだろうか。 -ちなみにC++なら参照型とかを使ってこれを解決できる。 -Essenでは関数側の要求に合わせて引数リストを解釈するのではなく、何の事前情報もなしに引数リストを評価して、それを関数に渡すという方式を採用したい。なぜならそのほうがずっと簡単だから。 -となるとC++方式は採用できない。 -要するにとにかく (a b) と書いたときに、aやbの値を参照してそれを埋めてしまってはいけない。つまり単純に (1 2) とかに変換してはいけない。これじゃあ swap は実現できなくなる。 -どんな方法にすべきかは後で考えるとして、とにかくこれだけはありえない。 -[2] -どうすればいいか。それはここにはひとまず a と書いてありましたという情報のままにしておくしかない。しかも同じ a でも文脈(スコープ)によって指すものが変わるから、その情報も持たせるべきだ。それをここでは @a とでもあらわすことにしよう。 -そうすると (a b) は内部的にはこうなる。 (@a @b) -それで print (a b) とすると、まず内部で (@a @b) が生成されて、表示するために値が評価されて、それで (1 2) が出てくる。 -なるほどこれはいけるかもしれない。 -この方法だと、 (@a @b) を生成した後でも、評価する前にaやbの値を変更すれば、その新しい値が反映されるということになる。 -これは面白いが危険だ。 a = 1 b = 2 x = (a b) a = b = 0 printt x -これで表示されるのは (0 0) でしたっていうのは明らかに直感に反する。ここは (1 2) であるべきだ。 -どうすれば両立できるか。 -代入演算子の意味を見直そう。 -通常の代入では、 @a や @b みたいな情報を検出したら、それを評価して定数化してしまう。そうではなくて参照情報を参照情報のまま代入したいのであれば、 ::= とかを使え、とすればいい。 -これでこの問題はひとまず解決する。 -[3] -なお、変数が単独で現れずに、式の形で現れた場合は、参照情報は生成しない。たとえば (a + 0 b * 1) など。 -この場合は即座に (1 2) になる。 -この何もしないっていう演算は役に立つかもしれない。 ~~ っていうのを作ろう。 -[4] - ::= 演算子を使えば、遅延評価みたいな仕組みも実現できそう。まあそれがやりたかったというわけではないけれど。 -[5] -この仕様の場合、 (a b) にはaやbを書き換えるための情報を十分に含んでいるので、何か適当な演算子を作ればこういうことができるはず。 (a b c) :::= (3 4 5) -つまりこれでa、b、cを書き換えられる。 -これはこれで便利そう。 ** 配列の要素へのアクセス方法 -[1] -いきなりだけど具体例 > a = (1 2 3 "kawai" "Essen" 4 5 6) > print a[3] // C言語っぽい書き方、デフォルトでは0オリジン kawai > print a(5) // Essenでは小カッコでも配列にアクセスできる 4 > b = (yama:"kawa" tsu:"ka") > print b["yama"] kawa > print b.tsu ka > print b:[0] // こうするとkeyをソートした先頭の値が取れる(tsu, yama) ka > print b:::[0] // こうすると値ではなくてキーが取れる tsu > c = () // 空っぽの配列 > c:[0] = 123 > c:[1] = 456 > c:[0] = 789 // 123 と 456 は後ろにずれる > print c (789 123 456) > d = [(a:123 b:"xyz") (a:456 b:"uvw") (a:789 b:"rst")] > print searchObject(d, "a", 0) // aが最小値をとるオブジェクトは? (a:123 b:"xyz") > print serachIndex(d, "b", 0) 2 -[2] -配列に値をセットする方法A --(1) a.index = ... --(2) a["index"] = ... --(3) a("index") = ... --(4) a = (...) --(5) a:[0] = ... -いずれでもOK。indexは数字でもいいが、その場合は(1)の形式は使えない。 -[3] -配列に値をセットする方法B --(1) VirtualIndextInsert(a, 1, ...) --(2) a = VirtualIndexArray (...) -この方法でセットする場合は、順序が思いのままになるが、代わりにkeyは指定できなくなる。 -方法Aと方法Bを混在させることはできない。つまり一つの配列に対してはどちらかのセット方法だけでセットしていくことになる。 * こめんと欄 #comment
タイムスタンプを変更しない
* 実現したい機能のために仕様を考える#1 -(by [[K]], 2017.06.14) ** 引数の渡し方 -[1] -C言語では、変数aと変数bを交換する関数を書くとしたら、呼び出し時には swap(&a, &b); と書かなければいけない。 -私はこれはかっこよくないと常々感じている。この&を書かずに済ませる方法はないだろうか。 -ちなみにC++なら参照型とかを使ってこれを解決できる。 -Essenでは関数側の要求に合わせて引数リストを解釈するのではなく、何の事前情報もなしに引数リストを評価して、それを関数に渡すという方式を採用したい。なぜならそのほうがずっと簡単だから。 -となるとC++方式は採用できない。 -要するにとにかく (a b) と書いたときに、aやbの値を参照してそれを埋めてしまってはいけない。つまり単純に (1 2) とかに変換してはいけない。これじゃあ swap は実現できなくなる。 -どんな方法にすべきかは後で考えるとして、とにかくこれだけはありえない。 -[2] -どうすればいいか。それはここにはひとまず a と書いてありましたという情報のままにしておくしかない。しかも同じ a でも文脈(スコープ)によって指すものが変わるから、その情報も持たせるべきだ。それをここでは @a とでもあらわすことにしよう。 -そうすると (a b) は内部的にはこうなる。 (@a @b) -それで print (a b) とすると、まず内部で (@a @b) が生成されて、表示するために値が評価されて、それで (1 2) が出てくる。 -なるほどこれはいけるかもしれない。 -この方法だと、 (@a @b) を生成した後でも、評価する前にaやbの値を変更すれば、その新しい値が反映されるということになる。 -これは面白いが危険だ。 a = 1 b = 2 x = (a b) a = b = 0 printt x -これで表示されるのは (0 0) でしたっていうのは明らかに直感に反する。ここは (1 2) であるべきだ。 -どうすれば両立できるか。 -代入演算子の意味を見直そう。 -通常の代入では、 @a や @b みたいな情報を検出したら、それを評価して定数化してしまう。そうではなくて参照情報を参照情報のまま代入したいのであれば、 ::= とかを使え、とすればいい。 -これでこの問題はひとまず解決する。 -[3] -なお、変数が単独で現れずに、式の形で現れた場合は、参照情報は生成しない。たとえば (a + 0 b * 1) など。 -この場合は即座に (1 2) になる。 -この何もしないっていう演算は役に立つかもしれない。 ~~ っていうのを作ろう。 -[4] - ::= 演算子を使えば、遅延評価みたいな仕組みも実現できそう。まあそれがやりたかったというわけではないけれど。 -[5] -この仕様の場合、 (a b) にはaやbを書き換えるための情報を十分に含んでいるので、何か適当な演算子を作ればこういうことができるはず。 (a b c) :::= (3 4 5) -つまりこれでa、b、cを書き換えられる。 -これはこれで便利そう。 ** 配列の要素へのアクセス方法 -[1] -いきなりだけど具体例 > a = (1 2 3 "kawai" "Essen" 4 5 6) > print a[3] // C言語っぽい書き方、デフォルトでは0オリジン kawai > print a(5) // Essenでは小カッコでも配列にアクセスできる 4 > b = (yama:"kawa" tsu:"ka") > print b["yama"] kawa > print b.tsu ka > print b:[0] // こうするとkeyをソートした先頭の値が取れる(tsu, yama) ka > print b:::[0] // こうすると値ではなくてキーが取れる tsu > c = () // 空っぽの配列 > c:[0] = 123 > c:[1] = 456 > c:[0] = 789 // 123 と 456 は後ろにずれる > print c (789 123 456) > d = [(a:123 b:"xyz") (a:456 b:"uvw") (a:789 b:"rst")] > print searchObject(d, "a", 0) // aが最小値をとるオブジェクトは? (a:123 b:"xyz") > print serachIndex(d, "b", 0) 2 -[2] -配列に値をセットする方法A --(1) a.index = ... --(2) a["index"] = ... --(3) a("index") = ... --(4) a = (...) --(5) a:[0] = ... -いずれでもOK。indexは数字でもいいが、その場合は(1)の形式は使えない。 -[3] -配列に値をセットする方法B --(1) VirtualIndextInsert(a, 1, ...) --(2) a = VirtualIndexArray (...) -この方法でセットする場合は、順序が思いのままになるが、代わりにkeyは指定できなくなる。 -方法Aと方法Bを混在させることはできない。つまり一つの配列に対してはどちらかのセット方法だけでセットしていくことになる。 * こめんと欄 #comment
テキスト整形のルールを表示する