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

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

  • 给定一个类(或接口)C,编程语言允许用户访问扩展/实现C的所有类的列表
  • 编程语言允许用户迭代一个类的所有变量和方法
  • 用户能够确定函数将采用的参数的数量和类型

    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中,没有内置的接口概念(尽管我认为我已经看到了对它的支持的扩展)

    • 给定一个类,找到它的直接子类:
      Number子类
      answers
      {Fraction.Float.Integer}
    • 或其下的所有层次结构:
      Number allsubclass
      answers
      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,但它非常有趣,彻底地回答了我的问题。