LINUX.ORG.RU

Metaprog: универсальная графическая среда программирования [в разработке] часть 5

 , , ,

Эта эпопея всё никак не закончится?

XMs ★★★★★
()
Ответ на: комментарий от monk

Кстати, смотрел https://noflojs.org/example/ ?

Про noflo (и viskell) автор сказал, что это - Не более чем системы для прототипирования под джаваскрипт и хаскелл. О системах прототипирования замечание уже было. Его поделие для полноценного программирования.

Laz ★★★★★
()
Ответ на: комментарий от metaprog

Да будет рекурсия. Всего лишь функция в функции, тут вопрос лишь как ее воплотить.

Любой рекурсивный алгоритм можно преобразовать в итеративный, так что, если есть циклы, на рекурсию можно забить - её отсутствие никоим образом не уменьшает мощъ твоего языка.

Laz ★★★★★
()
Ответ на: комментарий от Laz

В Си так вроде принято делать для производительности. Но рекурсия тоже по-своему прекрасна, в Лабвью я ее часто использую.

metaprog
() автор топика
Ответ на: комментарий от monk

Да, у меня есть компонент «вызов сишной функции». Но есть и свои, метапроговские подфункции, в большинстве примеров есть. А в NoFlo свои подфункции есть или только джаваскрипт?

metaprog
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Понтанулся, легче стало? А почему там написано именно так в контексте топика понторезка понять помешала?

anonymous
()
Ответ на: комментарий от Deleted

Шо уже можно прогаммы записывать в виде звуков, запахов, тактильный ощущений?

Begemoth ★★★★★
()
Ответ на: комментарий от Laz

Любой рекурсивный алгоритм можно преобразовать в итеративный, так что, если есть циклы, на рекурсию можно забить

Попробуй преобразовать

int search(tree *t, int k)
{
   int r;
   if (t.key == k) return t.val;
   r = search(t.left, k);
   if(r) return r; else return search(t.right, k);
}

monk ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Зависит от ЯП. Это же классическая хвостовая, на хаскеле так примерно 70% ПО написано, и стек никуда не выжирается. Если ваш язык не умеет в чистые функции и их оптимизацию – не значит, что алгоритм неправильный.

Хотя данный конкретный алгоритм неэффективен по времени, это да.

balsoft ★★
()
Последнее исправление: balsoft (всего исправлений: 1)
Ответ на: комментарий от balsoft

Зависит от ЯП. Это же классическая хвостовая

???

В хвостовой последним действием должно быть «вернуть f(...)», а не «вернуть сумму ...».

на хаскеле так примерно 70% ПО написано

Ну запусти

Prelude> f 1 = 1
Prelude> f 2 = 2
Prelude> f n = f (n-2) + f (n-1)
Prelude> f 2000000000

monk ★★★★★
()
Ответ на: комментарий от balsoft

В том и дело, что конкретно это - не хвостовая =)

anonymous
()
Ответ на: комментарий от monk

Пример неудачный, ибо в ghci следующее определение «затирает» предыдущее, но да, по времени оно неэффективно, а по памяти вроде бы должно быть.

Упс, глянул ещё раз, и понял, шо туплю… Пить надо меньше, надо меньше пить!

balsoft ★★
()
Последнее исправление: balsoft (всего исправлений: 1)
Ответ на: комментарий от balsoft

Хвостовая - это, например, всеми «любимый» факториал

f(1) = 1
f(n) = n * f(n-1)

который легким движением руки преобразуется в что-нибудь типа

acc <- n
while n > 2
   n <- n - 1
   acc <- acc * n

что и будет хвостовой рекурсией.

попробуй теперь ту функцию преобразить

anonymous
()
Ответ на: комментарий от anonymous

Да, согласен, я просто вообще не глядя на код написал пару сообщений, потом дошло.

balsoft ★★
()
Ответ на: комментарий от monk

Любопытно. Однако это все ориентировано на джаваскрипт, а не сишку.

Сделан ли NoFlo «сам на себе» и претендует ли на универсальную среду?

metaprog
() автор топика
Ответ на: комментарий от metaprog

