- 1
List(1,2,3) + "X" == "List(1, 2, 3)X"
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+130
List(1,2,3) + "X" == "List(1, 2, 3)X"
Скала
This is actually deserving how awesomw ruby is.
угадай, что будет в s? )
почему не нужна? жаболожцы же ее боготворят
>читаю книжки по крестам, хаски, J
Почему я СОВЕРШЕННО не удивлён таком сочетанию?
Прям как я раньше.
Бухыхыхы. А чё так? Помню год-два назад я слышал совсем другие разговоры.
в чем цель скалы я так и не уловил. груви - да. скала - нет.
Грейдл, например, не смотря на то, что компилируемый язык, на столько не однозначный, что при отсутствии какого-то импрота (которые он сам может добавить, а может и не добавить) один и тот же код скомпилируется по-разному, только в одном случае ошибка случится в рантайме.
По этому поводу очень хорошо сказал Уилкинсом, автор Grammar of Graphics, [...]orthogonality (as much as possible, everything should work everywhere and in every combination) and hierarchy (complicated tasks should be done by enlisting the support of simple helpers) [...] А эти языки только ухудшают и без того плохую ситуацию.
Я осознал, что гораздо лучше иметь относительно простой язык с чёткой семантикой, возможно, не очень мощный, чем здоровенный сложный язык с пятью системами типизаций и макросами, который умеет всё.
Старый я стал, короче.
Бинго! Абсолютно такие же ощущения сложились при небольшом экскурсе, эдакие кресты в жабомире.
Притом что я обломался её учить, спрашиваю как у более осведомлённого.
>>Я осознал, что гораздо лучше иметь относительно простой язык с чёткой семантикой
Добро пожаловать...
Голанг кстати сразу понравился, хоть в нем на порядок меньше всякого.
В действительности скалка зачастую сложнее крестов. Я как-то пытался коллеге объяснить, что в деталях происходит в несчастном куске кода Это трындец сколько букв пришлось сказать. Надо знать слишком много, чтобы понимать код.
Слушайте я реально не знаю скалы, но код очевидный. Кресты гораздо сильнее мозг выносят.
[эта часть комментария доступна только пользователям премиум-аккаунтов]
Ну вот тут пришлось рассказать про имплиситы - что справа это строка, у которой нет метода r, но он есть у какого-то другого класса, и компилятор ищет, во что такое можно сконвертировать объект, чтобы у него был метод r, и слава либе, это объект, создающий регулярку.
> for (Code(len, c) <- Code findAllIn s) sb.append(c * len.toInt)
Тут я вообще устал объяснять - тип c не сразу очевиден, нужно понять, что это поматченная строка, которая повторяется len.toInt раз. А Code можно использовать в левой части for, т.к. добрые авторы либы определили у регулярок волшебный метод unapply, который выковыривает группы в переменные, и это мы ещё даже не дошли до семантики for.
Короче две строчки, но детально объяснять код замучаешься, слишком много слоёв.
Поясните за чудесный механизм вызова самого себя в паттерн-матчинге:
case (i,p,s) => if (p==c) (i+1,p,s)
Как это работает?
Мозг тут выносит перегрузка плюса на StringBuffere/строке: s+i+p, который неявно вызывает {s.append(i);s.append(p)}. И то что этот append флюент-интерфейсный, то бишь возвращает себя модифицированного или новую немутабельную копию (я хз как там строки).