Решение конфликта имен при множественном наследовании
?
x
-/+ [145]
x
x
+ [146]
x
x
?
x
?
x
+[147]
x
+
x
+
x
?
x
x
x
?
x
[править] Функциональные возможности
Возможность
Язык
Ada
C
C++
C#
D
Eiffel
Erlang
F#
Groovy
Java
JavaScript
Haskell
Common Lisp
Nemerle
Perl
PHP
Python
Ruby
Scala
Smalltalk
VB.NET
Delphi
OCaml
PureBasic
Декларации чистоты функций
-
-
-
-
+[148]
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
First class functions
?
-/+[149]
+[150]
+
+
?
+
+
+
-
+
+
+
+
+
-
+
+
+
+
?
+/- [151]
+
?
Анонимные функции
?
-
+[152]
+[153]
+
?
+
+
+
-
+
+
+[154]
+
+
+
+
+
+
+
+
+/- [151]
+
+
Лексические замыкания
-
-
+ [155]
+
+
+
+
+
+
+[156]
+
+
+
+
+
+[157]
+
+
+
+
+
+/- [158]
+
-
Частичное применение
?
-
+/- [159]
?
-
?
?
+
?
-
-
+
-
+
- [160]
-
+ [161]
+
+
?
?
?
+
?
Каррирование
-
-
+/- [162]
+
-
-
-
+
-
-
+
+
-
-
+
-
+
+[163]
+
-
-
-
+
-
[править] Разное
Возможность
Язык
Ada
C
C++
C#
D
Eiffel
Erlang
F#
Groovy
Java
JavaScript
Haskell
Common Lisp
Nemerle
Perl
PHP
Python
Ruby
Scala
Smalltalk
VB.NET
Delphi
Ocaml
PureBasic
Макросы
-/+
-/+ [164]
-/+ [164]
-
-
-
-/+
-
-
-
-
+/- [165]
+
+
+[166]
-
-
+/-
-
-
+ [167]
-
-/+ [168]
+
Шаблоны/Generics
+
-
+
+
+
+
x [169]
+
+
+
x [169]
- [170]
x [169]
+
x [169]
x [169]
x [169]
x [169]
+
x [169]
+
+ [171]
+/-
?
Поддержка Unicode в идентификаторах
+
+ [172]
+ [173]
+
+
?
-
+
+
+
+
+
+[174]
+
+/-
-/+
+ [175]
+ [176]
+
+
+
+
+
+
Перегрузка функций
+
-
+
+
+
-
+
+
+
+
-/+ [177]
+
+[178]
+
- [179]
-
- [180]
-
+
?
+
+
+
-
Динамические переменные
?
-
-
?
?
?
-
?
?
?
?
+/-[181]
+[182]
?
+
-
-
?
?
?
?
?
?
-
Именованные параметры
+
-
-
+ [183]
-
-
-
+/-
+
-
-/+ [184]
-
+[185]
+
+
-
+
+
+
-/+ [186]
+
-/+ [187]
+
-
Значения параметров по умолчанию
+
-
+
+ [183]
+
-
+/- [188]
-
+
-
-
-
+[189]
+
+/- [190]
+
+
+
+
+/-
+
+
+
+
Локальные функции
+
-/+ [191]
+ [192]
+/-
+
-
+
+
-
+/- [193]
+
+
+[194]
+
+/-
+
+
+
+
-
+/-
+
+
?
Сопоставление с образцом
-
-
-
+/-
-
-
+
+
-
-
-
+
+/-[195]
+
+
-
- [180]
-
+
?
-
-
+
?
Контрактное программирование
-
-
-
+ [196]
+
+
?
+/- [196]
+/-
+/- [197]
?
+ [198]
+
+
?
-
+/-
+/-
?
?
+ [196]
-
-
?
Наличие библиотек для работы с графикой и мультимедия (OpenGL/WebGL/OpenML/OpenAL или DirectX)
?
+
+
+
?
?
?
?
?
+
+
+
?
?
?
-/+[199]
+
?
?
?
+
+
?
?
[править] Стандартизация
Язык
Ada
C
C++
C#
D
Eiffel
Erlang
F#
Groovy
Java
JavaScript
Haskell
Common Lisp
Nemerle
Perl
PHP
Python
Ruby
Scala
Smalltalk
VB.NET
Delphi
OCaml
PureBasic
Стандарты
ISO ANSI ГОСТ
ISO ANSI
ISO
ISO ECMA
-
ISO ECMA
-
-
-
-
ECMA
Haskell 2010
ANSI
-
-
-
-
-
-
ANSI
-
-
-
-
[править] Примечания
↑ Показывать компактно
↑ Показывать компактно
↑ Императивный/Haskell. Монады позволяют выполнять императивные действия.
↑ 12 ООП/Erlang. Можно провести параллель между процессами в Эрланге и объектами в определении Алана Кея [1].
↑ ООП/Javascript. Прототипная модель ООП.
↑ ООП/Haskell. Классы типов и семейства типов перекрывают возможности ООП.
↑ рефлексия c++ не входит в стандарт, однако есть реализация с помощью метакомпилятора в Qt
↑ Логический/Haskell. Изначально инструментов для логического программирования не встроено, но есть сторонние библиотеки. Существует академический функционально-логический язык Curry, берущий Haskell за основу.
↑ Логический/Common Lisp. Логическая парадигма изначально в язык не встроена, но реализуется средствами языка.
↑ LINQ
↑ В языке существует множество декларативных конструкций, и, более того, возможность создавать свои, с помощью макросов.
↑ Декларативный/Perl. Только регулярные выражения.
↑ Распределённый/Ada. См. Annex E. Distributed Systems.
↑ 12 Распределённый/C и C++. Многие распространённые компиляторы поддерживают директивы для распараллеливания в рамках технологий MPI и OpenMP.
↑ Распределённый/C#. Существуют проекты распределённых модификаций языка, например Parallel C#.
↑ Распределённый/Haskell. Модель языка подразумевает распределённое использование, при этом не требуя от программиста усилий на реализацию распределённости. Один из поддерживающих эту возможность компиляторов — Glasgow Distributed Haskell.
↑ 12 ANSI стандарт языка предусматривает опциональные декларации типов, которые какие-либо конкретные реализации могут использовать по своему усмотрению. Большинство современных реализаций CL принимают декларации типов в расчет, и используют для статической проверки типов и в целях оптимизации.
↑ Статическая типизация/Perl. С версии 5.6. Только для не встроенных типов.
↑ Статическая типизация/Smalltalk. Возможность статической типизации есть в диалекте Smalltalk — Strongtalk'е.
↑ Динамическая типизация/C#. Посредством специального псевдо-типа dynamic с версии 4.0.
↑ Динамическая типизация/F#. Компилятор поддерживает синтаксический сахар в виде преобразования использования оператора (?) xml?name в вызов xml.op_Dynamic("name"), на базе чего может быть реализована имитация динамической типизации.
↑ Динамическая типизация/VB.NET. Контролируемо с помощью Option Strict.
↑ Динамическая типизация/Delphi. Посредством специального типа Variant.
↑ Явная типизация/Erlang. Можно использовать т. н. type test BIFs. См. [2]
↑ Явная типизация/Perl. См. Prototypes в man perlsub.
↑ Явная типизация/Python. Частично в Python 3.0.
↑ Явная типизация/Smalltalk. Есть в Strongtalk.
↑ var, dynamic etc.
↑ Неявное приведение типов/Ada. См. 4.6 Type Conversions.
↑ Неявное приведение с потерей данных/Perl. При сложении строки с числом: $a = '5aa'; print $a + 0; Напечатает: 5
↑ Неявное приведение в неоднозначных ситуациях/Perl. Не совсем корректно, так как в Perl эти ситуации однозначны: 1 + "2" # 3 и 1. "2" # "12"
↑ Макрос DEFTYPE
↑ 12 Вывод типов/C++. Поддержка вывода типов имплементируется в C++0x сиспользованием ключевых слов [code]auto[/code] и [code]decltype[/code].
↑ 1234 Вывод типов/Common Lisp. Некоторые компиляторы Common Lisp, такие как SBCL, поддерживают частичный вывод типов.
↑ Параметрический полиморфизм с ковариантностью/C#. Доступно начиная с C# 4.0 для типов интерфейсов и делегатов.
↑ Информация о типах в runtime/Ada. Точный тип узнать можно (Ada.Tags), но полной поддержки отражения в языке нет. Можно узнать имя, предков, интерфейсы, сериализовать объект, но нельзя запросить список методов.
↑ Информация о типах в runtime/С++. Можно сравнить типы на точное совпадение, узнать имя типа (typeid), приводить типы вниз по иерархии наследования.
↑ См. встроенную функцию ref и метод isa
↑ Open-source компилятор (интерпретатор)/Smalltalk. В любом диалекте Smalltalk исходники всего, кроме виртуальной машины, (то есть библиотека классов, компилятор в байткод, среда разработки, сторонние библиотеки и пр.) принципиально открыты — это свойство языка. Из основных диалектов исходники виртуальной машины открыты у GNU Smalltalk, Squeak и Strongtalk.
↑ Open-source компилятор (интерпретатор)/Delphi. FreePascal и Lazarus.
↑ Возможность компиляции/Erlang. HiPE — High Performance Erlang. Доступен только для *nix-систем.
↑ Существуют PHP-компиляторы, вполне корректно комилирующие любые PHP-скрипты. Например, Roadsend PHP Compiler.
↑ Возможность компиляции/Smalltalk. Стандартная реализация в Smalltalk — это прозрачная компиляция в байт-код (в момент сохранения изменённого исходного кода) с последующим исполнением на виртуальной машине, часто с использованием JIT-компилятора. Однако некоторые диалекты поддерживают прямую компиляцию в машинные коды. В частности, к таким диалектам относятся Smalltalk MT и Smalltalk/X.
↑ Bootstrapping-компилятор/Java. Java Compiler API появилось в версии 6.0.
↑ Narcissus.
↑ Например, SBCL
↑ Bootstrapping-компилятор/Python. Проект PyPy.
↑ Bootstrapping-компилятор/Smalltalk. Компилятор в байт-коды изначально написан на самом Smalltalk и исполняется внутри виртуальной машины. Кроме этого также есть примеры виртуальных машин Smalltalk, написанных на самом Smalltalk — к ним, в частности, относится виртуальная машина Squeak, написанная на подмножестве Smalltalk, которое потом транслируется в C и компилируется в машинные коды. При этом собственно разработка и отладка виртуальной машины Squeak осуществляется внутри работающей системы Squeak.
↑ Интерпретатор командной строки/Ada. Business Shell (BUSH).
↑ 12 Интерпретатор командной строки/C++. C++ интерпретатор CINT.
↑ Планируется к версии 5.0 языка.
↑ Rhino Shell.
↑ В диалекте GNU Smalltalk реализована поддержка командной строки.
↑ Условная компиляция/Ada. Поскольку использование препроцессора существенно осложняет работу утилит, отличных от компилятора, работающих с исходными текстами, в стандарт эта возможность не входит. Здесь: Conditional Compilation описывается, как можно организовать условно компилируемый код. В качестве резервного варианта предоставляется препроцессор gnatprep.
↑ Условная компиляция/Java. Утверждения (операторы assert) всегда включаются компилятором в байт-код и могут быть разрешены (по умолчанию запрещены, то есть игнорируются) при запуске виртуальной машины ключом -ea/-enableassertion.
↑ [3].
↑ Макросы лиспа позволяют при компиляции вычислять произвольные выражения, включая, естественно, конструкции ветвлений. Кроме того, имеется также примерный аналог #ifdef из Си.[4][5]
↑ Компилятор должен решать, какие классы будут представлены «простыми» типами и будут, в том числе, размещаться в стеке.
↑ Создание объектов на стеке/Haskell. В GHC при помощи Unboxed Types / Unboxed Arrays.
↑ Стандарт языка предусматривает декларацию DYNAMIC-EXTENT, которая может трактоваться компилятором как указание выделить место под объект на стеке.
↑ Создание объектов на стеке/Delphi. В Delphi имеется 2 объектных модели — старая (унаследована из Turbo Pascal) и новая. Создание объектов на стеке возможно только в старой объектной модели.
↑ 1234567 Через FFI (foreign function interface)
↑ Можно с помощью модуля стандартной библиотеки — ctypes.
↑ Неуправляемые указатели/Smalltalk. В Smalltalk есть возможность низкоуровневой работы с памятью, но только в адресном пространстве, предоставляемом виртуальной машиной.
↑ unsafe + System.Runtime.InteropServices
↑ Ручное управление памятью/Smalltalk. При низкоуровневой работе в пространстве памяти, предоставляемом виртуальной машиной, можно вручную создавать и удалять объекты, записывая данные в соответствующие адреса памяти. Аналогично можно вручную управлять размещением объектов в памяти.
↑ Сборка мусора/Ada. Только на некоторых платформах (.NET и JVM) или при помощи библиотек (AdaCL:GC). Тем не менее, практически все программы на Ada могут работать как с ним, так и без него. В этом смысле к сборке мусора применительно к Аде следует относиться не как к инженерному решению, а как к оптимизации управления памятью.
↑ Сборка мусора/C. В стандарте языка и в стандартных библиотеках нет сборки мусора. Однако существуют сборщики мусора для C и C++ в виде библиотек. Например, BoehmGC (англоязычный раздел).
↑ В новом стандарте C++0x предполагается сборка мусора для интеллектуальных указателей
↑ Сборка мусора/Delphi. Если не считать Delphi.NET.
↑ Инструкция goto/Java. Является зарезервированным словом.
↑ Специальный оператор GO. Все конструкции циклов в CL, фактически, являются макросами-надстройками над этой инструкцией.
↑ Целевая метка должна находиться в том же файле, в том же контексте. Имеется ввиду, что вы не можете ни перейти за границы функции или метода, ни перейти внутрь одной из них [6].
↑ Инструкция goto/Ruby. В языке goto нет, но есть библиотека реализующая его.
↑ Инструкция goto/Smalltalk. В стандарте языка goto нет, но существуют библиотеки, реализующие функциональность goto через управление стеком исполнения. Используются крайне редко, это скорее proof of concept (англ.).
↑ Макрос RETURN. Фактически, является частным случаем RETURN-FROM.
↑ заменяется исключениями, также реализуется с помощью Camlp4 http://code.google.com/p/ocaml-break-continue/
↑ Специальный оператор RETURN-FROM
↑ Принимает необязательный числовой аргумент, который сообщает ему выполнение какого количества вложенных структур необходимо прервать [7].
↑ Есть возможность указать число вложенных циклов, которые нужно прервать
↑ Можно либо повторить выполнение метода, либо пробросить исключение далее
↑ Java-style try-catch блок реализуется макросом handler-case. Кроме того, в возможности системы обработки исключений Common Lisp входит система т. н. перезапусков(restarts), которые позволяют обрабатывать исключения «изнутри» без раскрутки стека вызовов функций
↑ При помощи оператора eval
↑ 123 При использовании библиотеки PBOSL
↑ Блок finally/Ada. В стандарте языка finally нет, но существуют библиотеки, реализующие функциональность finally. Используются крайне редко, это скорее proof of concept (англ.).
↑ MDN — MDC
↑ Специальный оператор UNWIND-PROTECT
↑ реализуется на camlp4 http://bluestorm.info/camlp4/dev/try/pa_tryfinally.ml.html
↑ При помощи нескольких последовательных catch
↑ Java-style try-catch блок реализуется макросом handler-case. Кроме того, в возможности системы обработки исключений Common Lisp входит система т. н. перезапусков(restarts), которые позволяют обрабатывать исключения «сверху» без раскрутки стека вызовов функций
↑ При помощи eval or {…}
↑ Частично реализуются нестандартным модулем Runops::Resume
↑ Конструкции yield return, запросы LINQ, в FCL 4.0 войдёт тип Lazy.
↑ Seq-генераторы, модуль Lazy стандартной библиотеки F#.
↑ Однако, данную возможность можно реализовать на макросах
↑ Данная возможность реализована на макросах
↑ Ленивые вычисления/Ruby. В языке ленивых вычислений нет, но есть библиотека реализующая их.
↑ Конструкции Linq.
↑ модуль Lazy стандартной библиотеки Ocaml.
↑ setcontext et al. (UNIX System V and GNU libc)
↑ Реазилуется сторонними библиотеками, например cl-cont
↑ Только для байт-кода http://okmij.org/ftp/Computation/Continuations.html#caml-shift
↑ Легковесные процессы/Java. Вплоть до Java 1.1.
↑ Только в некоторых реализациях.
↑ Следует заметить что это не стандартные легкие процессы [8]
↑ Легковесные процессы/Python. Используя Stackless Python.
↑ Монадические потоки выполнения, реализованы в библиотеке Lwt
↑ Кортежи/C++. Реализуются в стандартной библиотеке (появились в TR1 (англоязычный раздел), до этого в boost). Кроме того, планируется поддержка кортежей в C++0x
↑ 12 Кортежи/.NET. С помощью типов System.Tuple<T,...> введёных в FCL 4.0.
↑ 12 Алгебраические типы данных/Ada и Delphi. Через механизм вариантных записей.
↑ 12345678 В динамических языках механизм алгебраических типов данных не имеет смысла.
↑ 12 Массивы/Haskell. С помощью Data.Array.
↑ Динамические массивы/C. «Из коробки» данной возможности нет, однако похожий функциональность можно реализовать, используя функцию realloc.
↑ Динамические массивы/Java. С помощью java.util.Vector (в стандартной библиотеке).
↑ map и unordered_map в стандартной библиотеке
↑ Ассоциативные массивы/Java. С помощью java.util.HashMap (в стандартной библиотеке).
↑ Ассоциативные массивы/Haskell. С помощью Data.Map
↑ Контроль границы массивов/С++. Для массивов контроля нет, однако в контейнерах STL, таких как std::vector, std::array есть метод at с контролем границ.
↑ 123 Контроль границ массивов/Perl, PHP и JavaScript. В языке нет массивов со статическими границами, присваивание элементу за текущими границами массива просто расширяет границы массива.
↑ Контроль границ массивов/Ocaml. Можно отключить на этапе компиляции с помощью ключа -unsafe
↑ Цикл foreach/Ada. Методы Iterate и Reverse_Iterate различных контейнеров, входящих в библиотеку Ada.Containers.
↑ Цикл foreach/C++. В C++11 for(auto x: some_array){} — не может изменять элементы, for(auto& x: some_array){} — может изменять элементы.
↑ Цикл foreach/Erlang. В виде функции foreach/3 из модуля lists.
↑ Цикл foreach/JavaScript. С версии 1.6[9].
↑ Цикл foreach/Lisp. Макрос LOOP в составе стандартной библиотеки. Представляет собой «язык в языке» с большим количеством возможностей.
↑ List comprehensions/C#. «Query Comprehension» можно считать за List Comprehension только с большой натяжкой.
↑ LOOP et al.
↑ 123 Целые числа произвольной длины/.NET. Посредством типа System.Numerics.BigInteger, включенного в FCL версии 4.0.
↑ Целые числа произвольной длины/Java. С помощью классов BigInteger и BigDecimal.
↑ Для вычислений с произвольной точностью PHP предоставляет Двоичный калькулятор, который поддерживает числа любого размера и точности, представленные в виде строк [10].
↑ Целые числа произвольной длины/Scala. С помощью классов BigInteger и BigDecimal.
↑ Целые числа произвольной длины/OCaml. В помощью модуля Num и Big_int.
↑ Пример: Тип (INTEGER 0 9) включает в себя все цифры от 0 до 9
↑ Целые числа произвольной длины/Perl. С помощью модуля Tie::Scalar.
↑ Множественное наследование абстрактных классов
↑ Похожая функциональность реализуется макросами и средствами CLOS.
↑ Через множественное наследование от классов с методами-заготовками. См. [11]
↑ Могут быть реализованы с помощью паттерна Visitor(Посетитель)
↑ Эмуляция через dynamic
↑ 1234 Реализуется сторонними библиотеками
↑ появятся(?) в Perl 6
↑ Могут быть реализованы с помощью наследования шаблонов Примесь_(программирование)#.D0.AD.D0.BC.D1.83.D0.BB.D1.8F.D1.86.D0.B8.D1.8F
↑ Через множественное наследование и/или изменение атрибутов произвольного объекта во время выполнения
↑ Подмешивание реализации интерфейсов через ключевое слово implements. См. страницы 10-7 и 10-8 в Object Pascal Guide.
↑ Переименование членов при наследовании не поддерживается c++, однако можно сэмулировать через закрытое наследование, открывая члены, которые не нужно переименовать через директиву using, а если нужно переименовать — просто опредилить метод с новым названием и вызвать в нём метод родителя
↑ Только совместное использование посредством виртуального наследования
↑ Для каждого члена класса — выбор дублирование (через переименование), или слияние (иначе, если не было переопределения)
↑ CLHS: Section 4.3.5
↑ Functions — D Programming Language 2.0 — Digital Mars
↑ в форме указателей на функции
↑ std::function в c++0x
↑ 12 Появились в Delphi2009, как анонимные функции. Ранее — через указатели.
↑ C++0x. Лямбда-выражения в C++0x
↑ Анонимные делегаты присутствуют в языке с версии 2.0. В C# 3.0 появились полноценные анонимные функции.
↑ Макрос LAMBDA
↑ lambda-функции в c++0x поддерживают замыкания как по ссылке, так и по значению
↑ Через анонимные классы
↑ Начиная с версии 5.3
↑ Появились в Delphi2009, как анонимные функции.
↑ boost::bind, std::bind1st, std::bind2nd или сэмулировать с помощью анонимных функций
↑ Реализуется сторонними библиотеками, например Sub::Curry и Sub::Curried
↑ functools.partial в стандартной библиотеке начиная с Python 2.5
↑ с помощью lambda-функций в c++0x
↑ Proc#curry, появился в Ruby 1.9
↑ 12 Макросы/C. Посредством препроцессора C.
↑ Макросы/Haskell. Template Haskell — препроцессор, встроенный в GHC.
↑ Фильтры [12], в том числе, C/C++ препроцессор Filter::cpp
↑ Встроенны в Visual Studio (нет в Express Edition)
↑ Штатный препроцессор camlp4
↑ 12345678 Неприменимо в языках с динамической типизацией.
↑ Generics/Haskell. Прямых аналогов шаблонов в языке нет, однако имеются не менее мощные средства обобщенного программирования.
↑ Generics/Delphi. Доступно начиная с Delphi 2009.
↑ Unicode в идентификаторах/C. Доступно в компиляторах gcc начиная с 4.2
↑ Unicode в идентификаторах/C++. Доступно в компиляторах от MS, начиная с MSVS++ 2005 и в gcc начиная с 4.2
↑ В большинстве современных реализаций
↑ Unicode в идентификаторах/Python. Доступно начиная с Python 3.0.
↑ Unicode в идентификаторах/Ruby. Доступно начиная с Ruby 1.9.
↑ Перегрузка функций/JavaScript. Можно сымитировать, используя проверку передаваемых параметров с помощью рефлексии.
↑ Обобщенные функции можно перегружать по типам или значениям нескольких параметров
↑ Только перегрузка операторов [13].
↑ 12 Перегрузка функций и сопоставление с образцом/Python. Реализовано в сторонней библиотеке PEAK-rules.
↑ implicit-parameters
↑ макросы DEFVAR и DEFPARAMETER, а также декларация SPECIAL, создают динамические биндинги.
↑ 12 Именованные аргументы и параметры по умолчанию/C#. Доступно начиная с C# 4.0.
↑ Именованные параметры/JavaScript. Можно сымитировать, передав в качестве параметра функции объект: f ({param1: "value1", param2: "value2"}).
↑ Спецификатор «&key» в списке аргументов объявляемой функции объявляет именованный параметр.
↑ Именованные параметры/Smalltalk. Можно называть методы в стиле сделатьЧтоНибудьС:используя:и: — в таком случае двоеточия обозначают места, куда будут подставляться параметры при вызове метода, например сделатьЧтоНибудьС: парам1 используя: парам2 и: парам3. Названия подбирают таким образом, чтобы при вызове было понятно, для чего будут использоваться параметры.
↑ Именованные параметры/Delphi: Могут использоваться при вызове OLE: Word.Openfile(filename='1.doc')
↑ Значения параметров по умолчанию/Erlang. Можно сымитировать с помощью арности функции.
↑ «&key» и «&optional» параметры допускают значения по умолчанию
↑ Значения параметров по умолчанию/Perl. Можно элементарно сымитировать, см. [14].
↑ Локальные функции/С. Поддерживаются в компиляторе gcc как нестандартное расширение языка, см. [15].
↑ Локальные функции/С++. с помощью lambda-функций в c++0x
↑ Локальные функции/Java. Внутри метода можно определять безымянные (анонимные) локальные классы, которые фактически позволяют создавать экземпляры объектов, перекрывающие методы своего класса.
↑ Cпециальный оператор LABELS
↑ Макрос DESTRUCTURING-BIND и EQL спецификатор в обобщенных функциях можно рассматривать как аналоги некоторых подмножеств функциональности сопоставления с образцом.
↑ 123 Посредством библиотеки Code Contracts из состава FCL 4.0.
↑ Контрактное программирование/Java. На основе аннотаций Java 5, используя библиотеку OVal и аспектный компилятор AspectJ, а также iContract [16].
↑ Контрактное программирование/Haskell. Посредством библиотеки QuickCheck.
↑ Существует реализация OpenGL библиотеки для php — phpOpenGL project (Зеркало на Github)
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
studopedia.su - Студопедия (2013 - 2025) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав!Последнее добавление