Ни у одного человека в мире (кроме тебя) нет такого желания, чтобы среда ВП была сделана «сама на себе». Опять же, из всех визуальных наиболее универсальными являются лабвью и дракон. Из тех, что зарелизились.

arturianec100
()
Ответ на: комментарий от arturianec100

И я о том же. Но даже они по-своему ограничены, из-за чего я и задумал Метапрог.

metaprog
() автор топика
Ответ на: комментарий от arturianec100

Вот по теме. Вопрос ко всем. Как лучше спроектировать типы для диаграмм? Я про АДТ. Которые нужны хоть в асме, хоть в сишке, хоть в плюсах, хоть в js'е, хоть в хаскелле.

Имхо, основные типы такие:

  • Диаграмма (diagram)
  • Узел (node)
  • Связь (connection)
  • Область (area)

Я специально исключил отсюда все типы, необходимые для отрисовки и взаимодействия потому, что там всё специфично для средств отрисовки (gtk, qt, dom, nuklear, winforms...).

Сразу видно, что это частный случай графа, при этом лично я не вижу смысла запихивать всё это в дерево (если не надо тупо копипастить дракон + при удалении одного узла не должны удаляться все связанные узлы). Да и доступ к узлам должен быть прямой. Понятие «главного узла» нам не нужно, а вот в дереве обязателен «главный узел».

Имхо, стОит отдельно выделить структуры графа в памяти и отдельно код отрисовки, который уже работает с графом.

Имхо, вот мой вариант структур данных (схематически):

type Diagram {
  id: UUID
  nodes: LinkedList<Node*>
  areas: LinkedList<Area*>
}
type Node {
  id: UUID
  metadata: NodeMetaData*
  inputs: LinkedList<Pair<String, Connection*>>
  outputs: LinkedList<Pair<String, Connection*>>
}
type Connection {
  from: Node*
  to: Node*
  typeName: String
}
type Area {
  text: String
  rect: Rect
}
type NodeMetaData {
  name: String
  description: String
  icon: Icon
}

Это псевдокод, который легко превращается в код на языке реализации. Доработки приветствуются.

arturianec100
()
Ответ на: комментарий от arturianec100

Если мы делаем графическое описание чистых функциональных программ, то я бы сделал гораздо проще.

  1. Каждая «нода» представляет из себя функцию или конкретное значение или тип. Она обязана иметь тип.
  2. «Соединение» нод – применение функции
  3. «Область» – определение новой функции (по сути, именование лямбды) или нового алгтипа с помощью соединения нод и придания этой конструкции имени (имя может быть пиктограммой, это не принципиально)
  4. «Диаграмма» – совокупность областей, причем некоторые области «внутренние» (т.е. видны только для областей данной диаграммы), а некоторые – внешние (т.е. экспортируются и видны и изнутри, и снаружи)
  5. «Программа» – диаграмма, экспортирующая область, именующую аналог main :: IO ()
  6. «Библиотека» – диаграмма, экспортирующая несколько областей.

Наверное, это было бы очень удобно делать на каком-нибудь завтипном языке типа идриса, ибо тогда система типов этого языка идеально ложилась бы на систему типов нашего условного метапрога. С хаскелем так не прокатит – нужно либо велосипедить, либо костылить.

balsoft ★★
()
Последнее исправление: balsoft (всего исправлений: 1)
Ответ на: комментарий от balsoft

А я и не говорил про чистые функциональные программы. Это лишь подмножество программ, которое (не только оно) красиво ложится на ВП.

Концепцию «областей» я заимствовал из Unreal Engine Blueprints. Это графический аналог комментариев в текстовых ЯП.

Кстати, в диаграммах очень важно отделить «чистые» функции от функций с побочными эффектами, ведь порядок вызова 1-х не важен, а порядок вызова 2-х нужно задавать явно.

Я тут подумал и решил, что метаданные должны быть всего-лишь

Dictionary<String,String>
. + метаданные нужны и нодам, и диаграммам, и, возможно, связям. Что собой представляют метаданные - сильно зависит от ЯП, в который транслируются эти диаграммы.

