Ilya
Что-то о пустом говорим. Содержательно было бы, если бы ты показал, как в других языках тестируют функции внутри let/where, а вот в хаскеле типа так нельзя
Dmitry
хорошая читаемость заменяет тестирование 😊
Aleksei (astynax)
Конечно нет
Aleksei (astynax)
"Глаз замыливается" и прочие человеческие ошибки сильно понижают полезность "тестирования глазами"
Alexander
лучший способ бесполезно увеличить sloccount
Dmitry
Случайно наткнулся: https://stackoverflow.com/jobs/173703/senior-haskell-software-developer-genius-for-secucloud (Если не по правилам, скажите, я удалю)
Dmitry
Правда, удивляет: Role: System Administrator
Alexander
а так взять вынес кучу примитивных комбинирубщих функций в топлевел, добавил бесполезных тестов и душа радуется
Alexander
и метрики
Ilya
Где волшебным образом локальные функции покрываются юнит-тестами
Aleksei (astynax)
Можно взять язык, не умеющий в замыкания, но умеющий локальные функции :)
Anonymous
Что-то о пустом говорим. Содержательно было бы, если бы ты показал, как в других языках тестируют функции внутри let/where, а вот в хаскеле типа так нельзя
если другие языки не могут, я то тут причем? я говорю вот о чем - если я знаю про where, то без него не хочу писать код. Но при этом страдает тестируемость. И вот, я выбираю читаемость.
Aleksei (astynax)
Что-то тут переоценено
Aleksei (astynax)
Либо читаемость, либо тестируемость
A64m
Где волшебным образом локальные функции покрываются юнит-тестами
если такого языка нету (в чем я не уверен совсем), это не значит, что этого не надо, что это не недостаток
A64m
ну и что волшебного, как это в принципе можно делать я выше писал, если это не работает, то это проблема конечно
A64m
(не для меня, правда, но это не важно)
Alexander
на TH же можно наверняка
Alexander
но вообще я не вижу большой необходимости в фиче
Alexander
причем не ясно почему это недостаток, и.к. те кто хочет писать тесты на все такие функции могут это делать
Alexander
причем их психологические проблемы не проецируются на всех программистов
Aleksei (astynax)
Если речь про анализ AST и подкладывание замыкаемых переменных, то это такое
Aleksei (astynax)
Не стал бы таким пользоваться
Aleksei (astynax)
"ну такое", как нынче говорят. Такое себе
Alexander
не могут, так что недостаток
where foo = my_testable_toplevel_foo
Alexander
и вперёд
A64m
where foo = my_testable_toplevel_foo
ну, это не то что тут требовали
Alexander
здесь говорили что вере плохо ведь непотестировать
Alexander
вроде
A64m
да, но и о том, чтоб локальных по смыслу функций на топлевеле не было
A64m
это тут не выполняется
Leonid 🦇
where foo = my_testable_toplevel_foo
прям как в питоне делают. правда там для скорости
IC
> Allow hyphenated (à la scheme) identifiers like example-identifier, which some of us prefer to uglyCamelCase. 🤔
IC
на сколько это тяжелее парсить?
Leonid 🦇
- - валидный оператор. и так от нетагивных целых литералов проблемы
Leonid 🦇
т.е. foo - bar /= foo-bar
IC
но в итоге это проблемы токенизатора ведь?
Leonid 🦇
да. но главное токенизатор в головах!
IC
кто не отделяет операторы пробелами в коде - тот токенизатор с проблемами!
Aleksei (astynax)
> :{ Prelude| do Prelude| print 1 Prelude| do do Prelude| print 2 Prelude| do do Prelude| print 3 Prelude| do do do do Prelude| print "doh" Prelude| :} 1 2 3 "doh"
Aleksei (astynax)
Утро узнавания интересностей об отступах в хаскеле
Aleksei (astynax)
let x = let y = 40 in y + 1 z = 1 in x + z
Зигохистоморфный
du du hast
Ю ли я? 🤔
Хм, а в TH можно сделать или имитировать, гм, "отложенную" вклейку? То есть сделать локально вроде foo a b = bar b where bar c = qux a $(generateMockup 'bar) и получить декларацию bar без замыканий где-то дальше на топлевеле.
Dmitry
A splice can occur in place of - an expression; the spliced expression must have type Q Exp - a pattern; the spliced pattern must have type Q Pat - a type; the spliced expression must have type Q Type - a list of declarations at top level; the spliced expression must have type Q [Dec]
Dmitry
декларации - только на top level
Ю ли я? 🤔
А в Q нельзя какой-то custom state запихнуть, чтобы в конце файла извлечь?
IC
@Yuu_chan какую задачу ты решаешь?
Alexander
вообще есть запихивание функций в топлевел
Alexander
в inline-java используется, но сходу не скажу как
Зигохистоморфный
https://wiki2.org/en/Lambda_lifting
Dmitry
Наверное, на топлевел не написать $(generateMockup 'foo 'bar) так как `bar не определена. Зато можно, наверное, скажем, $(generateMockup 'foo 0) - первый из where. Только с замыканиями возиться надо
Dmitry
/stat@combot
Combot
combot.org/chat/-1001043143583
Ю ли я? 🤔
@Yuu_chan какую задачу ты решаешь?
Описанную выше - поиметь возможность реплить и тестить локальные функции
A64m
проверил, работает -- | -- >>> :step foo 3 -- ... -- >>> bar 2 -- 50 foo :: Int -> Int foo x = bar x where bar y = x + y ### Failure in src/Main.hs:7: expression `bar 2' expected: 50 but got: 5 Examples: 2 Tried: 2 Errors: 0 Failures: 1
кана
так-так-так, это что
кана
я думал тесты через примеры в доке очень крутая фича
Dmitry
Я не понял. Что работает и что за фича? Это haddock что ли запускает?
A64m
doctest
Sergey
в эликсире такая тож из коробки есть
Ю ли я? 🤔
И в rust
Sergey
а, да кстати)
кана
такая много где есть, но вот что она есть в хаскеле я даже не ожидал даже не могу представить как она работает
Ю ли я? 🤔
В хаскеле есть всё 😆
A64m
вы вчера тут скриншот доктеста из линз постили
кана
ну я думал это тупо примеры
A64m
запускает ghci, загружает в него файл, вырезает из комментариев код, запускает, сравнивает выхлоп с тем что в комментариях
A64m
так и работает
Leonid 🦇
@qnikst А вы не забыли в слайдах аннотации типов проставить в этот раз? :)
Alexander
а у меня кода почти и нету
Alexander
вообще какой-то блаблабла получается :((
Leonid 🦇
норм