LINUX.ORG.RU

Новогоднее..Итераторы для Tcl

 happy new year, , ,


1

2

тут кто-то предлагал делиться новогодними подарками, ну так вот оно: https://chiselapp.com/user/nektomk/repository/fun/home.

выдалось время, набросал прототип итераторов в Tcl и даже слегка покрыл тестами. Пока-что это скажем так «api preview», то есть посмотреть/оценить насколько получается удобно и выразительно.

извините, из документации пока только cheats на основной странице, тесты и две «демки» в репозитарии;

# "lines of code" :-)
# iter`s concatenations demo
set loc [ fold { accum x } {
    # simple, count elements 
    incr accum
    # from other iterator
    # [] - combination sign
} 0 [] filter { x } {
    # filter elements
    set x [ string trim $x ]
    if { $x == {} || [ string index $x 0 ] == {#} } {
	# empty lines and lines started from # (comment)
	# wil drop
	return false
    }
    return true
    # from file
} <| $filename ]

Цель: чтобы удобно было писать на Tcl в функциональном стиле; В планах сделать внутри функциональную и комбинаторную оптимизацию.

в более дальних планах на следующий год: добавить операцию [] (та которая в функ. нотации точка по центру) уже непосредственно в парсер и исполнятор tcl.

★★★★★
Ответ на: комментарий от futurama

Это не то?

«это другое» (с) :-)

по ссылкам на wiki старое и не вполне пригодно..просто обсуждение или набор приёмов.

И потом у них подход более OO, а (на мой скромный взгляд) итераторы в анализе лучше определять как рекурсивные типы - тогда понятно где и почему они оптимизируются и как должны работать.

собственно потому и затеяна затейка - сделать классические итераторы, возможно ещё пару комбинаторов и уже внутри процедур проводить авто-композицию и оптимайзить.

но что греха таить - походу дела всплыла такая тьма мелких нюансов, что к начальной цели придётся идти мелкими шажками. Более плотно покрывать функционал тестами (сейчас порядка 60-ти, но явно нужно больше), потом с ними упрощать/обобщать действующий код, делить на уровни и только потом добраться до сладкого, до композитора :-)

на самом деле я доволен текущим результатом, потому-что прежняя N-летней давности попытка нормально внести функциональщину в Tcl запоролась по тех.ограничениям, а сейчас я их вроде как обошёл

MKuznetsov ★★★★★
() автор топика
Ответ на: комментарий от futurama

Мало чего понял. Я сисадмин, иногда пользую tcl/tk, но в классическом виде как есть.

пока доваривается холодец, попробую пояснить ближе к сисадминству :-)

итераторы можно объединять цепочками , близкая аналогия с шел: ls|sort|....

package require fun

## коллекция разных фильтров

# фильтр регулярных файлов
set PlainFiles { fun::filter { f } { puts "f=$f"; file isfile $f } }
# файлы моложе 1-го месяца
set OneMonthAge { fun::filter { f } { 
    set monthago  [ clock scan "-1  month" ]
    if { [ file mtime $f ] > [ clock scan "-1 month" ] } {
         return 1;
    }
    return 0
} }
# и так далее

## актуальный список фильтров 
set MyFilters [ list {*}$OneMonthAge [] {*}$PlainFiles ] 

# применяем
set lst [ {*}$MyFilters [] glob -nocomplain * ]

puts $lst

в текущем состоянии физически получается два цикла (список читается из glob, потом отсеиваются только регулярные файлы, потом из результата файлы моложе 1-го месяца..

а вообще цикл в итоге (уже явно с след.году) будет один - композиция двух последовательных фильтров объединяется.

MKuznetsov ★★★★★
() автор топика