arturianec100
()
Ответ на: комментарий от metaprog

Я могу читать описания типов данных на многих текстовых языках и на графических UML диаграммах. Содержание этой схемы мне непонятно. Уверен, многим другим тоже непонятна эта схема.

arturianec100
()
Ответ на: комментарий от arturianec100

Кстати, в диаграммах очень важно отделить «чистые» функции от функций с побочными эффектами, ведь порядок вызова 1-х не важен, а порядок вызова 2-х нужно задавать явно.

== чистый функциональный язык. Там как раз основная задумка в том, что все побочные эффекты отделены от вычислений, и при этом чистые функции задают порядок выполнения побочных эффектов. Все реализации вашего утверждения сводятся к чистой функциональщине либо к лютому бреду.

balsoft ★★
()
Ответ на: комментарий от balsoft

чистые функции задают порядок выполнения побочных эффектов

В средах, где бОльшая часть функций - с побочным эффектом, так не получится. Мне нравится как это реализовано в UEB. Я за мультипарадигменность.

А вообще, ваша аватарка намекает на любовь к функциональщине.

arturianec100
()
Ответ на: комментарий от arturianec100

Это всего лишь тип, лабвьюшный typedef из кластера (аналог сишной структуры) из массивов других кластеров. В нем содержится вся необходимая для блок-диаграммы информация, даже есть избыточность. А как у тебя будут визуально отображаться подобные типы?

metaprog
() автор топика
Ответ на: комментарий от balsoft

Я вот сейчас налаживаю циклы. Из-за побочного эффекта (который долго пришлось дебажить) я отказался от сишного инкремента (х++) в функции «+1» и использую вместо него (х+1).

metaprog
() автор топика

Ну что, обрисую и я схему.

Схема состоит из: - овалов, пустых или с проставленными в них формулами действиями, - треугольников с проставленными в них формулами распознавания - линий со стрелками

овалы и треугольники будем называть узлами, количество срелок, идущих от одного узла к другому не ограничено.

Стрелку, не начинающуюся ни из одного узла будем называть входной, а узел, на контуре которого такая стрелка заканчивается будем называть входным. Узел, на контуре которого не начинается ни одна стрелка, будем называть выходным.

Такая схема переносится на любой язык, любую машину. И выполняется хоть последовательно, хоть параллельно.

anonymous
()
Ответ на: комментарий от arturianec100

В средах, где бОльшая часть функций - с побочным эффектом, так не получится

В этом и заключается основное умение грамотного хаскелиста – декомпозировать «функции с побочным эффектом», выделив побочный эффект в сторонку и оставив как можно больше функций чистыми. Очень тупой пример, который демонстрирует принцип:

Вместо

greet :: String -> IO ()
greet = putStrLn . ("Hello, " ++) 

main = greet =<< readLn

писать

greet :: String -> String
greet = ("Hello, " ++)

main = putStrLn . greet =<< readLn
balsoft ★★
()
Последнее исправление: balsoft (всего исправлений: 2)
Ответ на: комментарий от metaprog
приветствие :: Строка -> ВводВывод ()
приветствие = вывестиСтроку . присоединить . "Привет, "

main = прочитатьСтроку >>= приветствие

vs.

приветствие :: Строка -> Строка
приветствие = присоединить "Привет, "

main = вывестиСтроку . приветствие =<< прочитатьСтроку

где

Строка = String
ВводВывод = IO
присоединить = mappend
прочитатьСтроку = getLine
вывестиСтроку = putStrLn
balsoft ★★
()
Ответ на: комментарий от metaprog

Отличий не вижу. И то, и другое - абракадабра из английского и спецсимволов..

А как тебе такая запись того же кода?

🙂⁞□→□
🙂≈✋×
♡≈○⨀🙂⥢●


Я перевёл код в графический вид - представил в виде графических блоков, ни один из которых не является буквой какого либо языка. Таким образом разум ставится в тупик, и человек воспринимает программу на подсознательном уровне, универсальном для всех, независимо от возраста, ориентации и узости специализации. Мне кажется, именно в этом сила визуального программирования - для понимания программы не нужно изучать басурманские языки и заморские спецсимволы, достаточно простых и понятных каждому с рождения графических блоков. Кстати, код этот написан мышкой путём поиска подходящих символов в таблице unicode и дальнейшего копипаста, что также соответствует духу визуального программирования.

