什么静态类型的语言类似于Python?

时间:2010-02-15 09:17:45

标签: python programming-languages

Python是我目前所知道的最好的语言,但由于自动完成,静态类型是一个很大的优势(虽然对动态语言的支持有限,但它与静态支持的语言相比没有什么比)。我很好奇是否有任何语言尝试将Python的好处添加到静态类型语言中。特别是我对具有以下功能的语言感兴趣:

  • 语法支持:例如词典,数组理解
  • 函数:关键字参数,闭包,元组/多个返回值
  • 运行时修改/创建类
  • 避免在任何地方指定类(在Python中这是由于鸭子类型,尽管类型推断在静态类型语言中会更好)
  • 元编程支持:这是通过反射,注释和元类在Python中实现的

是否存在具有大量这些功能的静态类型语言?

12 个答案:

答案 0 :(得分:35)

Boo是公共语言基础结构(又称Microsoft .NET平台)的静态类型语言。语法是高度受Python启发,而散列/列表/数组是语法的一部分:

i = 5
if i > 5:
    print "i is greater than 5."
else:
    print "i is less than or equal to 5."

hash = {'a': 1, 'b': 2, 'monkey': 3, 42: 'the answer'}
print hash['a']
print hash[42]

for item in hash:
    print item.Key, '=>', item.Value

答案 1 :(得分:14)

Cobra是CLR的静态类型语言(如Boo)。从其网页:

  

Cobra是一种通用编程   语言:

 - a clean, high-level syntax
 - static and dynamic binding
 - first class support for unit tests and contracts
 - compiled performance with scripting conveniences
 - lambdas and closures
 - extensions and mixins
 - ...and more
Sample code:

"""
This is a doc string for the whole module.
"""


class Person
    """
    This is a class declaration.
    """

    var _name as String  # declare an object variable. every instance of Person will have a name
    var _age as int

    cue init(name as String, age as int)
        _name = name
        _age = age

    def sayHello
        # This is a method

        # In strings, anything in brackets ([]) is evaluated as an expression,
        # converted to a string and substituted into the string:
        print 'Hello. My name is [_name] and I am [_age].'

    def add(i as int, j as int) as int
        """ Adds the two arguments and returns their sum. """
        return i + j

答案 2 :(得分:9)

虽然它不是面向对象的,Haskell提供了大量您感兴趣的功能:

  • 语法支持列表推导,加上各种排序/绑定结构的do符号。 (字典的语法支持仅限于对列表,例如

    dict = ofElements [("Sputnik", 1957), ("Apollo", 1969), ("Challenger", 1988)]
    
  • 函数使用元组类型支持完全闭包和多个返回值。不支持关键字参数,但“隐式参数”的强大功能有时可以替代。

  • 不对类,类型或对象进行运行时修改。

  • 通过类型推断避免在任何地方具体化类/类型。

  • 使用Template Haskell进行元编程。

另外,只是让你有宾至如归的感觉,Haskell有明显的缩进!

我实际上认为Haskell与Python整体有着截然不同的感觉,但这主要是因为非常强大的静态类型系统。如果你有兴趣尝试使用静态类型的语言,那么Haskell就是目前最雄心勃勃的语言之一。

答案 3 :(得分:8)

它可能无法满足您的所有需求,但请查看Boo - The wristfriendly language for the CLI

如果你这样做,我强烈推荐除了DSL方面之外的DSLs in Boo: Domain-Specific Languages in .NET,在一个非常好的附录和很多元编程中涵盖了Boo语法。

此外,tutorials是一个很好的资源。

答案 4 :(得分:5)

Go编程语言。我见过一些类似的范例。

答案 5 :(得分:4)

Rpython是静态类型的Python的一个子集。

答案 6 :(得分:2)

D编程语言是一种静态类型的本机编译语言,具有一些受Python启发的重要功能。

数组和关联数组内置于该语言中。没有列表推导,但是std.range和std.algorithm库填充了大部分空白。例如,这是一种在D中总结0到100之间所有偶数的方法:

auto result = reduce!"a + b"(
    filter!"a % 2 == 0"(
        iota(0, 100)
    )
);

到目前为止还没有关键字参数,但是有闭包。支持元组,但不会自动解压缩。

在D中,您可以避免使用auto关键字和模板在任何地方指定类(以及一般类型)。例如,以下是查找任何数字类型的数组乘积的通用代码:

// The return type of product() is inferred.
auto product(T)(T[] array) {
    T ret = 1;
    foreach(num; array) { // typeof(num) is inferred.
        ret *= num;
    }

    return ret;
}

D的元编程支持包括编译时内省(例如,您可以在编译时迭代类或结构的字段),运行时类型信息以及实际为元编程设计的模板,而不仅仅是简单的泛型。例如,下面是如何编写一个为两个结构体生成默认比较操作的泛型函数,如果您需要对二叉树这样的任意总排序,这将非常有用:

/**Returns -1 if lhs < rhs, 0 if lhs == rhs, 1 if lhs > rhs.*/
int compareStructs(T)(T lhs, T rhs) {
    foreach(tupleIndex, value; lhs.tupleof) {
        if(value < rhs.tupeof[tupleIndex]) {
            return -1;
        } else if(value > rhs.tupleof[tupleIndex]) {
            return 1;
        }
    }

    return 0;
}

答案 7 :(得分:1)

动态类型语言仍然可以实现自动完成;没有什么能阻止IDE进行类型推断或检查,即使语言实现没有。

答案 8 :(得分:1)

如果您正在寻找自动完成功能,那么您可能希望坚持使用Python并使用一个出色的IDE。

尝试PyCharm:http://www.jetbrains.com/pycharm/index.html

除非你正在编写一些非常动态的东西(你无论如何都不能用静态语言做),它会跟上代码并给你完成,重构以及我们习惯于静态的所有其他好东西打字语言。

您可以通过执行以下操作为IDE提供类型提示:

def foo(bar):
    if 0: bar = Bar() # "if 0" will be removed from the bytecode automatically by python
    bar. # will now autocomplete

答案 9 :(得分:1)

龙虾(http://strlen.com/lobster/)是具有Python风格语法的静态类型编程语言。

您要查询的几件事是

  • 类型推断,因此您的代码可以看起来类似于Python,而无需在所有地方指定类型。实际上,与类型推断相比,它比Haskell之类的语言更进一步。
  • 闭包:从语法上讲它们比Python轻(创建您自己的控制结构),但功能更强大(可能是多行,您可以从中返回到封闭函数)。
  • 多个返回值。

在这些项目上效果不佳:

  • 字典或数组推导的语法。尽管它的map / filter语法非常小,以至于可以与数组理解竞争。
  • 目前仅适用于构造函数的关键字参数。
  • 运行时类修改:不,..它是一种非常静态的语言。
  • 反思:也没有,尽管这肯定是可能的。

答案 10 :(得分:0)

我认为Eric和PyScripter在Windows上有很好的自动完成功能,但可能不如Visual Studio(Express)的PyTools好。

对于Python中的静态类型,我使用Cython:http://docs.cython.org/src/quickstart/cythonize.html

答案 11 :(得分:0)

我知道这是一个旧线程,但是我认为值得一提的是Nim,它最近已经达到1.0版,其最大的特点之一就是它的元编程功能。 还有很多。

https://nim-lang.org/