LINUX.ORG.RU

В питон завозят паттерн-матчинг

 


2

4

Кто бы мог подумать, ещё лет 5 назад, что питон получит типизацию и функциональщину. Но нет:

def is_tuple(node: Node) -> bool:
    match node:
        case Node(children=[LParen(), RParen()]):
            return True
        case Node(children=[Leaf(value="("), Node(), Leaf(value=")")]):
            return True
        case _:
            return False

История показывает, что участь любого популярного ЯП - С++ ужас.

https://www.python.org/dev/peps/pep-0622/

★★★★★
Ответ на: комментарий от Virtuos86

А в каком-нибудь SBCL компилятор не «насквозь пронизан сишными функциями с побочными эффектами»? А «раскрутка» имеется

Причем тут компилятор? Я говорю про исполнение. Если лисповая программа будет так же яростно дергать сишные функции с побочными эффектами, то ничего не поможет. Собсна, беда придет даже без сишных функций, с самыми обычными примитивными побочными эффектами:

x = 1

def nested():
    global x
    x+=1

nested()

Поскольку для питона характерна именно работа с изменяемыми данными, то REPL становится бесполезным без дополнительных ухищрений. А дополнительное ухищрение — это упомянутый «шаг назад». Например, можно сделать форк процесса, запустить в нем выполнение огрызка кода, выдать результат, и уничтожить свежий форк. Но использование такого форка порождает свои проблемы, потому что форк в принципе не умеет поддерживать многопотоки, да и всякие открытые файлы с сокетами могут создать кучу проблем.

byko3y ★★★★
()
Ответ на: комментарий от peregrine

до сих пор нет лямбд

Да ну

Удобных лямбд, которыми бы люди могли пользоваться. Гвидо вон недавно выносил filter/map/reduce, потому что лямбдами все равно никто не пользуется.

и гоуту

И слава богу

В байткоде условия и циклы делаются переходом по меткам, пусть отдельного goto и нету.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

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

Так в этом же и смысл питона. Он изначально задумывался как учебный язычок, и т.о. важна была не целостность языка, а возможность показывать школьникам примеры на любую тему. Поэтому туда и напихивали всё подряд без какой-то взаимосвязи одной фичи с другой. Теперь вот можно и про паттерн матчинг рассказывать на пальцах.

no-such-file ★★★★★
()
Ответ на: комментарий от byko3y

Удобных лямбд

Ты ещё про удобное многопоточное программирование давай расскажи. Лямбды это не удобный инструмент по определению, как и вся функциональщина (особенно чистая). Не так просто хаскель не используется в промышленной разработке.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от byko3y

ЯННП. Борщелисп такой же императивный ЯП, который так же работает с изменяемыми данными. Твой пример также говняный, потому что глобал стэйт никто в здравом уме не изменяет в функциях, за исключением скриптов. Хочешь изменить объект — передавай его в функцию.

Virtuos86 ★★★★★
()
Ответ на: комментарий от peregrine

Лямбды это не удобный инструмент по определению, как и вся функциональщина (особенно чистая). Не так просто хаскель не используется в промышленной разработке.

Какой хаскель? Нормальные лямбды есть и в джаваскрипте.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

А зачем тогда стрелочные функции завезли? Лямбд было мало? Имхо такая же фигня как в питоне с лямбдами и comprehensions.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Это от перла не страдают? Перл это такой язык для любителей жесткого садомазо.

Нет, перл очень удобен для ограниченного класса задач. Просто его надо учить как и любой другой ЯП. Главное въехать в идею контекстов, дальше все легко. Все страдания от безграмотности как обычно.

bread
()
Ответ на: комментарий от peregrine

Лямбды это не удобный инструмент по определению

Синтаксис может быть мусорным, да. Но сама концепция очень полезная. В питоне потому и нет лямбд, что они не вписываются в сахарный синтаксис для букваря. Хотя вот в руби лямбды мимикрируют под конструкции языка, и выглядит всё довольно чисто.

bread
()
Ответ на: комментарий от peregrine

А зачем тогда стрелочные функции завезли?

Сахарок. Но сильно лучше не стало, даже скорее наоборот. Сахар вообще вреден в больших количествах. От питона так вовсе может диабет развиться.

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Учитывая, что мы говорим про синтаксис, это однозначный плюс.

Virtuos86 ★★★★★
()
Ответ на: комментарий от byko3y

А лисп тоже неосиляторы делали, что ли?

Конечно.

paramon
()

Следует отметить, что это вполне логичное продолжение введения dataclass’ов. Осталось добавить туда ещё нормальные альтернативные конструкторы данных одного типа (без подтипизации). И тогда можно будет писать нормальный ML-код. А то сейчас dataclass – это такой альтернативный namedtuple.

Уточнение: ML – это не Machine Learning, как ви-таки могли подумат.

future_anonymous
()
Последнее исправление: future_anonymous (всего исправлений: 1)
Ответ на: комментарий от future_anonymous

ML – это не Machine Learning, как ви-таки могли подумат

