
Shorty(Ale Chapa) Manskiy
19.04.2018
08:42:56
они там будут сверху, а не снизу. Так же?

Aleksey
19.04.2018
08:44:51
foo =
let
bar x = x * 2
in bar 42
vs
foo = bar 42
where
bar x = x * 2
никакой разницы между "сверху" и "снизу" с точки зрения тестирования

Shorty(Ale Chapa) Manskiy
19.04.2018
08:44:52
вот про что я:

Google

Shorty(Ale Chapa) Manskiy
19.04.2018
08:44:52
сложнее, три однострочника с сигнатурами все читаются, а иерархическая структура позволяет не читать то, что не надо, пока не разбираешься в конкретных деталях
если все функции топлевелные - трудно понять что можно не читать

Aleksey
19.04.2018
08:45:22
Все лиспы, например

Ilya
19.04.2018
08:45:39
покажи как?
def sum(x, y):
def sum_x(z):
return x+z
return sum_x(y)
print(sum(4,5))

Aleksey
19.04.2018
08:45:56
^ это "let" по питонячьи :)

Shorty(Ale Chapa) Manskiy
19.04.2018
08:46:37

Aleksey
19.04.2018
08:47:08
Разницы с точки зрения тестирования нет.

Ilya
19.04.2018
08:47:27

Shorty(Ale Chapa) Manskiy
19.04.2018
08:47:40

Aleksey
19.04.2018
08:47:51
Да блин!

Shorty(Ale Chapa) Manskiy
19.04.2018
08:48:02
про это я и говорю.

Aleksey
19.04.2018
08:48:04
Мы про читаемость, мифические 10 порядков, или всё же про тестирование?

Google

Shorty(Ale Chapa) Manskiy
19.04.2018
08:49:04
я не хочу писать непонятный код.
я хочу писать тестируемый код.
Но вот мои "хотелки" не совместимы, оказывается.

Aleksey
19.04.2018
08:50:09
Как тестировать вложенную функцию без контекста, который она замыкает?

Ilya
19.04.2018
08:50:15
Что-то о пустом говорим. Содержательно было бы, если бы ты показал, как в других языках тестируют функции внутри let/where, а вот в хаскеле типа так нельзя

Dmitry
19.04.2018
08:50:34
хорошая читаемость заменяет тестирование ?

Aleksey
19.04.2018
08:50:49
Конечно нет
"Глаз замыливается" и прочие человеческие ошибки сильно понижают полезность "тестирования глазами"

Alexander
19.04.2018
08:51:02
лучший способ бесполезно увеличить sloccount

Dmitry
19.04.2018
08:51:48
Случайно наткнулся:
https://stackoverflow.com/jobs/173703/senior-haskell-software-developer-genius-for-secucloud
(Если не по правилам, скажите, я удалю)
Правда, удивляет: Role: System Administrator

Alexander
19.04.2018
08:52:16
а так взять вынес кучу примитивных комбинирубщих функций в топлевел, добавил бесполезных тестов и душа радуется
и метрики

A64m
19.04.2018
08:52:27

Ilya
19.04.2018
08:53:02
Где волшебным образом локальные функции покрываются юнит-тестами

Aleksey
19.04.2018
08:53:46
Можно взять язык, не умеющий в замыкания, но умеющий локальные функции :)

Shorty(Ale Chapa) Manskiy
19.04.2018
08:53:46

Aleksey
19.04.2018
08:54:12
Что-то тут переоценено
Либо читаемость, либо тестируемость

A64m
19.04.2018
08:54:26
ну и что волшебного, как это в принципе можно делать я выше писал, если это не работает, то это проблема конечно

Google

A64m
19.04.2018
08:55:05
(не для меня, правда, но это не важно)

Shorty(Ale Chapa) Manskiy
19.04.2018
08:55:13

Alexander
19.04.2018
08:55:29
на TH же можно наверняка

Shorty(Ale Chapa) Manskiy
19.04.2018
08:55:59

Alexander
19.04.2018
08:56:06
но вообще я не вижу большой необходимости в фиче
причем не ясно почему это недостаток, и.к. те кто хочет писать тесты на все такие функции могут это делать
причем их психологические проблемы не проецируются на всех программистов

