在实现我的下一个程序之前,我有一些要求 - 希望存在一种可以执行以下操作的编程语言:
- 给定一个类(或接口)C,编程语言允许用户访问扩展/实现 C 的所有类的列表。
- 编程语言允许用户遍历类的所有变量和方法。
用户能够确定函数将采用的参数的数量和类型。
eg. foo(int a, String b, int c) can be queried to return 3 or [int, String, int]
这些是荒谬的要求,还是某些语言将它们作为基本的反射技术来实现?
在实现我的下一个程序之前,我有一些要求 - 希望存在一种可以执行以下操作的编程语言:
用户能够确定函数将采用的参数的数量和类型。
eg. foo(int a, String b, int c) can be queried
to return 3 or [int, String, int]
这些是荒谬的要求,还是某些语言将它们作为基本的反射技术来实现?
我希望大多数 Lisp 系统(Scheme、CommonLisp、...)能够满足这些要求。
我知道你更喜欢静态类型的语言,但如果你认为动态类型的 Smalltalk 可能是一个不错的选择,因为一切都是对象(类和方法也不例外),因此一切都可以被操纵(不仅查询,而且更改)。满足您的要求:
给定一个类(或接口)C,编程语言允许用户访问扩展/实现 C 的所有类的列表。
在 Smalltalk 中没有内置的接口概念(尽管我认为我已经看到了增加对它的支持的扩展)。但是,您可以:
Number subclasses
answers {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
回答 s 的集合CompiledMethod
(表示方法的对象)
Point allSelectors
回答该类的实例可以回答的所有方法名称的集合。
用户能够确定函数将采用的参数的数量和类型。
在这种情况下,您与已编译的方法进行交互并询问它们所需的参数数量(没有参数类型的概念):
(Point methodNamed: #x) numArgs
答案为 0,因为它只是一个吸气剂。
(Point methodNamed: #+) numArgs
答案 1
这只是 Smalltalk 反射能力的一个小预览;如果您想更深入,可以查看其中一些链接:
高温高压
Java 可以做到这一点。但是,请注意,没有任何语言可以:
给定一个类(或接口)C,编程语言允许用户访问扩展/实现 C 的所有类的列表
原因是扩展 C 的类的数量是零(在最终类的情况下)或无限的。在后一种情况下,这是常态,实际上只有一小部分扩展 C 的类被写下来和编译,而且只有那些你可以访问的。