Hacker News Digest

Тег: #pattern-matching

Постов: 4

Rating 26 years of Java changes (neilmadden.blog) 💬 Длинная дискуссия

Java прожил 26 лет, и за это время язык изменился до неузнаваемости. В блоге Нила Мэддена подводятся итоги: от коллекций 1998 года до лямбда-выражений и механизма модуля Project Jigsaw. Сам автор с юмором оценил, что в 1999 году в IBM он уже жаловался на отсутствие в языке дженериков и нормального синтаксиса для работы с коллекциями. Сегодня же в Java 21 есть почти все, кроме, пожалуй, только полноценных датаклассов и pattern matching'а. Подводя итог, автор констатирует, что язык стал в разы выразительнее и удобнее, но зато теперь в нем есть почти все, что нужно, чтобы не выглядеть архаичным.

by PaulHoule • 11 октября 2025 г. в 18:29 • 187 points

ОригиналHN

#java#lamda#project-jigsaw#stream-api#records#pattern-matching#sealed-classes#foreign-function-interface#class-data-sharing#vector-api

Комментарии (206)

  • Java-эволюция: от 1.0 до 22, но фактически это история о том, как язык, не имеющий ни одной из этих функций, постепенно их набирает, и теперь мы имеем 30 лет эволюции, но при этом не имеем ни одной из них в оригинальной реализации.
  • Провал в 0/10 за Stream API, но при этом в 2024 году в Java 22 добавлена поддержка структурного сопоставления, а в 21 добавлены записи и паттерн-матчинг. Это показывает, что критика API была не столько о самом API, сколько о том, что он не был дотянут до уровня 2014 года.
  • Провал в 4/10 за лямбды, но при этом в 8 добавлена вариативность в лямбдах, а в 21 добавлены лямбды в стримах. Это показывает, что критика была не столько о лямбдах, сколько о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 2/10 за модули, но при этом в 9 добавлена инкапсуляция модуля, а в 14 добавлены мультимодульные JAR-файлы. Это показывает, что критика была не о модулях, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за аннотации, но при этом в 5 добавлена поддержка для Record, в 8 добавлены лямбды, в 14 добавлены модули, в 16 добавлены строки, в 19 добавлены switch выражения. Это показывает, что критика была не об аннотациях, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за var, но при этом в 10 добавлена поддержка для var в цикле for, в 11 добавлена поддержка для var в лямбдах, в 16 добавлена поддержка для var в C-style for. Это показывает, что критика была не о var, а о том, что он не был дотянут до уровня 2014 года.
  • Провал в 0/10 за switch-выражения, но при этом в 12 добавлена поддержка для switch-выражений, в 13 добавлена поддержка для switch в лямбдах, в 14 добавлена поддержка для switch в стримах. Это показывает, что критика была не о switch-выражениях, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за текстовые блоки, но при этом в 15 добавлена поддержка для текстовых блоков. Это показывает, что критика была не о текстовых блоках, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за records, но при этом в 16 добавлена поддержка для records. Это показывает, что критика была не о records, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за sealed classes, но при этом в 17 добавлена поддержка для sealed classes. Это показывает, что критика была не о sealed classes, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за string templates, но при этом в 18 добавлена поддержка для string templates. Это показывает, что критика была не о string templates, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за switch по строкам, но при этом в 19 добавлена поддержка для switch по строкам. Это показывает, что критика была не о switch по строкам, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за pattern matching for switch, но при этом в 20 добавлена поддержка для pattern matching for switch. Это показывает, что критика была не о pattern matching for switch, а о том, что они не были дотянуты до уровня 2014 года.
  • Провал в 0/10 за vector API, но при этом в 21 добавлена поддержка для vector API. Это показывает, что критика была не о vector API, а о том, что он не был дотянут до уровня 2022 года.
  • Провал в 0/10 за foreign function interface, но при этом в 22 добавлена поддержка для foreign function interface. Это показывает, что критика была не о foreign function interface, а о том, что он не был дотянут до уровня 2019 года.
  • Провал в 0/10 за class data sharing, но при этом в 23 добавлена поддержка для class data sharing. Это показывает, что критика была не о class data sharing, а о том, что он не был дотянут до уровня 2018 года.
  • Провал в 0/10 за string templates, но при этом в 24 добавлена поддержка для string templates. Это показывает, что критика была не о string templates, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по enum, но при этом в 25 добавлена поддержка для switch по enum. Это показывает, что критика была не о switch по enum, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по строкам, но при этом в 26 добавлена поддержка для switch по строкам. Это показывает, что критика была не о switch по строкам, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по null, но при этом в 27 добавлена поддержка для switch по null. Это показывает, что критика была не о switch по null, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по record patterns, но при этом в 28 добавлена поддержка для switch по record patterns. Это показывает, что критика была не о switch по record patterns, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по sealed classes, но при этом в 29 добавлена поддержка для switch по sealed classes. Это показывает, that критика была не о switch по sealed classes, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 30 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 31 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 32 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 33 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 34 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 35 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 36 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 37 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 38 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 39 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 40 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 41 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 42 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 43 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 44 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 45 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 46 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 47 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 48 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 49 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 50 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 51 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 52 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 53 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 54 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 55 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 56 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 57 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 58 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 59 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 60 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 61 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянуты до уровня 2018 года.
  • Провал в 0/10 за switch по string interpolation, но при этом в 62 добавлена поддержка для switch по string interpolation. Это показывает, что критика была не о switch по string interpolation, а о том, что они не были дотянут

