2

次のプログラムを実装する前に、いくつかの要件があります。うまくいけば、次のことを実行できるプログラミング言語が存在します。

  1. クラス(またはインターフェース)Cが与えられると、プログラミング言語により、ユーザーはCを拡張/実装するすべてのクラスのリストにアクセスできます。
  2. プログラミング言語を使用すると、ユーザーはクラスのすべての変数とメソッドを反復処理できます。
  3. ユーザーは、関数が取る引数の数とタイプを決定できます。

    eg. foo(int a, String b, int c) can be queried 
    to return 3 or [int, String, int]
    

これらのばかげた要件ですか、それとも一部の言語はそれらを反映の基本的な手法として実装していますか?

4

3 に答える 3

1

静的型付けの言語を好むことは知っていますが、動的型付けの言語を検討する場合は、すべてがオブジェクトであり(クラスとメソッドもこのルールの例外ではありません)、すべてを操作できるため、Smalltalkが適している可能性があります(照会されただけでなく、変更されました)。あなたの要件に行きます:

クラス(またはインターフェース)Cが与えられると、プログラミング言語により、ユーザーはCを拡張/実装するすべてのクラスのリストにアクセスできます。

Smalltalkには、インターフェースの概念が組み込まれていません(ただし、サポートを追加した拡張機能を見たことがあると思います)。ただし、次のことができます。

  • クラスが与えられたら、それを直接サブクラスとして見つけます:Number subclasses答え{Fraction. Float. Integer}
  • またはその下のすべての階層:Number allSubclasses 回答an OrderedCollection(Fraction Float Integer ScaledDecimal SmallInteger LargePositiveInteger LargeNegativeInteger)

pop特定のセレクター(この場合)を実装するすべてのクラスを見つけることもできます。

SystemNavigation default allClassesImplementing: #pop答え{ContextPart. FileSystemGuide. LIFOQueue. Stack}

ご覧のとおり、メソッドのセットを実装するクラスをクエリするための「インターフェイス」オブジェクトを定義するのは非常に簡単です(メソッド名のコレクションを用意し、それぞれを実装するクラスをクエリして、クラスをセットに追加するだけです)。ただし、インターフェイスを実装していることをクラスで明示的に指定する場合は、さらに作業を行う必要があります。

プログラミング言語を使用すると、ユーザーはクラスのすべての変数とメソッドを反復処理できます。

Point instVarNames答え#('x' 'y')

Point allMethodsCompiledMethods(メソッドを表すオブジェクト)のコレクションに応答します

Point allSelectorsそのクラスのインスタンスが応答できるすべてのメソッド名のコレクションに応答します。

ユーザーは、関数が取る引数の数とタイプを決定できます。

この場合、コンパイルされたメソッドを操作し、必要な引数の数を尋ねます(パラメータータイプの概念はありません)。

(Point methodNamed: #x) numArgsただのゲッターなので、0と答えます。

(Point methodNamed: #+) numArgs回答1

これは、Smalltalkの反射機能のほんの一部です。さらに深く知りたい場合は、次のリンクのいくつかをチェックしてください。

HTH

于 2013-03-01T12:35:50.330 に答える
1

私はほとんどのLispシステム(Scheme、CommonLisp、...)がこれらの要件を満たすことを期待しています。

于 2013-03-01T09:12:06.133 に答える
-1

Javaはこれを行うことができます。ただし、言語は機能しないことに注意してください。

クラス(またはインターフェース)Cが与えられると、プログラミング言語により、ユーザーはCを拡張/実装するすべてのクラスのリストにアクセスできます。

その理由は、Cを拡張するクラスの数がゼロ(最終クラスの場合)または無限であるためです。後者の場合、これは標準ですが、Cを拡張するすべてのクラスのごく一部だけが実際に書き留められてコンパイルされており、アクセスできるのはそれらだけです。

于 2013-03-01T10:31:49.080 に答える