Delphi (Object Pascal) でその場でローカル変数を使用できるように言語を拡張するとしたら、という話

タイトルの通りです。 前提として "Delphi (Object Pascal) の良さをスポイルしない" という話になっています。 この点を皆さん暗黙の了解で話してらっしゃいます。
0
DEKO @ht_deko

Delphi (Object Pascal) でその場でローカル変数を宣言できるように拡張するとしたら、 var hoge:String := 'Hello'; よりも hoge::String := 'Hello'; みたいな拡張がいいのかな。 #delphi_jp

2018-03-01 13:23:07
DEKO @ht_deko

var はブロック構造以外で使わない方がいいんじゃないかと。

2018-03-01 13:24:43
mohno @mohno

@ht_deko 後ろに型名を書くだけだと for (var n = 0; n < 10; n++) みたいな型推論が実装しにくい(::autoとでもする?)かなという気もするので何かしら単語を前置きする方がよい気はします。 どこかに実装試してるものがないんですかね:-)

2018-03-01 13:36:05
DEKO @ht_deko

@mohno 型推論は hoge:: := 'Hello'; みたいに単に省略するとか。ちょっと気持ち悪いので :: じゃなく、:| とかの方がいいかもです。 var を使った実装は (どこかに) ありそうですけどね。

2018-03-01 13:49:45
mohno @mohno

@ht_deko 記号って“Pascal らしくない”気がしません?:-) もっとも互換性を維持しつつ新たな単語を使うには contextual な評価が必要になるのでしょうが、varは(contextualではない)予約語なので使いにくいかな、と。

2018-03-01 13:54:48
HOSOKAWA Jun @pik

@ht_deko @mohno Oxygenvar っぽいですね。

2018-03-01 13:58:14

Oxygene: RemObjects 製の言語。

Object Pascal ではあるものの "Oxgene 言語" と言ったりもする。Delphi より若干カジュアルな記述ができる。

Oxygene は RemObjects Elements に含まれている。
http://www.elementscompiler.com/elements/default.aspx

一時期 Delphi Prism という名前で Embarcadero の RAD Studo に含まれていた (現在は含まれていない)。同じ .NET 用ではあるが、Delphi 8 の系譜である Delphi for .NET の事ではない。

DEKO @ht_deko

@mohno begin end ですからね (w 記号を使わないのならやはり何かしら前置するキーワードがないとダメですよねー。

2018-03-01 13:58:27
DEKO @ht_deko

@pik @mohno 「Oxygene 警察だ!」というのは冗談として、var でも確かに拡張できると思うし、パッと思いつくのが var なんですよね。 function foo(var s: String): Boolean; みたいな var キーワードの使われ方もあるので、 var hoge:String := 'Hello'; とかでもいいのかなぁ...。

2018-03-01 14:17:28
mohno @mohno

@ht_deko @pik varだと変数部始まっちゃうじゃんと思ったけど、コード部では元々使えないから問題ないですかね^_^; あとは変数定義時にコンストラクタをどう呼び出すか、かな(?)

2018-03-01 14:24:27
DEKO @ht_deko

@mohno @pik 構文的には判別できると思いますが、紛らわしい事に変わりはないのですよねー (^^;A

2018-03-01 14:28:18
HOSOKAWA Jun @pik

@ht_deko @mohno 指令を増やすとかですかねー。let a: String = 'foo'; とかどうでしょう。

2018-03-01 14:37:11
さぎり(アウラ♀)❂Fenrir @dj_sagiri

@pik @ht_deko @mohno Oxygene使いとしてはvarで一向に違和感なしなのでございまs

2018-03-01 14:45:13
mohno @mohno

@pik @ht_deko 今の Delphi に contextual keyword があるのか知らないんですが^_^; let が変数/関数名として使われている可能性を考えると var の方が評価は楽だと思います。 あと、その場で変数定義を実現する場合、その型がクラスの場合は、どうやってオブジェクトの定義と初期化を同時に行うか、も考えないと:-)

2018-03-01 14:56:19
HOSOKAWA Jun @pik

@mohno @ht_deko なるほど、確かに let という名前の何かがある可能性ありますね。 オブジェクトの初期化は Oxygen でも普通に var a: TList<String> = TLIst<String>.Create; とやっているので問題無いのでは?

2018-03-01 15:52:38
mohno @mohno

@pik @ht_deko おお、なるほど。型推論させて var a: TList<String>.Create; とできればよいですね。というか VB.NET がこんな感じですね:-)

2018-03-01 16:15:06
mohno @mohno

@pik @ht_deko あ、Oxygene では var a := new TList<String>; なのですね(?)(そもそも Oxygene を知らなかった^_^;; var a := TList<String>.Create; あたりでいいのかな:-)

2018-03-01 16:24:31
HOSOKAWA Jun @pik

@mohno @ht_deko 型推論が同時に載るならそれが良さそうですね。 Oxygen だとグローバル変数の初期化と同じ書き方なんだと思います。あと型は型推論で無しにできるみたいですね。

2018-03-01 16:32:46