Тема: Чого вам не вистачає в Пітоні? Ділимося власними костилями
Так сталося, що свого часу я захопився ліспом (Scheme та Clojure, на останньому настворював досить чимало коду), але зараз мені більше імпонує Python, тож хотілось би якось прочитати й зрозуміти свої минулі напрацювання переписати старий код на нього.
Чого не вистачає і в чому взагалі складність? Перш за все, ліспоїдні мови є переважно функціональними, а Python, хоч і використовує чимало можливостей ФП, в основі має процедурний код. Досить сказати, що повноцінних анонімних функцій у синтасисі пітона не передбачено (лише лямбда, що може нести в собі лише один вираз) — у той час, як у ліспі вся програма може являти собою один великий вираз із включеними в нього алгоритмічними елементами. Не вистачає й ліспівських макросів (було б надто круто, якби нелісп використовував щось подібне) — таким чином, відсутні синтаксичні засоби можна замінити лише або функціями, або костилями.
Втім, не все так погано. Наприклад, можна замінити ліспівський let лямбдою:
;;SCHEME:
(let ((x 7)
(y 8))
(let ((z (* x y)))
(* x y z)))
можна переписати, використавши виклик лямбди:
# Python:
(lambda x=8,
y=9:
(lambda z=x*y:
x*y*z)())()
Згадану вище проблему кількох інструкцій в одній лямбді можна обійти, використавши список чи кортеж (неоптимально й костильно, та все ж...):
s=(lambda:
(print('Hello, my friend!'),
print('What is your name?'),
input())
[-1]) # беремо результат лише останньої інструкції
(Далі буде…)