LINUX.ORG.RU

Функциональный tcl

 ,


1

2

зарелизил элементы ФП в Tcl. Представлены :

  • Функции высшего порядка filter,fold,map,merge
  • Композиция chain
  • Ленивые вычисления lazy
  • Каррирование curry и realcurry
  • Мемоизация memoize
  • всякие мелочи
    • zip транспонирование списков
    • range генерация последовательностей
    • ldiv lmod деления списков на части

по сравнению с пред.анонсом сделан окончательный выбор варианта синтаксиса в сторону уменьшения числа скобок :) Часть функционала реализована на C. Есть незначительный дегрейд - временно удалёна compose (позже верну) и сахара тоже стало меньше.

проект живёт на assembla.com https://www.assembla.com/spaces/tclamba/wiki, Инструкции по использованию соотв. https://www.assembla.com/spaces/tclamba/wiki/HOWTO

В будущем стоит ожидать

  • комбинаторы S K и прочие; реализуются они не сложно, просто пока нет настроя их делать
  • паралелльные вычисления в союзе с tpool
  • возможно macro и pattern-функции

заодно и вопрос - какие ещё бывают полезные фичи, которых может нехватать в tcl? например из пролога :) или ещё откуда..

★★★★★

(с Tcl совершенно не знаком - поэтому может оказаться, что фигню какую-то предлагаю)

У меня есть такое предложение. Как понимаю, Tcl связано с GUI, а для него оказалась очень полезной модель событий (events) как в .NET. В Java Swing и Java SWT/JFace есть похожие вещи, но на мой взгляд события из .NET выглядят интереснее и сами по себе, и в свете ФП. И вот почему.

В F# объект event может быть неявно преобразован в IObservable. В общем, это позволяет рассматривать событие как функциональный объект. Можно определить map, filter, merge и другие функции.

По сему предлагаю задуматься над добавлением event и IObservable. На мой взгляд это будет удачным и _практичным_ применением идей ФП к задаче построения GUI.

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 2)

автор этой хрени здесь в том числе обитает.

anonymous
()

У вас там, как я понял такой синтаксис, например: map here is a command {this is a list}. Если так то это просто имитация нормальных лямбд, т.к. нельзя писать map [get_a_lambda] {this is a list}, т.к. все, что вернет get_a_lambda будет первым параметром map.

Что вам надо, так это запилить функцию apply {expression} {list}. Остальное легко сделать из apply.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

У вас там, как я понял такой синтаксис, например: map here is a command {this is a list}. Если так то это просто имитация нормальных лямбд, т.к. нельзя писать map [get_a_lambda] {this is a list}, т.к. все, что вернет get_a_lambda будет первым параметром map.

а всё так и сделано :)

puts [ map expr 2 + { 1 2 3 } ]
puts [ map {expr 2+} { 1 2 3} ]
puts [ map {expr 2 +} { 1 2 3 } ]
puts [ map [ lambda { x y } { expr $x + $y } ] 2 { 1 2 3 } ]
puts [ map lambda { x y } { expr $x + $y} 2 { 1 2 3 } ]
3 4 5
3 4 5
3 4 5
3 4 5
3 4 5
MKuznetsov ★★★★★
() автор топика
Ответ на: комментарий от no-such-file

или имеется в виду сделать нечто вроде

proc foo { expression k } {
  [ expression ] $k
} 
чтобы получалось
proc bar {} {
  lambda { x } { expr $x * 2 }
}
map foo bar { 1 2 3 }
#= 2 4 6
??

MKuznetsov ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.