Ска, как же меня выбешивают макаки которые используют ML как сокращение для machine learning.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Он изначально задумывался как учебный язычок, и т.о. важна была не целостность языка, а возможность показывать школьникам примеры на любую тему

Нет. По крайней мере не задумывался. Это был язык системных скриптов, созданный по мотивам очень простого и целостного языка ABC. Мне недавно пришла мысль в голову, что питон оказался на такой позиции именно потому, что поощряет механическое запоминание, которое популярно у хомяков ака «будущие индусы».

Потенциал чмырить школьников горой мусора вижу, потенциал обучать их программированию таким образом — не вижу. Школьники обычно имеют проблемы с оператором присваивания, и будет чудо, если они начнут понимать хотя бы его.

byko3y ★★★★
()
Ответ на: комментарий от peregrine

Ты ещё про удобное многопоточное программирование давай расскажи. Лямбды это не удобный инструмент по определению, как и вся функциональщина (особенно чистая). Не так просто хаскель не используется в промышленной разработке

Но используется лисп. Причем, до сих пор, несмотря на то, что в значительной степени стал замещен питоном и сменил диалекты с CL на Clojure и прочие.

byko3y ★★★★
()
Ответ на: комментарий от Virtuos86

Твой пример также говняный, потому что глобал стэйт никто в здравом уме не изменяет в функциях, за исключением скриптов. Хочешь изменить объект — передавай его в функцию

Ну. Передал объект в функцию, изменил объект в REPL — исходное состояние стало невоспроизводимо, REPL стал бессмысленным. Какая разница, как я изменю внешнее состояние — в питоне есть сто способов для этого.

byko3y ★★★★
()
Ответ на: комментарий от peregrine

Ты ещё про удобное многопоточное программирование давай расскажи

Погоди, ты хочешь намекнуть на то, что многопоточно программирование не может быть удобным? Clojure, Erlang, Tcl, не?

byko3y ★★★★
()
Ответ на: комментарий от peregrine

Чем стрелочные функции нормальные? Привык к ним будучи веб макакой? Так же и к питонячьим привыкнешь

Пардон, ты видел лямбды JS? Они дают естественное течение кода, в результате чего асинхронщину много лет писали безо всяких async/await (и пишут). Лямбды же питона не позволяют писать обычный питоний код.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Тут согласен, с оговоркой, что «функциональный» он в популярном понимании: функции как объекты первого порядка, ФВП, лямбды и прочие баззворды. Функциональной «чистотой», естественно, в жс и не пахнет.

Virtuos86 ★★★★★
()
Ответ на: комментарий от byko3y

Это был язык системных скриптов, созданный по мотивам очень простого и целостного языка ABC

ABC был учебным языком и полным говнищем в плане реализации. Гвидо просто выкинул его и переписал с нуля, попутно допилив с учётом прошлого опыта. То, что в начале он использовался по месту для скриптинга на очередном велосипеде никак не отменяет его учебных корней. Тут как в анекдоте - что не делают, всё равно получается автомат Калашникова.

no-such-file ★★★★★
()
Ответ на: комментарий от Virtuos86

И щяс снова начнётся телега про то, что хаскель – не функциональный язык, потому что присвоение идентификаторов является внешним эффектом на мета-уровне, и что в Ъ-языках типа Unlambda чоткие пацаны используют только комбинаторы. Не от тебя, так от какого-нибудь уникума, коих на лоре хватает.

Princesska ★★★★
()
Ответ на: комментарий от peregrine

А зачем тогда стрелочные функции завезли? Лямбд было мало? Имхо такая же фигня как в питоне с лямбдами и comprehensions

Да, в JS 'то наследие, как всегда. Если не считать фактора сахарка, лямбды отличаются от функций тем, что ловят this из внешнего контекста. С «function» такое поведение реализуемо сохранением this во внешнюю переменную (и это делают трансляторы, вроде «let _this4 = this»), но запись становится еще более некрасивой.

По поводу list comphrehension я придерживаюсь мнения, что это костыль и декуларация кривизны языка, а не «еще один удобный инструмент». Давай я тебе приведу пример из руби:

(0..9).select{|n| n.even?}.map{|n| 2*n}
Здесь нет никакого чужеродного для руби синтаксиса. Давай я тебе приведу пример JS:
https://developer.mozilla.org/en-US/docs/Archive/Web/JavaScript/Array_compreh...
Поддерживался в браузерах даже, но был исключен из наброска стандарта. Почему Руби и JS могут жить без list compherension?

По теме я мог бы вспомнить list comprehension еще и в хаскеле. В нем list comprehension — это сахар над do-нотация. Однако, прошаренные могут заметить, что do-нотация — это сахар над монадами. В итоге для хаскеля «list comprehension» — это лишь одна из многочисленных попыток сделать ублюдочные монады читаемыми, чтобы как-то превратить теоретическую безупречность в прикладную ценность. При этом более адекватные прикладным целям ML и Lisp не содержат list comprehension (и монад), пусть и дают инструменты для прикостыливания онных.

То есть, list comprehension в хаскеле решало другую проблему, но суть остается той же: это чужеродная языку конструкция, костыль для выполнения узкой задачи, которую по разным причинам не получилось выполнить штатными инструментами. И, что характерно, подобные языки не выходят из моды. Python, PL/I, и хаскель, и, в конце-концов, C++ — это люто перегруженные костылями и сахаром языки, которые, пусть и в различной степени, но по-своему популярны.

А если кто-то собрался спорить с «выполнением узкой задачи», то предлагаю вам придумать list comprehension, который выдаст отсортированный список остатков от деления чисел в исходном массиве. Или уберет повторы. Любая фича за пределами map/filter уже не может быть реализована через list comprehension и вынуждает использовать другой язык для реализации.

byko3y ★★★★
()
Ответ на: комментарий от no-such-file

Ска, как же меня выбешивают макаки которые используют ML как сокращение для machine learning

Меня — главным образом потому, что очень тяжело теперь искать в гугле что-то про ML.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Мне недавно пришла мысль в голову, что питон оказался на такой позиции именно потому, что поощряет механическое запоминание, которое популярно у хомяков ака «будущие индусы».
Потенциал чмырить школьников горой мусора вижу, потенциал обучать их программированию таким образом — не вижу. Школьники обычно имеют проблемы с оператором присваивания, и будет чудо, если они начнут понимать хотя бы его.

Блин, только что обнаружил, что всё уже было сказно до нас:

“Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.”
― Edsger Wybe Dijkstra

byko3y ★★★★
()
Ответ на: комментарий от Virtuos86

Функциональной «чистотой», естественно, в жс и не пахнет

JS идет по принципу «нельзя запретить человеку выстрелить себе в ногу». Тем не менее, код с неизменяемым состоянием и clone-on-modify вполне себе пишется.

byko3y ★★★★
()
Ответ на: комментарий от no-such-file

ABC был учебным языком и полным говнищем в плане реализации. Гвидо просто выкинул его и переписал с нуля, попутно допилив с учётом прошлого опыта

Не с нуля, я читал сорцы. Да, язык сильно отличается визуально, но большие пласты кода реализации и базовых принципов остались — именно поэтому многие не понимают, почему Гвидо упоминает ABC в истории создания питона.

byko3y ★★★★
()
Ответ на: комментарий от Princesska

И щяс снова начнётся телега про то, что хаскель – не функциональный язык, потому что присвоение идентификаторов является внешним эффектом на мета-уровне, и что в Ъ-языках типа Unlambda чоткие пацаны используют только комбинаторы. Не от тебя, так от какого-нибудь уникума, коих на лоре хватает

Нет, язык Си функционален на уровне ихсходных кодов, потому что онные иммутабельны при выполнении!

byko3y ★★★★
()
Ответ на: комментарий от Lzzz

В перле и руби тоже типов нет и никто не страдает. Зачем они в питоне, если это динамический язык?

В Руби тоже на финальной стадии запиливания аннотаций типов, а паттерн-матчинг завезли в стабильную версию ещё в прошлом году.

OSBuster
()
Ответ на: комментарий от OSBuster

В Руби тоже на финальной стадии запиливания аннотаций типов, а паттерн-матчинг завезли в стабильную версию ещё в прошлом году

Соревнования мусорников начались!

byko3y ★★★★
()
Ответ на: комментарий от OSBuster

В Руби тоже на финальной стадии запиливания аннотаций типов

Ничесе, а говорили не будет аннотаций мол никогда. Вообще, можно прямо сейчас юзать sorbet, хотя он страшный конечно. Зато без введения нового синтаксиса.

bread
()
Ответ на: комментарий от bread

Ничесе, а говорили не будет аннотаций мол никогда. Вообще, можно прямо сейчас юзать sorbet, хотя он страшный конечно. Зато без введения нового синтаксиса

Да, аннотации бесполезны что в руби, что в питоне. Это изначально порочная заетя, которая стала популярна по принципу «чем больше фич, тем лучше язык». Здесь причины исключительно маркетинговые. В конце-концов, Ruby-on-Rails, принесший популярность, это тоже маркетинговый ход.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Ну людям хочется обмазываться аннотациями, что поделать. Не наигрались в детстве в тупой компилятор. А может кодерам и не сильно хочется, но начальство считает, что так глобальнее и надежнее. Но выбирает динамическую платформу за каким-то хером.

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от byko3y

if/elif/else весьма коварная конструкция. Можно на раз пропустить условие из-за неверного порядка, в отличие от case switch.

pekmop1024 ★★★★★
()
Ответ на: комментарий от Princesska

Заметь, первым начал писать бред ты сам. А то, что объекты мутабельны по определению, сомнению не подлежит. Иначе и Питон почти тру функциональный язык.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Princesska

Нет. На хаскель в принципе тут только byko3y накидывает, и то опосредованно, в общей куче. Но когда накидывает один, никаких обсуждений не возникает.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

В теме про питон набрасывать позволено только на питон, остальное нужно тереть как офтоп и флейм. Так считаю.

bread
()
Ответ на: комментарий от bread

В теме про питон набрасывать позволено только на питон, остальное нужно тереть как офтоп и флейм. Так считаю

Ага, только паттерн матчинг — это не питон.

byko3y ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.