ещё List.Transform сделать самописную 😅 Тестировал на примере из справки
let
ListTransform = ( list as list, function as function ) => let
iterate = each let
this = list{ _ }?
in if this = null then {}
else { function( this ) } & @iterate( _ + 1 )
in iterate( 0 ),
Test = ListTransform( { 1..19 }, each _* 3 ),
ListGenerate = (
initial as function,
condition as function,
next as function,
optional selector as function
) => let
iterate = each
if condition( _ )
then { _ } & @iterate( next( _ ) )
else {}
in if selector = null
then iterate( initial() )
else ListTransform( iterate( initial() ), selector ),
test = ListGenerate(() => 10, each _ > 0, each _ - 1),
test2 = ListGenerate(() => [x = 1, y = {}], each [x] < 10, each [x = List.Count([y]), y = [y] & {x}], each [x])
in
test2
прикольно! ща помучаю могу предложить добавить пост в ГостевойТанк
пример отрабатывает, но при увеличении массива или усложнении функций обваливает стек, в отличие от штатной - надо поковырять, затея-то интересная )))
Рекурсия создает кучу контекстов вызовов, скорее всего заканчивается память и стек переполняется. Думаю, что существенного улучшения не получится. Оригинальные функции наверняка работают без рекурсий) Этот пример разве что в чисто образовательных целях, что в некоторых ситуациях можно обойтись одними операторами😅
это понятно, было интересно насколько хватит - Traform проглотил список из 999, на 9999 уже упал; Generate на таких объемах уходит в закат - честно лень было ждать, прибил процесс но предложение по публикации в Танке в силе - именно в учебных целях )))
Обсуждают сегодня