Laz ★★★★★
()
Ответ на: комментарий от anonymous

Как я графически изображу рекурсию - я знаю, но это я сделаю с применением столь нелюбимого матана и абстракций.

Через Y-комбинатор? Но для этого нужны функции как объекты первого класса. Я бросил следить за метапрогом в середине второй темы, там хотя бы указатели на функции появились? Кстати, на Rosetta Code есть пример Y-комбинатора на C.

Jini ★★
()
Последнее исправление: Jini (всего исправлений: 1)
Ответ на: комментарий от monk

Любой рекурсивный алгоритм можно преобразовать в итеративный, так что, если есть циклы, на рекурсию можно забить

Попробуй преобразовать

Достаточно ввести тип stack. Но будет не так красиво, да.

Jini ★★
()
Ответ на: комментарий от monk

Попробуй преобразовать

У меня для таких случаев как раз есть программа специальная - gcc. Я бы выложил результат, да он в экран не влезает. Или выхлоп gcc не канает в качестве результата преобразования?

Laz ★★★★★
()
Ответ на: комментарий от anonymous

Неверно. В твоей реализации после рекурсивного вызова происходит ещё умножение. Можно переписать с использованием хвостового вызова следующим образом:


f'(0, acc) = acc
f'(n, acc) = f'(n-1, n * acc)

f(n) = f'(n, 1)

Доопределил факториал нуля заодно.

anonymous
()
Ответ на: комментарий от Jini

Указатели на функции - уже давно, коллбеки используются во всех примерах с гтк. Читай шапки тем.

metaprog
() автор топика
Ответ на: комментарий от balsoft

И все равно понятнее не стало. Где справка при наведении мышкой, где интерактивная обучалка без чтения RTFM? И где программирование через графические блоки, а не символы, хоть буквенные, хоть смайлики?

metaprog
() автор топика
Ответ на: комментарий от balsoft

Кроме шуток: есть ли в Си цикл по элементам структуры? Например, для сериализации. Сначала берется и сериализируется первый элемент, потом второй, третий итд.

metaprog
() автор топика
Ответ на: комментарий от metaprog

Кроме шуток: есть ли в Си цикл по элементам структуры? Например, для сериализации.

О, так, глядишь, теме к десятой ТС обратит наконец внимание на нормальные ЯП со вменяемыми циклами.

rebforce
()
Ответ на: комментарий от metaprog

Где справка при наведении мышкой

В вашем IDE

где интерактивная обучалка без чтения RTFM

На http://tryhaskell.org/

А так-то на ваших картинках тоже не будет справки при наведении мышки и интерактивной обучалки, если открывать их в feh

И где программирование через графические блоки, а не символы, хоть буквенные, хоть смайлики?

Вам нужно – вы и допишите поверх.

balsoft ★★
()
Ответ на: комментарий от balsoft

Type help to start the tutorial

Его ввести надо ручками. Там нету кнопки «help»!

metaprog
() автор топика
Ответ на: комментарий от balsoft

Шутка уже была пошучена, причем в прошлый раз я использовал валидный haskell.

Да, я видел, но мне захотелось довести её до того уровня, на котором, по мнению автора, находятся основные проблемы языков программирования - это не надёжность и безопасноть, не уровни абстракции, не какие-нибудь там зависимые типы; ключевая проблема в том, что закорючки для записи программ используются не те.

Впрочем, после вот этого поста (который я, честно говоря, только что увидел) я понял, что проблема в отсутствии нормального тимлида, который заставляет писать нормальный читаемый код.

Laz ★★★★★
()
Ответ на: комментарий от metaprog

Чуть ли не общепринятый стандарт показа структуры данных в графике - UML диаграммы.

У себя я планирую сделать много разных вариантов визуализации. Вместо тысячи слов как всё будет предпочитаю показать хотя бы сырой прототип. Когда он будет.

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