Racket
Вот везде говорят, функциональное, функциональное, программирование. Я спросил в нашем чатике, а что в тренде? На чем я должен программировать, если пришел на вечеринку с коктейлями?
От Хаскеля отказался сразу, спасибо не надо. Я несколько раз пытался его понять, даже книжку одну прочитал до половины, они там так и не написали не строчки кода, и я не написал ни строчки кода. Все что знаю - есть монады, морфизмы и эндофункторы. Достаточно. Что тогда остается? Возможные лисп-диалекты: скобочки и сложение в польской записи. Ок. Из ортодоксальных показалось, что самый живой Clojure, но Муслим посоветовал сначала посмотреть на Racket - один из лиспов, который учат в школах, институтах и других учебных заведениях.
Что могу сказать - ну тоже язык. Скобочек много. Мозгу тяжело. Все как положено. Поставляется с забавной визуальной средой DrRacket, вот я написал пример из тьюториала:
Попробовал я эту красоту и сразу представил, как подходит Заказчик и говорит: "кружочки - отличные, а вот этот квадрат сделай плиз желтым".
В руби я бы вставил бы что-нибудь типа x == 1 && y == 0 && kind == "square" ? "yellow" : "red"
и пошел
бы дальше. Здесь же получилось захачить далеко не сразу. В итоге получилось примерно так:
#lang slideshow
(define (square n)
(filled-rectangle n n))
(define (series mk)
(hc-append 4 (mk 5 0) (mk 10 1) (mk 20 2)))
(define (hacked_red i mode)
(if (and (eq? mode 'with_hacked_red) (eq? i 1)) "yellow" "red"))
(define (color i j mode)
(cond
[(eq? j 0) (hacked_red i mode)]
[(eq? j 1) "green"]
[else "blue"]))
(define (logo mk mode)
(vc-append
(series (lambda (sz i) (colorize (mk sz) (color i 0 mode))))
(series (lambda (sz i) (colorize (mk sz) (color i 1 mode))))
(series (lambda (sz i) (colorize (mk sz) (color i 2 mode))))))
(logo circle 'default)
(logo square 'with_hacked_red)
Хм. Выглядит не очень. Кто знает как сделать более красиво и правильно?
Tweet