При изучении нового языка программирования вы иногда сталкиваетесь с особенностью языка, которая заставляет вас желать иметь его на других ваших языках программирования, которые вы знаете.
Какие языковые особенности были во время изучения очень нового для вас и того, что вы хотели бы иметь на других языках программирования.
Примером этого являются генераторы в Python или C #. Другие примеры могут включать в себя списки в Python, шаблоны в C ++ или LINQ в .NET или ленивые вычисления в Haskell.
Какие еще полууникальные языковые особенности вы встретили, которые были для вас совершенно новыми и поучительными? Существуют ли другие особенности старых языков программирования, которые были уникальными и вышли из моды?
источник
Лисп макросы.
Язык макросов Lisp - это Lisp, с несколькими предопределенными синтаксическими функциями для удобства. Используя их, можно добавлять основные функции в язык, такие как выбор стилей ориентации объекта или детерминистическое сопоставление, подобное Прологу, не отвлекаясь от места. Это делает
setf
возможным макрос, который является концептуально очень мощным макросом:(setf A B)
означает, что при оценкеA
вы получитеB
, и это может быть расширено до любого предела, который вам нравится.Шаблонное метапрограммирование C ++ способно на подобные вещи, но на языке, который сильно отличается от обычного C ++.
источник
Декоратор Python.
С помощью декоратора очень легко реализовать запоминание или синхронизацию функций.
Пример функции таймера.
Теперь, если у вас есть функция для времени, вы можете просто сделать это,
Вы увидите что-то вроде
Функция 'foo' заняла 3 секунды.
источник
Приведение к типу
void*
C. Вы можете преобразовать все в необработанные байты и делать с этими данными все, что хотите .(Да, в наше время это уникально ...)
источник
void*
...Pointer
Pascal и Object Pascal делает то же самое.int64_t
что вы не всегда можете безопасно использоватьvoid *
(Извините за опоздание - 2 года - ответ).Урожай в питоне
В Python (и я верю в C #) вы можете определить так называемый генератор, который приостанавливает выполнение функции в
yield
операторе, возвращает значение и при последующих вызовах, перезапускает функцию, где она остановилась (с сохранением состояния между вызовами). Это отлично подходит для генерации длинных списков значений, когда вас интересует только текущее значение функции (что очень часто встречается). Это позволяет вам создавать потенциально бесконечно длинные последовательности, занимая при этом только очень ограниченное пространство в памяти.источник
Лямбда-выражения (замыкания, вложенные функции, анонимные методы, как вы их называете).
Я впервые столкнулся с ними в Perl, сразу же полюбил их и удивился, почему на других языках их нет. В настоящее время я думаю, что это уже не так уникально; даже PHP удалось как-то их взломать. Но в то время они были уникальны.
источник
Продолжения из схемы (позже принятой на несколько других языков , включая Ruby.)
источник
Наборы в Delphi очень полезны, в основном это просто именованный логический массив. Они очень полезны для сохранения формы настроек с 32 флажками. Но у них есть все те же функции теории множеств (т.е. разность, пересечение, объединение).
Я не уверен, что они вышли из моды, но я использую их все время.
источник
послать
Из Эрланга. Отправляет сообщение асинхронно в другой поток.
Получать
Из Эрланга. Получает сообщение из другого потока.
источник
C # Свойства
против
(Джава)
источник
Союзы в C
Я не могу честно сказать, что я не написал достаточно C, чтобы сделать что-то из этого сам, но я работал с другим кодом, который делает.
Когда дело доходит до упаковки смеси различных данных в приложениях, которые манипулируют необработанными битами / байтами, такими как сетевое или двоичное хранилище данных. В строго типизированных языках нет простого способа сделать эквивалент.
Отказ от ответственности:
Хотя в некоторых случаях союзы чрезвычайно полезны, они не встречаются в большинстве языков более высокого уровня, потому что они не безопасны для типов. То есть, вы можете сделать так, чтобы данные отбирались через границы переменных, используя объединения (большое нет, нет в мире безопасных типов). С большой властью приходит большая ответственность.
источник
union
использования безопасна, некоторые хорошо поддерживаются идиомами (хотя технически это не правильно) - см. Cellperformance.beyond3d.com/articles/2006/06/…… (хотя это больше проблем с указателями, союзы могут подделать это).record
синтаксис для поддержки профсоюзов:in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
Мне действительно нравится модификатор исключением в Ruby . Это кажется таким естественным и заменяет множество сценариев, когда ваш код кажется очень грязным без него.
Как тебе это не нравится? : D
источник
unless
иwhen
которые заменяют наиболее распространенное разветвление сценариев , которые традиционно использовали быif/else
.причудливые синтаксисы аргументов Python
Я не уверен, насколько это уникально, но в python вы можете делать классные вещи, такие как автоматическое преобразование пар ключевых слов в словарь и обратно. То же самое со списками:
Документы Python (прокрутите вниз для большего количества вставки аргумента)
источник
Препроцессор C Вы даже можете написать общий код для разных платформ с - меньше или больше - ifdefs.
источник
Objective-C Категории
Категории предлагают простой способ расширить функциональность объекта во время выполнения (представьте, что композиция против наследования). Классический пример - добавить проверку орфографии в класс NSString.
Также полезно для небольших исправлений ошибок, так как реализация метода в категории переопределит реализацию его родителей.
источник
Рубин «s инъекционный метод в сочетании с Symbol # to_proc особенностью Ruby 1.9 позволяет одной записи некоторый невероятно краткий (но читаемый) код:
например
(1..10).inject(:+)
который суммирует целые числа от 1 до 10 => 55
Увидев подобные примеры, я захотел изучить Ruby, что я только начал делать.
источник
Механизм связывания в JavaFX (RIP). Связывают ключевое слово позволяет связать значение переменной со значением выражения и получать вы избавиться от всех тех , некрасиво Слушатель вообще шаблонного кода.
Хотя JavaFX во многом был неудачным, я нашел много возможностей языка сценариев довольно приятным.
источник
Строковые миксины плюс оценка функции времени компиляции в D - довольно уникальная особенность убийцы. Да, технически это две особенности, но настоящая сила заключается в их объединении. С помощью этой комбинации вы можете написать обычные D-функции, которые генерируют код в виде строки во время компиляции, а затем смешать этот код с любой областью видимости, и он будет оцениваться как обычный D-код. Код полностью статически скомпилирован и выполняется точно так же, как если бы он был написан от руки. Эта функция даже используется для обхода нескольких неприятных ситуаций в стандартной библиотеке.
источник