Какие статически типизированные языки подобны Python?

Python является самым хорошим языком, о котором я в настоящее время знаю, но статический контроль типов является большим преимуществом из-за автозавершения (хотя там ограничен поддержка динамических языков, это - ничто по сравнению с поддерживаемым в помехах). Мне любопытно, если существуют какие-либо языки, которые пытаются добавить преимущества Python на статически типизированный язык. В особенности я интересен на языках с функциями как:

  • Поддержка синтаксиса: такой как это для словарей, выстройте понимания
  • Функции: аргументы Ключевого слова, закрытия, возвращаемые значения кортежа/нескольких
  • Модификация/создание во время выполнения классов
  • Предотвращение определения классов везде (в Python это происходит из-за утиного ввода, хотя вывод типа работал бы лучше на статически типизированном языке),
  • Поддержка метапрограммирования: Это достигается в Python посредством отражения, аннотациях и метаклассах

Есть ли какие-либо статически типизированные языки со значительным количеством этих функций?

46
задан Casebash 15 February 2010 в 09:50
поделиться

8 ответов

Boo - язык со статической типизацией для Common Language Infrastructure (также известной как платформа 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
35
ответ дан 26 November 2019 в 20:29
поделиться

Он может не соответствовать всем вашим потребностям, но имеет посмотрите на Boo - удобный язык интерфейса командной строки

Если вы это сделаете, я настоятельно рекомендую DSL в Boo: доменные языки в .NET , которые, помимо аспектов DSL, охватывают синтаксис Boo в очень красивом приложении и много метапрограммирования.

Кроме того, отличным ресурсом являются учебные пособия .

8
ответ дан 26 November 2019 в 20:29
поделиться

Хотя он не является объектно-ориентированным, Haskell предлагает значительное количество интересующих вас функций:

  • Поддержка синтаксиса для понимания списков, плюс нотация do для широкой множество секвенирующих / связывающих конструкций. (Синтаксическая поддержка словарей ограничена списками пар, например,

     dict = ofElements [("Sputnik", 1957), ("Apollo", 1969), ("Challenger", 1988)] 
     
  • Функции поддерживают полное замыкание и множественные возвращаемые значения с использованием типов кортежей. Аргументы ключевых слов не поддерживаются, но иногда может использоваться мощная функция «неявных аргументов».

  • Отсутствие модификации классов, типов или объектов во время выполнения.

  • Избегание определения классов / типов повсюду с помощью вывода типа .

  • Метапрограммирование с использованием Template Haskell.

Кроме того, чтобы вы чувствовали себя как дома, в Haskell есть значительные отступы!

Я действительно думаю, что в Haskell есть В целом ощущения от Python сильно отличаются, но это в первую очередь из-за чрезвычайно мощной системы статических типов. Если вы хотите попробовать статически типизированный язык, Haskell - один из самых амбициозных языков на данный момент.

{{ 1}}
9
ответ дан 26 November 2019 в 20:29
поделиться

Язык программирования Go. Я видел похожие па радигма.

5
ответ дан 26 November 2019 в 20:29
поделиться

Язык программирования D - это статически типизированный, скомпилированный в собственном коде язык, который имеет некоторые важные особенности, вдохновленные Python.

В язык встроены массивы и ассоциативные массивы. Нет понимания списков, но std.Библиотеки range и std.algorithm заполняют большую часть этой пустоты. Например, вот способ суммировать все четные числа от 0 до 100 в D:

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;
}
2
ответ дан 26 November 2019 в 20:29
поделиться

Cobra - это статически типизированный язык для CLR (как Boo). С веб-страницы:

Cobra - это язык программирования общего назначения. язык с:

 - чистым, высокоуровневым синтаксисом
 - статическое и динамическое связывание
 - первоклассная поддержка модульных тестов и контрактов
 - компилированная производительность с удобствами для написания сценариев
 - лямбды и закрытия
 - расширения и миксины
 - ...и многое другое
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
14
ответ дан 26 November 2019 в 20:29
поделиться

Автодополнение все еще возможно в динамически типизированном языке; ничто не мешает IDE делать вывод типа или проверку, даже если реализация языка этого не делает.

1
ответ дан 26 November 2019 в 20:29
поделиться

Если автозавершение - это то, что вы ищете, тогда вам лучше придерживаться 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
1
ответ дан 26 November 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: