Reflection 有满足这些要求的编程语言吗?
在实施我的下一个程序之前,我有一些要求-希望有一种编程语言可以做到以下几点:Reflection 有满足这些要求的编程语言吗?,reflection,programming-languages,requirements,Reflection,Programming Languages,Requirements,在实施我的下一个程序之前,我有一些要求-希望有一种编程语言可以做到以下几点: 给定一个类(或接口)C,编程语言允许用户访问扩展/实现C的所有类的列表 编程语言允许用户迭代一个类的所有变量和方法 用户能够确定函数将采用的参数的数量和类型 eg. foo(int a, String b, int c) can be queried to return 3 or [int, String, int] 这些是荒谬的要求,还是某些语言将其作为基本的反射技术来实现?我希望大多数Lisp系统(Schem
eg. foo(int a, String b, int c) can be queried
to return 3 or [int, String, int]
这些是荒谬的要求,还是某些语言将其作为基本的反射技术来实现?我希望大多数Lisp系统(Scheme、CommonLisp等)都能满足这些要求。Java可以做到这一点。但是,请注意,没有语言可以: 给定一个类(或接口)C,编程语言允许 用户访问扩展/实现C的所有类的列表
原因是扩展C的类的数量要么是零(在最终类的情况下)要么是无限的。在后一种情况下,这是一种规范,只有C扩展的所有类中的一小部分实际上已经被编写和编译,并且只有那些你可以访问的类。我知道你更喜欢静态类型的语言,但是如果你考虑动态类型的话,SimultTalk可能是一个很好的匹配,因为所有的东西都是对象。(类和方法在此规则中也不例外),因此一切都可以操作(不仅可以查询,还可以更改)。转到您的需求: 给定一个类(或接口)C,编程语言允许 用户访问扩展/实现C的所有类的列表 在Smalltalk中,没有内置的接口概念(尽管我认为我已经看到了对它的支持的扩展)
- 给定一个类,找到它的直接子类:
answersNumber子类
{Fraction.Float.Integer}
- 或其下的所有层次结构:
answersNumber allsubclass
a ordered集合(分数浮点整数缩放小数小整数大正整数大基因整数)
pop
):
SystemNavigation default allclasses实现:#pop
answers{ContextPart.FileSystemGuide.LIFOQueue.Stack}
如您所见,定义一个“接口”对象来查询实现一组方法的类是非常容易的(只需拥有一个方法名称集合,并查询实现每个方法的类,将类添加到一个集合中即可)。但是,如果要在类中显式声明它实现了一个接口,则需要做更多的工作
编程语言允许用户遍历所有
类的变量和方法
Point instVarNames
answers#('x'y')
Point allMethods
回答一组CompiledMethod
s(表示方法的对象)
指向所有选择器
回答该类实例可以回答的所有方法名称的集合
用户能够确定参数的数量和类型
功能将需要
eg. foo(int a, String b, int c) can be queried
to return 3 or [int, String, int]
在本例中,您与已编译的方法交互,并询问它们所需的参数数量(没有参数类型的概念):
(pointmethodnamed:#x)numArgs
回答0,因为它只是一个getter
(点方法名称:#+)numArgs
回答1
这只是Smalltalk反射功能的一个小预览;如果您想深入了解,可以查看以下链接:
如果您愿意将“所有类”限制为“已知程序集中的所有类”,那么HTH.NET(任何语言)都符合要求。很抱歉,我不太理解您所说的“已知程序集”是什么意思?他的意思是(例如)如果我从C继承一个类,则编译它并保留结果二进制(在.net世界中,它被称为程序集)在我口袋里的usb钥匙上,那么你不能对它使用反射。@sdadas:in.net,代码内置于程序集中。你可以反射任何有效的程序集(可以由你正在使用的运行时加载)但它不会知道程序集中存在的类,你不会告诉它。语言是否需要静态类型?否则Python会满足你的要求。”但是,请注意,没有语言可以做到:“,抱歉,但这并不完全正确(请参阅我关于Smalltalk的回答)。因为Smalltalk是一种语言,也是一种可以查询的环境(并据此采取行动)您的整个系统。@AndrésFortier您没有阅读我的推理吗?根本不可能允许用户访问无限数量的尚未编写的类。我认为您指的是尚未在系统中编译/加载的类。如果您实际上指的是尚未编写代码的类,那么这只会增加no对OP问题的重视;要解决这个问题,你需要有洞察力的编程语言就是能够添加一个新的子类,并在列表中看到新的子类,而不必做任何花哨的事情。这就是Smalltalk IDE的实际工作方式,并且可以外推到您在其上编写的任何程序中。@Ingo Andres是正确的-我没有幻想我可以迭代扩展另一个类的所有可能的类。只有虽然我可能不会使用Smalltalk,但它非常有趣,彻底地回答了我的问题。