是否有一种编程语言能满足这些要求?



在实现我的下一个程序之前,我有一些要求——希望有一种编程语言能够做到以下几点:

  1. 给定一个类(或接口)C,编程语言允许用户访问扩展/实现C的所有类的列表。
  2. 编程语言允许用户遍历类的所有变量和方法。
  3. 用户可以决定函数接受的参数的数量和类型。

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

这些是荒谬的要求还是一些语言将它们作为反射的基本技术来实现?

我知道您更喜欢静态类型的语言,但是如果您考虑动态类型的语言,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,因为它只是一个getter。

(Point methodNamed: #+) numArgs回答1

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

  • Smalltalk-80中的反射设施
  • 评估Smalltalk中的消息传递控制技术
  • <
  • 调试对象/gh>

HTH

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

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

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

原因是扩展C的类的数量要么为零(在final类的情况下),要么为无穷大。在后一种情况下(这是常态),实际上只有一小部分扩展C的类被编写和编译,而且只有那些您可以访问的类。

相关内容

  • 没有找到相关文章

最新更新