Python是我目前所知道的最好的语言,但由于自动完成,静态类型是一个很大的优势(虽然对动态语言的支持有限,但它与静态支持的语言相比没有什么比)。我很好奇是否有任何语言尝试将Python的好处添加到静态类型语言中。特别是我对具有以下功能的语言感兴趣:
是否存在具有大量这些功能的静态类型语言?
答案 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风格语法的静态类型编程语言。
您要查询的几件事是
在这些项目上效果不佳:
答案 10 :(得分:0)
我认为Eric和PyScripter在Windows上有很好的自动完成功能,但可能不如Visual Studio(Express)的PyTools好。
对于Python中的静态类型,我使用Cython:http://docs.cython.org/src/quickstart/cythonize.html
答案 11 :(得分:0)
我知道这是一个旧线程,但是我认为值得一提的是Nim,它最近已经达到1.0版,其最大的特点之一就是它的元编程功能。 还有很多。