Bonart
хотя в го ничего нет кроме горутин
Сборщик мусора. Прожорливый, тормозной... но с минимальными паузами
Диёр
Ну тип тебе на это в 99% случаев фиолетово будет что там вообще с гц
Диёр
У меня со старой работы техдир говорит что приложение на го будет работать как часы Я считаю что приложение на го упадёт от любого чиха
Диёр
На одном из собесов мне тимлид, который проводил собес, сказал что они со своей версией компилятора столкнулись с багой, когда при анлоке свободного мьютекса у тебя приложение просто выкидывает панику, которая не ловится через дефер-рекавер и приводит к падению приложения. При этом у них не было инструмента статического анализа кода, который мог бы такие моменты в коде указать.
Диёр
Неа
habib
я тут сниппет накатал. может кто помочь с ревью? http://fssnip.net/7Wx
Vasily
Причем ты его где-то используешь, где-то нет
habib
Option.ofNullable вроде есть
ты имеешь в виду, чтоб вместо Value|Null его использовал?
Vasily
Ну в теории можно
Vasily
Ваще, вся разлюли малина с ретурнами пишется проще
Vasily
startDate|>Option.map (fun d->(fun date->d&&date))q
Vasily
Для endDate аналогично
Vasily
ПОтом тупой фолд списка
habib
понятно
Vasily
Т.е. получаешь лист функций, надо зафолдить в функцию
Vasily
Начальное состояние по идее fun d->true
Vasily
Но тут надо подумать
habib
это прокатит сишарп экспрешнами?
Vasily
Ну у тебя будет просто fun
Vasily
Наружу
Vasily
Он же лямбда по идее
Vasily
в фолде возвращаешь fun d-> acc d && f d
habib
а, так не выйдет
habib
невалидный экспрешн получится
habib
ну, и с поинт-фри лямбдой тоже
Vasily
Тогда квотейшнами надо
Vasily
И там есть преобразователь квотейшнов в Linq
Vasily
Для того, чтобы получились квотейшны на выходе билдера, надо Quote задать операцию
habib
да, хотел так сделать, но код усложнится
Vasily
Ваще, канеш, надо саммонить @omgszer
habib
вообще, можно в билдере разрулить, насколько я понял, но дальше не копал
habib
с квотейшенами*
Vasily
Ну да, прямо на выходе получать что надо
habib
ладно. спаcибо за помощь @vshapenko
Андрей
module Nullable = let map f (n : 'a Nullable)= if n.HasValue then Nullable(f n.Value) else Nullable()
habib
в начале, я почти так и написал, потом переписаль на опшн-мап только вместо Nullabe() использвал Unchecked.defaultof<_>, но потом понял, что можно дефолтный конструктор использвать
habib
вот
habib
http://fssnip.net/7Wx
habib
новая версия
habib
* вообще, мне более-менее прозрачный интероп с сишарповкими экспрешнами нужен был
Vasily
Во-первых, что имеется в виду под экспрешнами
habib
Expression<Func<>>
Vasily
Ну в твоем коде возвращается что-то другое
habib
getDateRangePredicate date2 date2;; val it : Expression<Func<DateTimeOffset,bool>> = date => ....
Vasily
Дык а чем мой метод со склеиванием функций тогда плох, непонятно
habib
там инвоки будут и в итоге обвалится при генерации сиквел-запроса
Vasily
Для SQl смотри query builder
Vasily
https://msdn.microsoft.com/visualfsharpdocs/conceptual/linq.querybuilder-class-%5bfsharp%5d
Vasily
Вот это прям вот оно
Vasily
https://docs.microsoft.com/ru-ru/dotnet/fsharp/language-reference/query-expressions
Vasily
Все уже написано до нас
Hog
Так executeTransaction с параметрами.
не уверен про его кишочки, как он там prepare вызывает и вызывает ли. но вот ща потестил 1.10.0 - INSERT INTO table (name) VALUES (@val) - фейлится если перед executeNonQuery поставить prepare. Причём с очень странной ошибкой - column "name" doesn't exist - а такое поле есть :) добавляешь NpgsqlLogManager.Provider <- ConsoleLoggingProvider(NpgsqlLogLevel.Debug) и в логе видно, что не может сделать prepare. 1.11.0 с моим фиксом - работает.
Hog
Все уже написано до нас
а как же - "творческая профессия" и всё такое? :)
Vasily
а как же - "творческая профессия" и всё такое? :)
https://github.com/fsprojects/Fabulous/issues/518 Творчество у нас теперь такое
Диёр
а как же - "творческая профессия" и всё такое? :)
месяцами сидеть чужое говно ковырять
Диёр
вот это творчество
Vasily
Не,ну что ебануло,в целом понятно
Hog
ты б его в ``` завернул
Hog
а то плохо читается
Hog
если ты знаешь, в чём приблизительно дело - мож как-то самому пофиксить, а потом пулреквест?
Hog
вот, у меня вчера необъяснимое говно с постресом возникло - пофиксил - отправил - сёня с утра новая версия и всё ништяк
Vasily
Ну надо лезть в код
Vasily
А мне лень
Ayrat
я тут сниппет накатал. может кто помочь с ревью? http://fssnip.net/7Wx
type Range = static member Expr (?start, ?finish) = match start, finish with | Some start, Some finish -> <@ fun date -> date >= start && date < finish @> | Some start, None -> <@ fun date -> date >= start @> | None, Some finish -> <@ fun date -> date < finish @> | None, None -> <@ fun _ -> true @> static member ToCSharpExpr (expr: Expr<'a -> bool>) = let rec translateBody = function //static method call | Patterns.Call(None, mi, args) -> let argsExpr = Seq.map translateBody args Expression.Call(mi, argsExpr) 😆 Expression //variable call | Patterns.Var x -> Expression.Variable(x.Type, x.Name) 😆 Expression //constant call | Patterns.ValueWithName (v, t, _) | Patterns.Value (v, t) -> Expression.Constant(v, t) 😆 Expression //if then else | Patterns.IfThenElse (e1, e2, e3) -> Expression.Condition(translateBody e1, translateBody e2, translateBody e3) 😆 Expression | expr -> failwithf "unsupported expr. Add more stuff here for %A\n\n" expr match expr with | Patterns.Lambda (var, expr) -> let paramExpr = Expression.Parameter(var.Type, var.Name) let bodyExpr = translateBody expr Expression.Lambda<Func<'a, bool>>(bodyExpr, paramExpr) | _ -> failwith "unexpected expression" юзать так Range.Expr() |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(finish = now) |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(start = now) |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(start = now, finish = now) |> Range.ToCSharpExpr |> printfn "%A" продуцирует сразу экспрешны сишурупа
Hog
type Range = static member Expr (?start, ?finish) = match start, finish with | Some start, Some finish -> <@ fun date -> date >= start && date < finish @> | Some start, None -> <@ fun date -> date >= start @> | None, Some finish -> <@ fun date -> date < finish @> | None, None -> <@ fun _ -> true @> static member ToCSharpExpr (expr: Expr<'a -> bool>) = let rec translateBody = function //static method call | Patterns.Call(None, mi, args) -> let argsExpr = Seq.map translateBody args Expression.Call(mi, argsExpr) 😆 Expression //variable call | Patterns.Var x -> Expression.Variable(x.Type, x.Name) 😆 Expression //constant call | Patterns.ValueWithName (v, t, _) | Patterns.Value (v, t) -> Expression.Constant(v, t) 😆 Expression //if then else | Patterns.IfThenElse (e1, e2, e3) -> Expression.Condition(translateBody e1, translateBody e2, translateBody e3) 😆 Expression | expr -> failwithf "unsupported expr. Add more stuff here for %A\n\n" expr match expr with | Patterns.Lambda (var, expr) -> let paramExpr = Expression.Parameter(var.Type, var.Name) let bodyExpr = translateBody expr Expression.Lambda<Func<'a, bool>>(bodyExpr, paramExpr) | _ -> failwith "unexpected expression" юзать так Range.Expr() |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(finish = now) |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(start = now) |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(start = now, finish = now) |> Range.ToCSharpExpr |> printfn "%A" продуцирует сразу экспрешны сишурупа
Ayrat
Ебаная макось
Hog
Какая экспрессия!
Ayrat
да и хуй с ним!
Ayrat
везде где смайлик - оператор апкаста. Двоеточие+больше
Ayrat
Так как билдер продуцирует сразу F# экспрешны, можно и через билдер
Aleksandr
type Range = static member Expr (?start, ?finish) = match start, finish with | Some start, Some finish -> <@ fun date -> date >= start && date < finish @> | Some start, None -> <@ fun date -> date >= start @> | None, Some finish -> <@ fun date -> date < finish @> | None, None -> <@ fun _ -> true @> static member ToCSharpExpr (expr: Expr<'a -> bool>) = let rec translateBody = function //static method call | Patterns.Call(None, mi, args) -> let argsExpr = Seq.map translateBody args Expression.Call(mi, argsExpr) 😆 Expression //variable call | Patterns.Var x -> Expression.Variable(x.Type, x.Name) 😆 Expression //constant call | Patterns.ValueWithName (v, t, _) | Patterns.Value (v, t) -> Expression.Constant(v, t) 😆 Expression //if then else | Patterns.IfThenElse (e1, e2, e3) -> Expression.Condition(translateBody e1, translateBody e2, translateBody e3) 😆 Expression | expr -> failwithf "unsupported expr. Add more stuff here for %A\n\n" expr match expr with | Patterns.Lambda (var, expr) -> let paramExpr = Expression.Parameter(var.Type, var.Name) let bodyExpr = translateBody expr Expression.Lambda<Func<'a, bool>>(bodyExpr, paramExpr) | _ -> failwith "unexpected expression" юзать так Range.Expr() |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(finish = now) |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(start = now) |> Range.ToCSharpExpr |> printfn "%A" Range.Expr(start = now, finish = now) |> Range.ToCSharpExpr |> printfn "%A" продуцирует сразу экспрешны сишурупа
Что за 😆?
Aleksandr
Я предположил, но у меня телеграм не заменяет
Aleksandr
:> на смайлик
Крылатый
:>
:>