タグ付けされた質問 「language-design」

プログラミング言語のあらゆる側面の設計に関連する質問のタグ。

5
型推論の実装
ここでは、静的型付けと動的型付けについて興味深い議論がいくつかあります。コンパイル型チェック、ドキュメント化されたコードなどにより、私は一般に静的型付けを好みます。しかし、たとえばJavaのようにコードを整理すると、コードが乱雑になることに同意します。 だから私は自分の関数型言語を作り始めようとしています。型推論は実装したいことの1つです。私はそれが大きな主題であることを理解しています、そして私は以前に行われていない何かを作成しようとしているのではなく、基本的な推論だけをしています... これで私を助けるであろう何を読むべきかについてのポインタ?より理論的なカテゴリー理論/タイプ理論のテキストとは対照的に、より実用的/実用的なものが好ましい。データ構造/アルゴリズムを使用した実装に関するディスカッションテキストがある場合、それはすばらしいことです。

4
Objective-Cメソッド名の最後の部分に引数が必要なのはなぜですか(複数の部分がある場合)?
Objective-Cでは、最後のコンポーネントが引数を取らない場所でメソッド名を宣言することはできません。たとえば、次は違法です。 -(void)take:(id)theMoney andRun; -(void)take:(id)yourMedicine andDontComplain; なぜObjective-Cはこのように設計されたのですか?それは、Smalltalkのアーティファクトだけでしたか? Smalltalkではメッセージの呼び出しに区切り文字がないため、この制限はSmalltalkでは理にかなっています。したがって、最後のコンポーネントは最後の引数に対する単項メッセージとして解釈されます。たとえば、BillyAndBobby take:'$100' andRunはとして解析されBillyAndBobby take:('$100' andRun)ます。これは、角かっこが必要なObjective-Cでは問題になりません。 パラメータなしのセレクタコンポーネントをサポートしても、プログラマが選択するメソッド名(たとえばrunWith:、take:andRun)は、プログラムの機能的なセマンティクスにも、言語の表現力にも影響しません。確かに、パラメーターのないコンポーネントを含むプログラムは、アルファを持たないものと同じです。したがって、そのような機能が不要であると述べている回答(Objective-Cデザイナーの理由が記載されている場合を除き、誰かがたまたまBrad CoxやTom Loveを知っていますか?彼らはここにいますか?)には興味がありません。メソッド名を記述して、機能が不要になるようにする方法。主な利点は、可読性と書き込み可能性(読みやすさのようなものですが、ご存知のとおりです)です。これは、自然言語の文にさらに似たメソッド名を記述できることを意味します。同類-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplicationマット・ギャラガーが指摘する(「ココアと恋」に-(BOOL)application:(NSApplication*)theApplication shouldTerminateAfterLastWindowClosed、したがって、パラメータを適切な名詞のすぐ隣に配置します。 AppleのObjective-Cランタイム(たとえば)は、この種のセレクターを完全に処理できるので、コンパイラーはどうしてでしょうか?それらをメソッド名でもサポートしないのはなぜですか? #import <Foundation/Foundation.h> #import <objc/runtime.h> @interface Potrzebie : NSObject -(void)take:(id)thing; @end @implementation Potrzebie +(void)initialize { SEL take_andRun = NSSelectorFromString(@"take:andRun"); IMP take_ = class_getMethodImplementation(self, @selector(take:)); if (take_) { if (NO == class_addMethod(self, take_andRun, take_, "@@:@")) { …

7
Haskellの厳格なポイントは何ですか?
Haskellがデフォルトで怠惰であることを私たちは皆知っています(または知っているはずです)。評価する必要があるまで、何も評価されません。それでは、いつ何かを評価する必要がありますか?Haskellが厳密でなければならない点があります。私はこれらを「厳格なポイント」と呼びますが、この特定の用語は思ったほど広くはありません。私によると: Haskellでの削減(または評価)は、厳密な点でのみ発生します。 だから問題は:Haskellの厳格なポイントは、正確には何ですか?私の直感ではmain、seq/ビッグバンパターン、パターンマッチング、およびIOを介しmainて実行されるすべてのアクションが主要な厳密ポイントであると述べていますが、なぜそれを知っているのか本当にわかりません。 (また、これらは「厳密ポイント」と呼ばれていない場合、何をしている彼らが呼ばれます?) 良い答えには、WHNFに関する議論などが含まれると思います。また、ラムダ計算に影響を与えるかもしれないと思います。 編集:この質問に関する追加の考え。 私がこの質問を反映したように、私は厳密さの点の定義に何かを追加するほうがより明確になると思います。厳密なポイントは、さまざまなコンテキストとさまざまな深さ(または厳密さ)を持つことができます。「Haskellでの削減は厳密なポイントでのみ発生する」という私の定義に戻り、その定義にこの句を追加しましょう:「厳密なポイントは、周囲のコンテキストが評価または削減されたときにのみトリガーされます」。 それで、私があなたに私が欲しい種類の答えから始めさせようと思います。main厳格なポイントです。これは、そのコンテキストの主要な厳格なポイントであるプログラムに特別に指定されています。プログラム(mainのコンテキスト)が評価されると、mainの厳密性ポイントがアクティブになります。メインの深さは最大です。完全に評価する必要があります。メインは通常、IOアクションで構成されます。IOアクションは厳密性のポイントでもあり、そのコンテキストはmainです。 seqでは、これらの用語でパターンマッチングについて話し合い、パターンマッチングを試してください。関数適用のニュアンスを説明してください:どのように厳密ですか?いかがですか?どうdeepseqですか?letとcaseステートメント?unsafePerformIO?Debug.Trace?トップレベルの定義?厳密なデータ型?バンパターン?等seqまたはパターンマッチングの観点から説明できるこれらの項目の数は?

4
関数テンプレートを部分的に特殊化できないのはなぜですか?
言語仕様が関数テンプレートの部分的な特殊化を禁止していることを私は知っています。 なぜそれが禁止されているのか、その理由を知りたいのですが?それらは役に立ちませんか? template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed!

7
「オブジェクト」クラスのインスタンスに属性を設定できません
それで、私はこの質問に答えている間Pythonで遊んでいました、そして私はこれが有効でないことを発見しました: o = object() o.attr = 'hello' によるAttributeError: 'object' object has no attribute 'attr'。ただし、オブジェクトから継承されたクラスでは、次のように有効です。 class Sub(object): pass s = Sub() s.attr = 'hello' 印刷s.attrすると、期待どおりに「hello」が表示されます。なぜそうなのですか?Python言語仕様で、バニラオブジェクトに属性を割り当てることができないと指定しているものは何ですか?



8
Javaに「到達不能ステートメント」コンパイラエラーがあるのはなぜですか?
プログラムをデバッグするとき、コードのブロック内にreturnステートメントを挿入すると便利であることがよくあります(おそらく悪い習慣ですが)。私はJavaでこのようなことを試みるかもしれません...。 class Test { public static void main(String args[]) { System.out.println("hello world"); return; System.out.println("i think this line might cause a problem"); } } もちろん、これによりコンパイラエラーが発生します。 Test.java:7:到達不能ステートメント 未使用のコードを持つことは悪い習慣であるため、警告が正当化される理由を理解できました。しかし、なぜこれがエラーを生成する必要があるのか​​理解できません。 これはJavaが乳母になろうとしているだけですか、それともこれをコンパイラエラーにする正当な理由がありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.