Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
а сколько этот язык К стоит? в ссылке про 150тыс$ говорится про стоимость программирования на нем, за 200кб кода, а сам язык чо-то не вижу где стоимость.
а сколько этот язык К стоит? в ссылке про 150тыс$ говорится про стоимость программирования на нем, за 200кб кода, а сам язык чо-то не вижу где стоимость.
|
|
|
|
Добавлено: Пт авг 15, 2008 19:49 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
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 для разных ОС )
[quote="VshMt"][quote="profiT"]при желании, все ещё можно найти доступную для скачивания версию K[/quote] А может ссылку? А то я чего-то накачал, но пока не ковырялся....[/quote]
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 для разных ОС )
|
|
|
|
Добавлено: Чт авг 14, 2008 09:33 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Блог "Русский перевод словаря языка J"
http://dr-klm.livejournal.com/81190.html?thread=1098790
и архив с переводом http://kinetic.ac.donetsk.ua/~metlov/dictionary/J_dictionary_RU.zip
|
|
|
|
Добавлено: Пн июл 21, 2008 11:30 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
|
|
|
Добавлено: Ср авг 01, 2007 22:11 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Мельком заглянув, случайно наткнулся на пример со сравнением производительности, 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
Что он делает -- не спрашивайте, не разбирал.
Цитата: А то я чего-то накачал, но пока не ковырялся...
В том то и суть что надо ковыряться. Или в частном порядке спросить у тех кто ковырялся сам.
Мельком заглянув, случайно наткнулся на пример со сравнением производительности, [url]http://kx.com/a/k/examples/pfc4.k[/url]:
[code] / 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[/code]
Что он делает -- не спрашивайте, не разбирал.
[quote]А то я чего-то накачал, но пока не ковырялся...[/quote]
В том то и суть что надо ковыряться. Или в [u]частном порядке[/u] спросить у тех кто ковырялся сам.
|
|
|
|
Добавлено: Чт май 10, 2007 16:46 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
profiT писал(а): при желании, все ещё можно найти доступную для скачивания версию K
А может ссылку? А то я чего-то накачал, но пока не ковырялся....
[quote="profiT"]при желании, все ещё можно найти доступную для скачивания версию K[/quote]
А может ссылку? А то я чего-то накачал, но пока не ковырялся....
|
|
|
|
Добавлено: Вс май 06, 2007 20:10 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Кстати, при желании, все ещё можно найти доступную для скачивания версию K...
Кстати, при желании, все ещё можно найти доступную для скачивания версию K...
|
|
|
|
Добавлено: Вт дек 26, 2006 20:59 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
насчет вывода в файл - я просто еще не знаю как это сделать
и потом - на что-то же тратится пол-секунды. кроме того, если сделать матрицы 700 на 700 то время увеличивается до 1,8 секунд. что вполне нормально
насчет вывода в файл - я просто еще не знаю как это сделать :)
и потом - на что-то же тратится пол-секунды. кроме того, если сделать матрицы 700 на 700 то время увеличивается до 1,8 секунд. что вполне нормально
|
|
|
|
Добавлено: Ср дек 20, 2006 00:06 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
а может он лениво не вычисляет побочный эффект без надобности ?
Что если результат вывести в файл, а вычисление по-сложней заделать..
а может он лениво не вычисляет побочный эффект без надобности ? ;)
Что если результат вывести в файл, а вычисление по-сложней заделать..
|
|
|
|
Добавлено: Вт дек 19, 2006 23:15 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
написал тупой тест:
код на си выполняется порядка 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.
написал тупой тест:
код на си выполняется порядка 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.
|
|
|
|
Добавлено: Вс дек 17, 2006 15:39 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
По поводу скорости я уже на всё, что нашёл давал ссылки. Ничего более конкретного я не видел.
Только, само собой, надо различать J и K.
J -- это практически mainstream, идеальная система для изучения в ВУЗах, например. OpenSource, отличная поставка дистрибутива, в составе две полноценные книжки по языку, словарь, пособие, туча примеров и интерактивные уроки. На скорость заточенности задачи там такой и не лежало...
K -- это уже hardcore, то есть "кому надо -- тот знает". Сурьезнейшая весчь, одна только уже озвученная в этой теме цена пакета чётко разграничивает.
По поводу этих обоих языков (там про K, правда, только мельком) есть же тоже уже данная ссылка: " Записки К.Л.М. - Язык программирования J, введение".
По поводу скорости я уже на всё, что нашёл [url=http://fforum.winglion.ru//viewtopic.php?p=4027#4027]давал ссылки[/url]. Ничего более конкретного я не видел.
Только, само собой, надо различать J и K.
J -- это практически mainstream, идеальная система для изучения в ВУЗах, например. OpenSource, отличная поставка дистрибутива, в составе две полноценные книжки по языку, словарь, пособие, туча примеров и интерактивные уроки. На скорость заточенности задачи там такой и не лежало...
K -- это уже hardcore, то есть "кому надо -- тот знает". Сурьезнейшая весчь, одна только уже озвученная в этой теме цена пакета чётко разграничивает.
По поводу этих обоих языков (там про K, правда, только мельком) есть же тоже уже данная ссылка: "[url=http://dr-klm.livejournal.com/42312.html]Записки К.Л.М. - Язык программирования J, введение[/url]".
|
|
|
|
Добавлено: Вс дек 17, 2006 13:37 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
а где можно посмотреть бенчмарки по J в сравнении с лиспом, си, фортом? чтобы конкретные цифры, алгоритмы...
а где можно посмотреть бенчмарки по J в сравнении с лиспом, си, фортом? чтобы конкретные цифры, алгоритмы...
|
|
|
|
Добавлено: Вс дек 17, 2006 12:26 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Нда, убийственно
А если написать тот же алгоритм простыми рускими словами — какой размер текста будет...
Нда, убийственно ;)
А если написать тот же алгоритм простыми рускими словами — какой размер текста будет...
|
|
|
|
Добавлено: Чт дек 14, 2006 00:04 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Разбор программы-парсер 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 как результат. / Результаты для каждой секции объединяются.
Разбор программы-парсер ini-файлов. Оригинал взят отсюда: "[url=http://community.livejournal.com/ru_declarative/24574.html]Распарсить INI файл на K[/url]".
[code] 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 как результат. / Результаты для каждой секции объединяются. [/code]
|
|
|
|
Добавлено: Пн дек 11, 2006 17:36 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
В общем достоинств много и кое-что было бы приятно иметь и в фортике
есть один товарищ http://www.nsl.com который на К пишет интерпретаторы
(например F, XY, cK) Вот бы еслиб ближе к форт синтаксису и семантике ...
А так приходится думать о К как о спецпроцессоре для форта, т.е. если надо БД
или векторы то сообщение ему и ждать ответа. Есть у меня набросок такой консоли
из форта строку в К а он результат обратно, ну и наоборот из К в сторону форта.
В общем достоинств много и кое-что было бы приятно иметь и в фортике
есть один товарищ http://www.nsl.com который на К пишет интерпретаторы
(например F, XY, cK) Вот бы еслиб ближе к форт синтаксису и семантике ...
А так приходится думать о К как о спецпроцессоре для форта, т.е. если надо БД
или векторы то сообщение ему и ждать ответа. Есть у меня набросок такой консоли
из форта строку в К а он результат обратно, ну и наоборот из К в сторону форта.
|
|
|
|
Добавлено: Пт ноя 17, 2006 14:34 |
|
|
|
|