是否有符合这些要求的编程语言?

时间:2013-03-01 07:22:07

标签: reflection programming-languages requirements

在实现我的下一个程序之前,我有一些要求 - 希望存在可以执行以下操作的编程语言:

  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 个答案:

答案 0 :(得分:1)

我希望大多数Lisp系统(Scheme,CommonLisp,...)能够满足这些要求。

答案 1 :(得分: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 allMethods回答CompiledMethod s(代表方法的对象)的集合

Point allSelectors回答该类实例可以回答的所有方法名称的集合。

  

用户可以确定参数a的数量和类型   功能将采取。

在这种情况下,您将与已编译的方法进行交互,并询问它们所需的参数数量(没有参数类型的概念):

(Point methodNamed: #x) numArgs回答0,因为它只是一个吸气剂。

(Point methodNamed: #+) numArgs回答1

这只是Smalltalk反射功能的一个小预览;如果你想深入了解,你可以看看其中的一些链接:

HTH

答案 2 :(得分:-1)

Java可以做到这一点。但是,请注意没有语言:

  

给定一个类(或接口)C,编程语言允许   用户访问扩展/实现C

的所有类的列表

原因是扩展C的类的数量为零(在最终类的情况下)或无限。在后一种情况下,这是常态,只有扩展C的所有类的一小部分实际上已经被写下来并编译,只有那些你可以访问的类。