Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 18:22

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пн дек 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 как результат.
/ Результаты для каждой секции объединяются.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 14, 2006 00:04 
Нда, убийственно ;)

А если написать тот же алгоритм простыми рускими словами — какой размер текста будет...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс дек 17, 2006 12:26 
а где можно посмотреть бенчмарки по J в сравнении с лиспом, си, фортом? чтобы конкретные цифры, алгоритмы...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс дек 17, 2006 13:37 
По поводу скорости я уже на всё, что нашёл давал ссылки. Ничего более конкретного я не видел.

Только, само собой, надо различать J и K.

J -- это практически mainstream, идеальная система для изучения в ВУЗах, например. OpenSource, отличная поставка дистрибутива, в составе две полноценные книжки по языку, словарь, пособие, туча примеров и интерактивные уроки. На скорость заточенности задачи там такой и не лежало...

K -- это уже hardcore, то есть "кому надо -- тот знает". Сурьезнейшая весчь, одна только уже озвученная в этой теме цена пакета чётко разграничивает.

По поводу этих обоих языков (там про K, правда, только мельком) есть же тоже уже данная ссылка: "Записки К.Л.М. - Язык программирования J, введение".


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс дек 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.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 19, 2006 23:15 
а может он лениво не вычисляет побочный эффект без надобности ? ;)
Что если результат вывести в файл, а вычисление по-сложней заделать..


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 20, 2006 00:06 
насчет вывода в файл - я просто еще не знаю как это сделать :)
и потом - на что-то же тратится пол-секунды. кроме того, если сделать матрицы 700 на 700 то время увеличивается до 1,8 секунд. что вполне нормально


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 26, 2006 20:59 
Кстати, при желании, все ещё можно найти доступную для скачивания версию K...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс май 06, 2007 20:10 
Не в сети

Зарегистрирован: Вс май 06, 2007 02:13
Сообщения: 43
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
profiT писал(а):
при желании, все ещё можно найти доступную для скачивания версию K

А может ссылку? А то я чего-то накачал, но пока не ковырялся....

_________________
А в попугаях я умнее - целых 38!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт май 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


Что он делает -- не спрашивайте, не разбирал.


Цитата:
А то я чего-то накачал, но пока не ковырялся...

В том то и суть что надо ковыряться. Или в частном порядке спросить у тех кто ковырялся сам.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 01, 2007 22:11 
---


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июл 21, 2008 11:30 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Блог "Русский перевод словаря языка J"

http://dr-klm.livejournal.com/81190.html?thread=1098790

и архив с переводом http://kinetic.ac.donetsk.ua/~metlov/di ... ary_RU.zip


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 14, 2008 09:33 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
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 для разных ОС )


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 15, 2008 19:49 
Не в сети

Зарегистрирован: Пт авг 01, 2008 02:20
Сообщения: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
а сколько этот язык К стоит? в ссылке про 150тыс$ говорится про стоимость программирования на нем, за 200кб кода, а сам язык чо-то не вижу где стоимость.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB