Pythonは私が現在知っている中で最も優れた言語ですが、オートコンプリートにより静的型付けは大きな利点です(動的言語のサポートは限られていますが、静的言語でサポートされている言語と比較して何もありません)。 Pythonの利点を静的に型付けされた言語に追加しようとする言語があるかどうか知りたいです。特に、次のような機能を備えた言語に興味があります。
これらの機能のかなりの数を備えた静的に型付けされた言語はありますか?
Boo は、共通言語インフラストラクチャ(別名、Microsoft .NETプラットフォーム)用の静的に型指定された言語です。構文はhighlyPythonに触発されており、ハッシュ/リスト/配列は構文の一部です。
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
Cobra は、CLR用の静的に型指定された言語です(Booとして)。そのWebページから:
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
オブジェクト指向ではありませんが、 Haskell は、興味のある機能を数多く提供しています。
リスト内包表記の構文サポートに加えて、さまざまなシーケンス/バインディング構造のdo
表記。 (辞書の構文サポートは、ペアのリストに限定されています。
dict = ofElements [("Sputnik", 1957), ("Apollo", 1969), ("Challenger", 1988)]
関数は、タプル型を使用した完全なクロージャと複数の戻り値をサポートします。キーワード引数はサポートされていませんが、「暗黙の引数」の強力な機能で代用できる場合があります。
クラス、タイプ、またはオブジェクトの実行時の変更はありません。
型推論によるあらゆる場所でのクラス/タイプの特定の回避。
TemplateHaskellを使用したメタプログラミング。
また、自宅にいるように感じるように、Haskellには大きなインデントがあります!
Haskellは全体的にPythonとはかなり違う感じだと思いますが、それは主に非常に強力な静的型システムによるものです。静的型付き言語を試すことに興味があるなら、Haskellは今そこにある最も野心的なもの。
すべてのニーズに一致するわけではありませんが、 Boo-CLIの手に優しい言語 をご覧ください。
もしそうなら、私は強くお勧めします BooのDSL:.NETのドメイン固有言語 これはDSLの側面とは別に、非常に素晴らしい付録と多くのメタプログラミングでBoo構文をカバーしています。
さらに、 tutorials は素晴らしいリソースです。
Goプログラミング言語。私はいくつかの同様のパラダイムを見てきました。
Rpythonは、静的に型指定されたPythonのサブセットです。
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のメタプログラミングのサポートは、コンパイル時のイントロスペクション(たとえば、コンパイル時にクラスまたは構造体のフィールドを反復処理できます)、実行時型情報、および単純なジェネリックを超えたメタプログラミング用に実際に設計されたテンプレートで構成されます。たとえば、2つの構造体のデフォルトの比較操作を生成するジェネリック関数を作成する方法を次に示します。これは、バイナリツリーのようなものに任意の全順序が必要な場合に役立ちます。
/**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;
}
Lobster( http://strlen.com/lobster/ )は、Python風の構文を持つ静的に型付けされたプログラミング言語です。
それはあなたが求めているいくつかのことを持っています:
これらのアイテムではうまくいきません:
オートコンプリートは、動的に型指定された言語でも引き続き可能です。言語の実装が行わない場合でも、IDEが型推論または検査を行うことを妨げるものは何もありません。
オートコンプリートがあなたが探しているものであるなら、あなたは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
EricとPyScripterはWindowsで優れたオートコンプリート機能を備えていると思いますが、PyTools for Visual Studio(Express)ほど良くはないかもしれません。
Pythonでの静的型付けには、Cythonを使用します: http://docs.cython.org/src/quickstart/cythonize.html