Forth http://fforum.winglion.ru/ |
|
Язык программирования K http://fforum.winglion.ru/viewtopic.php?f=4&t=320 |
Страница 2 из 2 |
Автор: | profiT [ Пн дек 11, 2006 17:36 ] |
Заголовок сообщения: | |
Разбор программы-парсер ini-файлов. Оригинал взят отсюда: "Распарсить INI файл на K". Код: ini:0:`test.ini / записываем в текстовую переменную содержимое текстового файла test.ini
/ при этом в переменную пишется список строк, где каждому элементу соотв-т строка в текстовом файле ini_tree:{r:(0 1) _ x; r[1]:{x[0]:(-1 _ x[0]); x}'{(0,1+x?"=") _ x}'r[1]; r}'(&{~~((1+x?"[")_ x)?"]"}'ini2) _ ini2:{x[&{~1>#x}'x]}[ini] / Разглядывать функции K нужно иерархически, по скобкам (круглым, / фигурным и квадратным), а внутри скобок нужно смотреть от конца к началу: / ini_tree: -- присваивание переменной ini_tree вычисляемого значения. / ini2:{x[&{~1>#x}'x]}[ini] -- смотрим этот кусок. / ini2: { ... }[ini] -- вычисление функции в фигурных скобках с аргументом ini / Обратите внимание что путём подстановки аргументом функции списка в языке K / делается цикл for each, с одновременным суммированием результата в каждой / итерации. / {~1>#x}'x -- цикл по строкам x (в ini) / ~1>#x -- выдаёт список логических значений (нулей или единиц), соотв-х больше ли длина строки чем 1 символ / &{ ~1>#x }'x -- вычисление индексов тех непустых (длина больше чем 1) строк. / x[ &{~1>#x}'x ] -- из списка x берём только непустые строки, то есть: / если x=("343" "343" "" "1"), то &{~1>#x}'x будет равно (0 1 3), и / будет считаться x[0 1 3], а это равно ("343" "343" "1") / Таким образом в ini2 у нас все непустые строки текстового файла test.ini / (&{~~((1+x?"[")_ x)?"]"}'ini2) _ ini2:{x[&{~1>#x}'x]}[ini] -- это бинарная операция _ / Второй операнд мы только что разбирали. Его результат -- список непустых строк из / файла. Присваивание списка переменной ini2 тут побочным эффектом, присвоенное значение / идёт дальше. / (&{~~((1+x?"[")_ x)?"]"}'ini2) -- смотрим этот кусок. / ini2 -- берём значение переменной только что сохранённой побочным эффектом / { ... }'ini2 -- и опять применение безымянной подфункции к аргументу ini2 (то есть for each) / ~~((1+x?"[")_ x)?"]" -- здесь размечено скобками, первым будет: / 1+x?"[" -- выдаёт 1+положение первого символа "[" в строке x (которая ходит по строкам ini2) / ( 1+x?"[" )_ x -- выводит отрезок строки после первого символа "[" / Обратите внимание что операция ? в случае если символа в строке не было, то он выводит не / -1, например, а длину строки, в которой был поиск. Поэтому для строк где не было символа / "[" кусок (1+x?"[")_ x даст пустую строку. / ((1+x?"[")_ x)?"]" -- даёт позицию символа "]" в отрезке строки после символа "[" / ~~ ((1+x?"[")_ x)?"]" -- двумя логическими отрицаниями приводим числа к логическим 1/0 / (& {~~((1+x?"[")_ x)?"]"}'ini2 ) -- операция & превращает набор логических значений в / список индексов чьи значения верны, то есть выдаёт номера строк заголовков ограниченных в / строке квадратными скобками. / Теперь возвращаемся к бинарному выражению: / (&{~~((1+x?"[")_ x)?"]"}'ini2) _ ini2:{x[&{~1>#x}'x]}[ini] / что тоже самое что и / (&{~~((1+x?"[")_ x)?"]"}'ini2) _ ini2 / Так как результатом первого операнда становится номера строк-заголовков, / выражение выдаст нам списки строк *между* строками-заголовками. / Это надо допояснить: / 1_ 10 20 30 40 50 вычисляет 20 30 40 / но 1 3 _ 10 20 30 40 50 выводит ( (20 30) (40 50) ) / То есть операция _ делит правый операнд индексами из первого операнда, / и выводит разбитые куски, исключая первый: / 10 | 20 30 | 40 50 / 1 3 / Мы уже разделили ini файл по секциям, результат пока примерно такой: / ( ("[Section1]" "a=1" "b=2" "c=3") ("[Section2]" "b=3") ) / Этот промежуточный результат операцией ' применяется к этой функции: / {r:(0 1) _ x; r[1]:{x[0]:(-1 _ x[0]); x}'{(0,1+x?"=") _ x}'r[1]; r} / Функция пробегает по каждой секции. / Операция ; является аналогом ЛИСПовской функции do, которая выполняет / свои аргументы, а результатом выдаёт результат вычисления последнего. / Поэтому вычисление этой функции состоит их последовательного вычисления / трёх операций разделённых точкой с запятой, последняя выводит результат. / r:(0 1) _ x -- присвоение списку r двух значений, r[0]=x[0], а r[1]=x[1...] / То для первого элемента из примера выше r будет равно / ( ("[Section1]") ("a=1" "b=2" "c=3") ) / Первый элемент -- название секции, второй -- строки в секции. / r[1]:{x[0]:(-1 _ x[0]); x}'{(0,1+x?"=") _ x}'r[1] / {(0,1+x?"=") _ x}'r[1] -- цикл по строкам (второй элемент списка r) в секции / (0,1+x?"=") _ x -- каждую строчку делим на два отрезка: до символа "=" / (с ним самим), и после него "=". / {x[0]:(-1 _ x[0]); x} применяется к уже разделённым строчкам: / Операция _ с отрицательным левым операндом делает тоже самое, только / индекс отсчитывается от конца списка, поэтому -1 _ x[0] уберёт последний / символ первого элемента списка x (а это будет "=" который надо убирать). / Третье дейтсвие после ; просто выводит временную r как результат. / Результаты для каждой секции объединяются. |
Автор: | rvm [ Чт дек 14, 2006 00:04 ] |
Заголовок сообщения: | |
Нда, убийственно А если написать тот же алгоритм простыми рускими словами — какой размер текста будет... |
Автор: | baleog [ Вс дек 17, 2006 12:26 ] |
Заголовок сообщения: | |
а где можно посмотреть бенчмарки по J в сравнении с лиспом, си, фортом? чтобы конкретные цифры, алгоритмы... |
Автор: | profiT [ Вс дек 17, 2006 13:37 ] |
Заголовок сообщения: | |
По поводу скорости я уже на всё, что нашёл давал ссылки. Ничего более конкретного я не видел. Только, само собой, надо различать J и K. J -- это практически mainstream, идеальная система для изучения в ВУЗах, например. OpenSource, отличная поставка дистрибутива, в составе две полноценные книжки по языку, словарь, пособие, туча примеров и интерактивные уроки. На скорость заточенности задачи там такой и не лежало... K -- это уже hardcore, то есть "кому надо -- тот знает". Сурьезнейшая весчь, одна только уже озвученная в этой теме цена пакета чётко разграничивает. По поводу этих обоих языков (там про K, правда, только мельком) есть же тоже уже данная ссылка: "Записки К.Л.М. - Язык программирования J, введение". |
Автор: | baleog [ Вс дек 17, 2006 15:39 ] |
Заголовок сообщения: | |
написал тупой тест: код на си выполняется порядка 2 секунд. если прибавить выделение памяти и рандомную инициализацию то 2.3. код на j 0.5 секунды. откуда такой выигрыш в скорости?? или я неправильно написал тест? j -- a =: ?500 500 $ 10 b =: ?500 500 $ 10 10 (6!:2) 'a +/ . * b' = 0.530212 -- c // ... #define nmax 5e+2 gettimeofday(&tv,NULL); sec1 = tv.tv_sec; usec1 = tv.tv_usec; for(i = 0; i < nmax; ++i) { for(j = 0; j < nmax; ++j) { s = 0; for(k = 0; k < nmax; ++k) { s += a[i][k] * b[k][j]; } c[i][j] = s; } } gettimeofday(&tv,NULL); printf("calc: %d\n",(tv.tv_sec-sec1)*1000000+(tv.tv_usec-usec1)); // ... = calc: 1986780 calc: 1989703 calc: 2030849 etc. |
Автор: | rvm [ Вт дек 19, 2006 23:15 ] |
Заголовок сообщения: | |
а может он лениво не вычисляет побочный эффект без надобности ? Что если результат вывести в файл, а вычисление по-сложней заделать.. |
Автор: | baleog [ Ср дек 20, 2006 00:06 ] |
Заголовок сообщения: | |
насчет вывода в файл - я просто еще не знаю как это сделать и потом - на что-то же тратится пол-секунды. кроме того, если сделать матрицы 700 на 700 то время увеличивается до 1,8 секунд. что вполне нормально |
Автор: | profiT [ Вт дек 26, 2006 20:59 ] |
Заголовок сообщения: | |
Кстати, при желании, все ещё можно найти доступную для скачивания версию K... |
Автор: | VshMt [ Вс май 06, 2007 20:10 ] |
Заголовок сообщения: | |
profiT писал(а): при желании, все ещё можно найти доступную для скачивания версию K
А может ссылку? А то я чего-то накачал, но пока не ковырялся.... |
Автор: | profiT [ Чт май 10, 2007 16:46 ] |
Заголовок сообщения: | |
Мельком заглянув, случайно наткнулся на пример со сравнением производительности, http://kx.com/a/k/examples/pfc4.k: Код: / http://www.kuro5hin.org/story/2002/6/25/122237/078
/ find one-letter change paths for the following x:(`make`love;`bread`wheat;`resist`futile;`effaces`cabaret `wood`fire;`climb`rocks;`stones`chisel;`amperes`voltage) / words grouped by count \t W@:8#{((=x),,!0)u?/:!1+|/u:?x}@#:'W:0:"word.lst" / graphs from equivalence classes of one-letter deletes `an`in<`n<`an`in \t G:{(?,/@[n#,!0;x;,;!n:#x]@)'x:+{x?/:x:26 _sv 1_ x}'(1!)\_ic+x}'W / f-path to x from y http://kx.com/a/k/examples/graph.k (f-path to x from y) p:{[f;x;y]:[#*y:|{(#y)&~x _in y}[x]{_dvl[?,/f x]v,:x}\y,v::();x{y@*&x _in/:f y}\1_ y;()]} / wrapper W:`$W;P:{W[n] p[G[n]]. W[n:#$*x]?/:x} \t P'x / cache results A:B:();C:{:[(x@:<x)_in A;B A?x;*|B,:,P@*|A,:,x]} \t C't,|:'t:x,x,x,x \ lines sec(1.47GHZ) K 4 .8 C++ 375 3 C# 425 45 Java 431 10 Что он делает -- не спрашивайте, не разбирал. Цитата: А то я чего-то накачал, но пока не ковырялся...
В том то и суть что надо ковыряться. Или в частном порядке спросить у тех кто ковырялся сам. |
Автор: | profiT [ Ср авг 01, 2007 22:11 ] |
Заголовок сообщения: | |
--- |
Автор: | Kopa [ Пн июл 21, 2008 11:30 ] |
Заголовок сообщения: | |
Блог "Русский перевод словаря языка J" http://dr-klm.livejournal.com/81190.html?thread=1098790 и архив с переводом http://kinetic.ac.donetsk.ua/~metlov/di ... ary_RU.zip |
Автор: | Kopa [ Чт авг 14, 2008 09:33 ] |
Заголовок сообщения: | |
VshMt писал(а): profiT писал(а): при желании, все ещё можно найти доступную для скачивания версию K А может ссылку? А то я чего-то накачал, но пока не ковырялся.... http://kx.com/developers/software/windows.zip ( для Windows ~100Kб) http://kx.com/developers/software/linux.zip ( для Linux ) ... Тип лицензии http://www.kx.com/developers/license2.php ( cо страницы лицензии можно перейти к загрузке K для разных ОС ) |
Автор: | victor79 [ Пт авг 15, 2008 19:49 ] |
Заголовок сообщения: | |
а сколько этот язык К стоит? в ссылке про 150тыс$ говорится про стоимость программирования на нем, за 200кб кода, а сам язык чо-то не вижу где стоимость. |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |