Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт окт 13, 2026 05:44

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Язык программирования K
СообщениеДобавлено: Пт ноя 10, 2006 16:55 
Из того же семейства что и APL, A+, J.

Сайт производителя.
Краткое введение в язык (на буржуйском) и даже с картинками.
Обширная статья о нём: A Shallow Introduction to the K Programming Language.

С "сурьёзностью" у языка "усё-у-порядке": в списке клиентов сплошь банки да Уолл-стриты. Скорость исполнения зашкаливает. Краткость на уровне алгоритма zip (программы усыхают где-то на порядок, на два). Правда из-за этого и выглядят программы на нём очень безизбыточно, как алфавитно-цифровой мусор.

Дистрибутив так просто не скачать, надо их об этом вежливо попросить в личном обращении по электронной почте с этой странички.

Вот, накропал тут некоторую самоописательную вводную в язык:
Код:
2+2
/ вывод: 4

2+(1 2)
/ вывод: 3 4

/ можно и без скобок, тоже самое (в K справа налево):
2+1 2
/ вывод: 3 4


fact:{*/1+!x} / факториал x
/ fact -- функция. Тело её в фигурных скобках.
/ Через использованный x подразумевается что у функции есть один аргумент.
/ !x -- сделать список натуральных чисел от 0 до x-1
/ 1+!x -- прибавить к каждому элементу этого списка 1
/ */ -- умножение с модификатором, заставляет операцию встревать между
/ всеми поочерёдными элементами ряда:
/ */(1 2 3) означает 1*2*3
/ */1+!x -- перемножить между собой все элементы списка

/ проверка:
fact(3)
/ вывод: 6

/ можно без скобок:
fact 3
/ вывод: 6

fact' !10
/ выводит десять первых факториалов: 1 1 2 6 24 120 720 5040 40320 362880
/ !10 -- создаёт ряд натуральных чисел от 0 до 9
/ fact' -- для каждого элемента ряда применяет новосозданную функцию fact

isprime:{&/x!/:2_!x}
/ функция простейшей проверки на простое число.
/ !x -- ряд чисел

/ 2_!x -- убираем из этого ряда два первых элемента, то есть 0 и 1,
/ получается [2, ..., x-1]

/ !/: -- в этом случае ! означает уже определение остатка от деления, а /:
/ является модификатором действия, означающим множественное применение
/ правого операнда.

/ x!/:2_!x -- Операция у нас -- ! то есть определение остатка от деления.
/ Слева операнд только один -- само число x. Справа образовался ряд чисел.
/ Модификатор заставляет выполнять операцию для каждого элемента второго
/ операнда, сохраняя при этом первый операнд таким же.

/ После этой операции мы должны получить (для x=6):
/ ( (6 mod 5) (6 mod 4) (6 mod 3) ) => ( 1 2 0 )

/ &/ -- a&b находит минимум между двумя числами, поэтому в сочетании с
/ модификатором / & вычисляет минимум ряда.

/ &/x!/:2_!x находит минимум в этом ряду образованном остатками. Если это 0,
/ значит число x всё-таки на что-то поделилось нацело. Если минимум равен 1,
/ значит число -- простое, и ни на что не поделилось.

/ Обратите внимание на "в лоб"-овость реализации. Алгоритм выражается на
/ человеческом языке так: "чтобы проверить простое число или нет, надо
/ попробовать поделить его на что только можно, если на что-то оно поделится
/ без остатка, значит оно простое". На K эта фраза выглядит так:
/ isprime:{&/x!/:2_!x}

primes:{&isprime'!x} / выдаёт все простые числа, меньшие x
/ isprime'!x -- те кто не спал, читая предыдущие заметки, уже должны понять
/ что эта последовательность выдаст ряд нулей и единиц которые соответствуют
/ простоте их индекса. То есть isprime'!20 выдаст:
/ 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1
/ теперь нам чтобы превратить эти нули-единички в нужный нам набор чисел
/ надо использовать магическую функцию & . Нет, это уже другая функция &, не
/ та что использовалась в isprime. Там & был бинарный, а здесь он унарный,
/ у него только один операнд -- наш массив единиц и нулей. В этом случае
/ функция & делает очень интересную вещь: проходит по каждому элементу ряда,
/ и пишет в выходной ряд номер индекса каждого элемента столько раз сколько
/ стоит в соответствующей позиции ряда. То есть: &1 2 3 делает 0 1 1 2 2 2.
/ И так как наш ряд состоит только из нулей и единиц, то в результате мы
/ имеем список индексов ряда у которых значение было 1 (ведь нулевые элементы
/ в результат вообще не записались). А вспоминая, что значения в этом ряду
/ проставляются в зависимости от простоты индекса понимаем что получаем то
/ что дано в описании функции.


Кроме продемонстрированных в коде особенностей: заточенность на обработку массивов, модификаторов действий, отсутствие циклов язык K имеет также зависимые переменные и K-tree, который дико напоминает на первый взгляд Фортовые контекстных словари. Но, так как K (в отличии от Форта) -- язык полностью интерпретируемый, то контекст по идее, должен играть роль не при компиляции определений (которой нет), а непосредственно при исполнении.

Обязательно перенесу что-нибудь из его элементов в Форт. Собственно уже.

Крутятся всякие мысли по реализации модификаторов...


Последний раз редактировалось profiT Пт ноя 10, 2006 18:42, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 10, 2006 17:33 
А меня на данный момент заинтересовал Smalltalk
тоже думаю что нибудь из него притянуть к Форту:)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 10, 2006 21:26 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
когда-то довольно много игрался с ним. Что запомнилось:
- хранит историю значений(!) чуть ли не для каждой переменной;
- оччень быстро пересчитывает большие объемы числовой информации;
- довольно интересный синтаксис, приходитяс учить заново;
- ограничения в демо-версии.


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

Зарегистрирован: Сб май 13, 2006 18:17
Сообщения: 42
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
2profiT:
По сайту я так понял, что это всё же некоторая СУБД, по крайней мере упоминания про язык К в чистом виде не нашел.

Цитата:
Скорость исполнения зашкаливает.

Это в сравнении с чем?
Цитата:
отсутствие циклов

А это видимо зашитый бэктрекинг?

Если эта СУБД реактивнее чем MySQL, то с удовольствием бы попробовал, а так же интересно, в чём отличия от демо-версии, потому как с сайтом пока толком не разобрался :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 14, 2006 15:38 
Цитата:
По сайту я так понял, что это всё же некоторая СУБД, по крайней мере упоминания про язык К в чистом виде не нашел.

Внимательнее надо смотреть (q -- это новая версия K).

Цитата:
Скорость исполнения зашкаливает.

Цитата:
Это в сравнении с чем?

По сравнению например с Oracle или MS SQL (я про Kdb, который написан на K).

Так люди говорят, сам не видел...

Если сравнивать с другими языками, то это довольно спорно, так как алгоритмы чаще всего будут разные для решения одной и той же задачи при помощи например K и C++ (если разобраться в примере из первого сообщения, это должно стать очевидным).

Также нужно напомнить что язык интерпретируемый, но, тем не менее, в своих сильных сторонах (обработка массивов, доменов, вообще данных) может побить и скомпилированный C++.

Цитата:
...отсутствие циклов...

Цитата:
А это видимо зашитый бэктрекинг?

Нет. Опять-таки, в примере всё показано.

Цитата:
Если эта СУБД реактивнее чем MySQL...

Должен быть.

Цитата:
..., то с удовольствием бы попробовал...

Ну, если есть лишних 150