Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2015, 17:39   #31
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Кэш это СУБД, где единица информации - класс. А запись - объект класса.
Давным-давно, когда я только начинал проект, пытался читать документацию Cache, поскольку мне про нее то же самое говорили. Мол, ООП, все дела. Но то ли тогда я не сильно продвинутым был, то ли разработчики Cache и правда навертели, то ли маркетинг постарался, но их документация мне показалась словоблудием в тех местах, где шло описание концепций. Даже не помню, есть ли в ней декларативные средства для манипуляций с объектами -- аналог DML в SQL.

Проще сравнивать будет, наверное, с новомодными NoSQL-СУБД, достоинства и недостатки которых лежат на поверхности. Работает быстро, но всю обвязку нужно писать вручную, типа как в FoxPro, поэтому подходит только для определенного круга задач. Чтобы такая СУБД смогла полностью заменить реляционную, нужны всё те же декларативные средства -- аналог DML из SQL.

Вот эту задачу я и пытаюсь решить в Канторе, опираясь на функциональное программирование, а за основу синтаксиса взяв SQL. Декларативная работа с объектами в Канторе носит название контейнерной арифметики, и функционально близка SQL и map-reduce из ФП. Это будет не в первой альфе, вначале нужно основу реализовать. Но будет.

Из-за всех этих концепций "Hello, world!" в Канторе сложней в реализации, чем в Алисе, например, поскольку абстракций тупо больше.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Вот и получается что Кантор твой тоже иерархический, раз одно связано с другим по некоему признаку во множественной связке. Пусть даже дело только в наследовании, это не важно. И это далеко не загибающаяся технология, тут я с тобой не согласен.
Я стараюсь использовать общепринятую терминологию. Иерархические СУБД существовали в дореляционную эпоху, их теории разрабатывались CODASYL. После появления реляционной теории были вытеснены РСУБД. С этого момента иерархическая модель стала считаться устаревшей в применении к СУБД, и называть какую-то базу иерархической -- это как ассоциировать ее с перфокартами.

Модель данных в Канторе не является иерархической, поскольку иерархия (вложенные пространства имен) -- только одно измерение, а есть еще наследование (граф) и обобщение (иерархия), если говорить о классах. Каждый узел одновременно находится в нескольких измерениях и является их пересечением. Это, наверное, похоже на кубы OLAP. Число измерений не ограничено.

В рамках Кантора я называю эту модель фрактальной, поскольку растет она путем дробления и уточнения, что и дает фрактал.
Vapaamies вне форума Ответить с цитированием
Старый 02.05.2015, 18:05   #32
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
то ли разработчики Cache и правда навертели
Ой, не говори... Там конечно постарались нафантазировать... Самому было сложно разбираться. Особенно в ранних версиях кащея, где васче то была скорее концепция линейной программы чем ООП. Тут конечно перебор у них вышел своеобразный. Но надо сказать что это достаточно уникальная СУБД определившая свою эпоху.
Цитата:
Я стараюсь использовать общепринятую терминологию.
Ладно ладно. Как скажешь. Пусть будет фрактальная модель.
Цитата:
в Канторе сложней в реализации, чем в Алисе, например, поскольку абстракций тупо больше.
Нда. Этого я пытался избегать. Минусы конечно своеобразные проявились, но задачи другие стоят. Нет такого задания, где бы эта концепция применялась перед мной. В любом случае пока что я не видел кода Кантора, который бы какую то задачу решал, так что сравнивать то не могу особо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2015, 18:25   #33
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Active X. OLE. COM Server

Тя-я-якс... Недавно разработанная фичка, которая понадобилась в производстве - взаимодействовать с .NET сборкой, зарегистрированной в качестве СОМ сервера. Да-а-а... Вот и такое бывает... Библиотека предоставляет некие методы, которые нужно вызывать и получать их результаты. Поэтому решил озаботиться и этим, учитывая что автор "слился" и отмораживается от намеков на усовершенствование своих творений под натиском юзеров. Ну юзера то смирились (а чем им остается?), а я нет. По крайней мере решил твердо - оснастить Алису возможностью взаимодействовать с такими библиотеками.
Значит по мотивам вот этих тем:
http://www.programmersforum.ru/showthread.php?t=276584
http://www.programmersforum.ru/showthread.php?t=276143
http://www.programmersforum.ru/showthread.php?t=276091
http://www.programmersforum.ru/showthread.php?t=275861
недавно родился новый класс.

Код:
(o := ole name='MSScriptControl.ScriptControl')
name - имя класса
Ну или:
Код:
(o := ole guid='{048614F9-BA2E-48C3-8DC9-9EC1976EDF2D}')
Если известен Гуид компонента.

По факту есть всего два метода: set и invoke.