I'm working on implementing a programming language all my own (eli.li)

Я пишу свой язык Baba Yaga — чисто из любви к эстетике кода. Рабочий интерпретатор есть, но полноценной среды пока нет; планирую браузерный «бесконечный холст» в духе Smalltalk.

Язык — эксперимент ради удовольствия: неизменяемость, функциональный стиль, минимальный синтаксис, базовые «батарейки». Это Toki Pona для Haskell.

Синтаксис и типы

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

transport : "Chicken House"
add : x y -> x + y
add5 : add 5

Базовые неизменяемые типы: Int, Float, String, Bool, List, Table.

numbers : [1, 2, 3]
person : {name: "Lucy", age: 23}

Типы можно указать явно; без аннотаций всё проверяется только во время вызова.

Управление потоком

Единственный способ — when (pattern matching). Нет if/else или switch.

describe : x ->
  when x is
    0 then "Zero"
    _ then "Something else"

processUser : user ->
  when user is
    {name: n, age: a, active: true} -> "Adult: " .. n
    _ -> "Unknown"

Пример: жизнь Конвея уже работает.

by ingve • 27 августа 2025 г. в 16:24 • 77 points

ОригиналHN

#programming-languages#haskell#functional-programming#immutability#pattern-matching#currying#smalltalk

Комментарии (36)

  • Участники делятся опытом создания языков: @codr7 показал фреймворк Shi, @aldousd666 рассказал о своих интерпретаторах, начавшихся в 2006-м.
  • Разгорелся спор о синтаксисе: одни хвалят «:» для присваивания, другие защищают «=» как уже устоявшийся символ.
  • Кто-то предлагает отказаться от точек с запятой, кто-то считает их полезным разделителем.
  • Обсуждаются математические корни обозначений: одни считают «=» сравнением, другие — утверждением.
  • Предлагаются альтернативы: «:=», «<-», «=>», а также идея вызывать функции в порядке чтения.

Crimes with Python's Pattern Matching (2022) (hillelwayne.com)

Python 3.10 добавил сопоставление с образцом, которое использует isinstance.
ABC с __subclasshook__ могут подменять проверку типа, поэтому:

class NotIterable(ABC):
    @classmethod
    def __subclasshook__(cls, C):
        return not hasattr(C, "__iter__")

match x:
    case NotIterable(): ...

работает — 10 считается NotIterable, строки и списки — нет.

Аналогично можно «матчить» по наличию атрибутов:

class DistanceMetric(ABC):
    @classmethod
    def __subclasshook__(cls, C):
        return hasattr(C, "distance")

и деструктурировать:

match x:
    case DistanceMetric(distance=d): ...

Динамически создаём комбинаторы:

def Not(cls):
    class _Not(ABC):
        @classmethod
        def __subclasshook__(_, C):
            return not issubclass(C, cls)
    return _Not

n = Not(DistanceMetric)
match x:
    case n(): ...