Ilya
19.04.2018
08:57:52

Aleksey
19.04.2018
08:58:51
Если речь про анализ AST и подкладывание замыкаемых переменных, то это такое
Не стал бы таким пользоваться

A64m
19.04.2018
08:59:04

Ilya
19.04.2018
08:59:37

Aleksey
19.04.2018
09:00:05
"ну такое", как нынче говорят. Такое себе

Alexander
19.04.2018
09:02:46
и вперёд

A64m
19.04.2018
09:06:51

Alexander
19.04.2018
09:08:39
здесь говорили что вере плохо ведь непотестировать
вроде

A64m
19.04.2018
09:09:56
да, но и о том, чтоб локальных по смыслу функций на топлевеле не было
это тут не выполняется

Google

Leonid
19.04.2018
09:10:51

IC
19.04.2018
09:11:13
> Allow hyphenated (à la scheme) identifiers like example-identifier, which some of us prefer to uglyCamelCase.
?
на сколько это тяжелее парсить?

Leonid
19.04.2018
09:13:41
- - валидный оператор. и так от нетагивных целых литералов проблемы
т.е. foo - bar /= foo-bar

IC
19.04.2018
09:14:40
но в итоге это проблемы токенизатора ведь?

Leonid
19.04.2018
09:14:55
да. но главное токенизатор в головах!

Admin
ERROR: S client not available

IC
19.04.2018
09:15:30
кто не отделяет операторы пробелами в коде - тот токенизатор с проблемами!

Aleksey
19.04.2018
09:18:36
> :{
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"
Утро узнавания интересностей об отступах в хаскеле
let
x = let
y = 40
in
y + 1
z = 1
in
x + z

Denis
19.04.2018
09:19:17
du du hast

Yuuri
19.04.2018
09:40:39
Хм, а в TH можно сделать или имитировать, гм, "отложенную" вклейку? То есть сделать локально вроде
foo a b = bar b where
bar c = qux a
$(generateMockup 'bar)
и получить декларацию bar без замыканий где-то дальше на топлевеле.

Dmitry
19.04.2018
10:22:59
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]
декларации - только на top level

Yuuri
19.04.2018
10:24:59
А в Q нельзя какой-то custom state запихнуть, чтобы в конце файла извлечь?

IC
19.04.2018
10:26:58
@Yuu_chan какую задачу ты решаешь?

Alexander
19.04.2018
10:28:42
вообще есть запихивание функций в топлевел
в inline-java используется, но сходу не скажу как

Google

Denis
19.04.2018
10:30:48
https://wiki2.org/en/Lambda_lifting

Dmitry
19.04.2018
10:42:13
Наверное, на топлевел не написать $(generateMockup 'foo 'bar) так как `bar не определена. Зато можно, наверное, скажем, $(generateMockup 'foo 0) - первый из where. Только с замыканиями возиться надо
/stat@combot

Combot
19.04.2018
10:42:40
combot.org/chat/-1001043143583

Yuuri
19.04.2018
11:07:09

A64m
19.04.2018
11:30:07
проверил, работает
-- |
-- >>> :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

kana
19.04.2018
11:31:17
так-так-так, это что
я думал тесты через примеры в доке
очень крутая фича

Dmitry
19.04.2018
11:41:23
Я не понял. Что работает и что за фича? Это haddock что ли запускает?

A64m
19.04.2018
11:41:56
doctest

Sergey
19.04.2018
11:44:00
в эликсире такая тож из коробки есть

Yuuri
19.04.2018
11:44:12
И в rust

Sergey
19.04.2018
11:44:18
а, да кстати)

kana
19.04.2018
11:44:44
такая много где есть, но вот что она есть в хаскеле я даже не ожидал
даже не могу представить как она работает

Yuuri
19.04.2018
11:45:18
В хаскеле есть всё ?

A64m
19.04.2018
11:45:21
вы вчера тут скриншот доктеста из линз постили

kana
19.04.2018
11:45:38
ну я думал это тупо примеры

A64m
19.04.2018
11:48:13
запускает ghci, загружает в него файл, вырезает из комментариев код, запускает, сравнивает выхлоп с тем что в комментариях
так и работает