Первый служит для работы со свойствами, а конкретно задает им значение:
Код:
(call o.set Language='VBScript')
Т.е. в свойство Language что-то устанавливается.

Чтоб считать свойство достаточно к нему просто обратиться:
Код:
(writeln' Language=' o.language)
Как и в популярный ЯВУ.
Может позже как-нибудь откажусь от set в пользу чего-то проде
Код:
(o.language := 'VBScript')
Ну пока есть некоторые технические сложности.

Вызов метода:
Код:
(call o.invoke name='Имя метода' 'Параметр 1' 12 'Параметр 3')
Думаю пояснять не требуется: name указывает какую функцию в интерфейсе вызвать, и далее пошел список параметров.
Если это функция то соответственно invoke что-то вернет.

Пример:
Код:
(writeln (o := ole name='MSScriptControl.ScriptControl') (call o.error))
(writeln (call o.set Language='VBScript') ' Language=' o.language (call o.error))
(writeln (call o.set UseSafeSubset=0) ' UseSafeSubset=' o.UseSafeSubset (call o.error))
(writeln (call o.set AllowUI=1) ' AllowUI=' o.AllowUI (call o.error))
(writeln (call o.set TimeOut=-1) ' TimeOut=' o.TimeOut (call o.error))
(writeln (call o.invoke name='reset') ' ' (call o.error))
(writeln (call o.invoke name='AddCode' 
 '
    Function hello()
      hello = "hi"
    End Function      
') ' ' (call o.error))
(writeln (call o.invoke name='run' 'hello()') ' ' (call o.error))
(writeln (call o.invoke name='eval' '2+2') ' ' (call o.error))
Это типо работа с VBS на уровне OLE.

Визуальные ActiveX в планах. Сейчас прорабатываю теорию. Пока не все понимаю, но дорогу осилит ползущий.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2015, 18:46   #34
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию OpenDialog. SaveDialog.

Поскольку Алиса уже активно юзается пользователями моих филиалов (кроме меня для них почти никто не пишет ПО) я время от времени учитываю их пожелания. Одним из таких пожеланий был запрос на выбор файлов. Например пользователь хочет отправить пару файлов по почте.
Ввиду этого приделал диалоги.
Код:
(od := dialog initdir='D:\Каталог\' mask='*.xlsx')
initdir переключает диалог в этот каталог. Опционален
mask тоже опционален и задает фильтр для отображения файлов в диалоге для открытия или сохранения.
По умолчанию включен режим множественного выбора файлов. Т.е. за раз можно выделить несколько файлов в каталоге.

Методы показа диалогов:
  • open - OpenDialog
  • save - SaveDialog
Т.е. каждый метод открывает либо диалог открытия либо сохранения.
Слил я для упрощения все это в один класс, в отличии от стандартных диалогов, которые друг к другу не относятся.

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

И легкий примерчик, показывающий собственно решение вышеуказанной задачи выбора файлов, которые нужно двинуть на мыло:
Код:
(od := dialog)
(if (call od.open) () (quit))

(ml := mail
				 host='www.Гугла.Мыла' 
				 pass='Парольчик' 
				 sender='Я@гугломыло.com' 
				 recipient='Он@гугломыло.ua'
				 subject='Ченить-такое'
)

(call od.scan
  (writeln 'Добавлен: ' (utf8 od) ' ' (call ml.addfile file=(utf8 od)) (call ml.error))
)
(if (call ml.send)  
  (writeln 'Почта отправлена ' )  
  (writeln 'Ошибка передачи файлов: ' (call ml.error) (alert 'Ошибка передачи файлов. Попробуйте позже'))
 )
(alert 'Закончили')
(quit)
Итак: od.open запускает диалог. В данном случае открытия файлов. Если нажата кнопка "отмена" возвращает False и IF прыгает на команду Quit, которая говорит Алисе сказать всем "до свидания" и закрыться.
Иначе od.scan пройдется по списку имен выбранных файлов, каждое имя которого попадет в итератор, и будет передано объекту почтовика в качестве вложения.
функция utf8 перекодирует из ASNI в UTF8. О ней позже.
Далее ml.send толкает почту.

Больше диалог ничего не умеет, да ничего другого и не нужно.

Единственное что могу добавить: После открытия диалога od получает статус массива. Таким образом обращение типа od[3] вернет путь к файлу в списке, номер которого три. Или False если номер такой в списке отсутствует. Начинается с нуля. Так что теоретически можно и без scan в цикле проход сделать. Но scan лучше будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2015, 18:51   #35
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Но надо сказать что это достаточно уникальная СУБД определившая свою эпоху.
Чем опередившая? Маркетингом? Вроде нет, до IBM и Oracle ей далеко. А заставить всё писать ручками и назвать это передовой технологией -- много ума не надо, адепты NoSQL и без маркетинга как-то справляются.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ладно ладно. Как скажешь. Пусть будет фрактальная модель.
На самом деле это мой термин, пока не общепринятый. Остальные -- общепринятые.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нда. Этого я пытался избегать. Минусы конечно своеобразные проявились, но задачи другие стоят.
Угу. Первый минус -- Алису нельзя написать на Алисе. Конкретно для Алисы, это, по всей видимости, не недостаток, а вот я компилятор пишу, и разработка интерпретатора -- просто способ самораскрутки. По мере развития всё больше кода Кантора будет написано на Канторе, а после реализации кодогенератора он соберет сам себя и станет полностью самостоятельным. Без концепций тут никак.

Примеры кода на Канторе можно увидеть в этюдах. Cамый длинный этюд -- WideParamStr, в нем я экспериментировал с синтаксисом итераторов. Так примерно и будет выглядеть.

Последний раз редактировалось Vapaamies; 02.05.2015 в 18:53.
Vapaamies вне форума Ответить с цитированием
Старый 02.05.2015, 19:15   #36
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Чем опередившая?
определившая
Не опередившая. Буквы ты попутал )
Цитата:
Алису нельзя написать на Алисе.
Ну как тебе сказать то... Вообще-то получается что можно. Особенно если я прикручу работу с DLL. Но ты прав. Это не входит ни в недостатки ни в планы. Как в Lua - что написано, тем и довольствуемся. Да и я не ЯВУ собрался писать а всего лишь красивую IDE типа Лазаруса для своего ЯВУ.
Цитата:
Примеры кода на Канторе можно увидеть в этюдах.
А-а-а. Неплохо. Напоминает PL\SQL чем-то.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2015, 19:34   #37
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Он тоже считается за иерархию?
Нет, граф "мощней". Каждое дерево есть граф, но не каждый граф есть дерево.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.05.2015, 20:27   #38
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
Сообщение Потоки.

Чисто из "академичоского" опыта да и просто для интереса был добавлен класс распараллеливания процессов. Если быть точным - треды.
Однако вынужден признать что эффективность треад в Алисе ставится под сомнением ее правилами области видимости и области жизни переменных. Почему, я расскажу позже. Поэтому потоки не применяю, но в качестве платформы на будущее они есть.

Класс:
Код:
(t := thread)
Описание тела треда передается методу Start параметром, который собственно и запускает тред на выполнение.

Простенький пример:
Код:
(t := thread)
(call t.start (
 (for (i := 0) (i < 100) (i ++) 
   (write i)
 )
))
(write 'ok')
Что-то типа анонимных функций, так популярных сегодня.

Для управлением треда есть методы stop (останавливает тред совсем), pause (ставит на паузу) и resume (продлжает тред)

Проверки состояния треда не предусматривал. Синхронизации тоже нет.

Если же в start передать имя исполнимого файла
Код:
(call t.start from='d:\1\File.exe' wait noconsole)
То тред станет сопроцессом. Практически WinExec().

флаг wait указывает заморозку основного потока, из которого вызван запуск пока запущенная программа не отработает.

флаг noconsole заставляет запущнные процессы не светиться на экране, если они консольные.

Иногда всетки нужно выполнять запуск определенных процессов, тут ниче не поделать.
Однако же класс сей использую редко.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2015, 21:10   #39
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Зарезервированные слова. Системные функции.

Такс. Плюшки и фички вроде перечислил. Есть еще парочка, о которых я не упоминаю, но они маловажны. Так то исходник я выложил, если кому интересно может подсмотреть имена классов в функции TAlisaSet.Exe, отвечающая за присваивание и создание объекта.

Теперь по порядку по операторам и зарезервированным словам.
Полный список и реализация описаны в исходнике в TAlisaInterpretter.LetsDo
В эту функцию кстати строкой передается код Алисы. Собственно она и является ядром интерпретатора. Там же парсер там же исполнитель.

Итак.

Присваивание:
Взято из паскаля. Я как и Вирт неприемлю Сишное равно, ибо считаю что равно служит для сравнения, а не для присваивания. Поэтому перенял у Вирта его "фаллический" оператор "Равно с яйками". Одобрено Фрейдом.

Код:
(<имя переменной> := <зачение или выражение>)
По факту является функцией, и возвращает результат.
Т.е. к примеру код
Код:
(write (i := 1))
Выведет в консоль единицу, которая считается результатом присвоения. Поскольку это скаляр, скаляр и вернется.
Выше вы можете наблюдать такую картину:
Код:
(if (<переменная> := <класс>)
 (Реакция на True)
 (Реакция на False)
)
Да. Создание класса и его инициализация при присвоении возвращает результат. Какой - зависит полностью от класса. Как правило это булевы значения, говорящие что объект создан.
Вообще все операции являются выражением, все возвращает результат.

Операция присвоения штука сложная и неоднозначная. Проблема в структуре самих переменных, которые в общем то являются объектами. О них распишу ниже отдельно. Поэтому с присвоением приходится быть аккуратным.

Арифметика:
Вообще для выражений предусмотрены следующие операторы:
  1. / - Деление. Вещественное.
  2. * - Умножение или мультипликация. (см. ниже)
  3. - - Разница или множественное вырезание (см. ниже)
  4. + - Суммирование
  5. ^ - Возведение в степень
  6. += - Самоувеличение (Аналог Си)
  7. -= - Самоуменьшение (Аналог Си)
  8. *= - Самоумножение (Аналог Си)
  9. /= - Самоделение (Аналог Си)
  10. ^= - Возведение в степень на себя
  11. %= - Остаток от деления на себя (Аналог Си)
  12. ++ - Инкремент (Аналог Си)
  13. -- - Декремент (Аналог Си)
Есть еще паскалевские mod и div.
Инкремент и декремент в отличии от Си имеет только одну форму.

В основном все арифметички работают с числами, однако есть некоторые отличительные особенности.

Например делением можно разделить строку на массив подстрок. Аналогом может послужить метод Split() в популярных ЯВУ. Пример:
Код:
(s := 'Небо затянуло тучами. Скоро пойдет дождь. Надо взять зонт.')
(a := (s / '.'))
(for i in a
  (writeln i)
)
Т.е. Оператором деления строка разбивается на предложения. В качестве делителя может выступать не только символ, но и любая другая строка. Вот такой вот Split().
Насколько я помню в Питоне есть такая фичка. А может путаю. Но где-то в каком-то ЯВУ я точно видел такое.

Оператор * тоже умеет кое что помимо умножения. И тоже для строки.

Код:
(write ('ол' * 10))
Даст повторение подстроки. Т.е. результатом будет олололололололололол.

Применение сему я нашел в составлении отчетов в текстовом виде, когда например нужно пролинеить псевдографикой.

Вычитание тоже с сюрпризом. Вычитание подстроки из строки означает удаление всех вхождений этой подстроки.
Код:
(write ('мама мыла раму' - 'м'))
даст строку "аа ыла рау"

От такая от фигулька нестандартная )
Нда...
I'm learning to live...

Последний раз редактировалось Stilet; 03.05.2015 в 14:46.
Stilet вне форума Ответить с цитированием
Старый 02.05.2015, 21:11   #40
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Условные операторы

Условные операции
  1. if - Условный оператор
  2. in - Проверка на вхождение
  3. < - Меньше
  4. > - Больше
  5. = - Равно
  6. <= - Меньше или равно
  7. >= - Больше или равно
  8. <> - Не равно

Здесь собственно самое необычное реализованно в if и in
Поскольку и они возвращают результаты я свободно могу написать
Код:
(i := (if (k = 23) 'Равно 23-м' 'Не равно'))
Сама структура оператора следующая:
Код:
 if
  <выражение условия>
  <Выражение если условие истино>
  <Выражение если условие ложно>
Соответственно пример выше проверит равно ли "к" 23-м. Если да выполнит строку 'Равно 23-м' Если нет - 'Не равно'.
Под понятием "выполнит" кроется проверка. Если начало с ковычек - это строка. Ее нужно просто вернуть. Если обнаружено число - тоже вернуть. А если первый символ - "(" это выражение. Его нужно отдельно выполнить. И опять таки вернуть результат.
Причем выражение может представлять из себя блок. Тогда результирующим будет последнее выражение в этом блоке.
Пример:
Код:
<Переменка> := 
(if (i = 0)
 (
   (write 'Сие нуль')
   (i ++)
 )
 (
   (write 'Сие не нуль')
   (i --)
 )
)
Таким образом IF вернет 1, если i нулевое, поскольку тут в блоке инкремент - последняя операция блока или -1 если i ненулевое. Естесственно само i так же изменит свое значение.

Вот и получается аналог Оракловского DECODE() или фокспрошного IIF()
Ну или Сишного ()?:.

Оператор in скомунизжен из паскаля, и представляет из себя поисковик значений в массиве или строке.
Код:
('ма' in 'мама мыла раму')
Даст True. Поскольку "ма" является подстрокой в строке, что справа от оператора
Если есть массив типа
Код:
(a <- 1 2 3 4 5 6)
То проверка
Код:
(4 in a)
даст True
а
Код:
(54 in a)
даст False
Ибо в массиве такого значения нет.

Продолжение следует...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хочу написать программу для себя Marishka.S Помощь студентам 7 02.10.2011 17:23