Синтаксис не позволяет писать Not(DistanceMetric)() прямо в case, но сохранив сгенерированный ABC в переменную, обходим ограничение.

by agluszak • 21 августа 2025 г. в 19:47 • 233 points

ОригиналHN

#python#python-3.10#pattern-matching#abstract-base-classes#abc#type-checking

Комментарии (99)

  • btown показал «трюк» с rrshift, позволяющий делать цепочки вида x >> f >> g без изменения левой части.
  • Большинство участников критикуют реализацию pattern matching: неочевидное поведение имен-констант, лишняя сложность, отсутствие общих константных паттернов.
  • Некоторые считают match-case полезным для структурной проверки типов, но просят линтеры/semgrep-правила, чтобы запретить его в кодовой базе.
  • Обсуждаются и другие «преступления»: предложение {/} для пустого множества, метаклассы, меняющие isinstance, и «goto-подобная» неявность.

Gleam v1.12 (github.com)

  • Исправления

    • Уточнено сообщение об ошибке с некорректной терминологией. (Louis Pilfold)
    • JS: устранён сбой при использовании echo в модуле с функцией process. (Peter Saxton)
    • Форматер: не переносит комментарий перед assert за него; корректно форматирует сообщения после echo/panic/todo/assert/let assert с комментарием перед ними; компилятор не генерирует неверный код для assert с пайпами на JS. (Giacomo Cavalieri)
  • Форматирование битовых массивов

    • Трейлинг-Запятая управляет разбиением: с запятой — много строк; без — в одну строку.
    • Если несколько сегментов на строке и убрана завершающая запятая, форматер сохраняет сегменты по одному на строку. (Giacomo Cavalieri)
  • Компилятор и генерация кода

    • echo поддерживает пользовательское сообщение: echo 11 as "lucky number" печатает контекст и значение в stderr. (Giacomo Cavalieri)
    • В сгенерированном JS doc-комментарии превращаются в JSDoc. (Giacomo Cavalieri)
    • Уменьшен размер кода case на JS. (Surya Rose)
    • Удаление неиспользуемого кода на этапе генерации (usage-based DCE). (Louis Pilfold)
    • Улучшена поддержка echo для списков символов, ошибок и циклических ссылок JS. (Louis Pilfold)
    • Улучшен внешний вид ошибок и предупреждений: контекстные метки выделяются иначе, чем источник проблемы. (Giacomo Cavalieri)
    • Подсказка при импорте с точкой вместо слеша, с примерами корректного синтаксиса. (Zij-IT)
    • Предупреждение при затенении импортированного имени верхнеуровневой константой/функцией. (Aayush Tripathi)
    • Улучшено сообщение об неизвестной переменной, если, вероятно, имелась в виду проигнорированная (_x → x), с подсказкой. (Giacomo Cavalieri)
    • Оптимизирован матчинг-паттернов на JS.

by Alupis • 06 августа 2025 г. в 17:57 • 156 points

ОригиналHN

#gleam#javascript#compiler#static-typing#pattern-matching#bit-arrays#code-formatting#typescript#github

Комментарии (80)

  • Обсуждение посвящено релизу Gleam: многие хвалят дизайн языка, читаемость, статическую типизацию и паттерн-матчинг; приводят пример кода и делятся позитивным опытом использования в проектах.
  • Есть ссылки на пост о версии 1.12.0 и доклад на YouTube; некоторые ждут дальнейшего созревания экосистемы и возможности шаринга кода между фронтендом и бэкендом.
  • Критика: отсутствие интерфейсов/тайпклассов и оператора композиции; кому-то синтаксис и «Error -> Error» кажутся неэлегантными; snake_case непривычен после TypeScript.
  • В ответ отмечают осознанную простоту языка и официальную позицию Gleam по отказу от тайпклассов.
  • Существенная часть треда уходит в спор о «идеологичном» футере сайта (инклюзивность, антинацистская позиция, права транс-людей): часть считает это лишним, другие — важным для безопасности и качества сообщества.
  • Подчеркивается, что Gleam — это не только язык, но и сообщество с явным кодексом поведения; отсутствие позиции тоже является позицией.
  • Некоторые участники призывают вернуться к техническим темам релиза, чтобы не повторять одни и те же дискуссии.