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

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

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

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

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

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

Цитата:
Сообщение от Stilet Посмотреть сообщение
определившая
Не опередившая. Буквы ты попутал )
Пусть так. Смысл моего высказывания не меняется: ты хвалишь их отдел маркетинга, а я его ругаю.

Цитата:
Сообщение от Utkin Посмотреть сообщение
Нет, граф "мощней". Каждое дерево есть граф, но не каждый граф есть дерево.
Да, понятно. Вопрос больше к Stilet-у был, у него ж своя трактовка терминологии.

Хотел еще про циклы черкнуть, почему их нет в Канторе. Не знаю, где это лучше сделать, в этой теме или в теме про циклы.

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

Цитата:
Многопоточность -- фундаментальная штука
Да многопоток это вообще спорная штука. Он жеж как пришел с Юникса так в таком же фактически виде до сих пор и остается. А запросы нонче уже повыше будут чем огогоццать лет назад. И может быть лучше было бы распараллеливать по процессам а не треадам, да связку между ними скажем через расшаренную память. Может надежнее, вот ведь в чем вопрос.
И сколько было споров - так поток организовывать аль по другому, все равно истину как таковую до сих пор не уловили до конца. Вон в интернете сколько гиковых статей как "надо" или "не надо" делать. А толку то... Маловато будет.
Цитата:
ты хвалишь их отдел маркетинга, а я его ругаю.
Да дело даже не в маркетинге. Сам подход достаточно уникален. В то время как реляшки набирали свои обороты эти ребятки умудрились крепко протолкнуть свое. А IBM и доси в этом плане в лавре лидеров со своими разработками в области иерархий и графов. Вот же в чем интерес - в уникальности.

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

Цитата:
Не знаю, где это лучше сделать
Да эт как хочешь. Я не буду против.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2015, 21:44   #44
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Цитата:
Сообщение от Vapaamies Посмотреть сообщение
ты хвалишь их отдел маркетинга, а я его ругаю.
В то время как реляшки набирали свои обороты эти ребятки умудрились крепко протолкнуть свое.
— Куда ж твой барин уехал?
— А кто его знает! Люди говорили, в Париж уехал.
— А!.. Белой акации, цветы эмиграции… Он, значит, эмигрант?
— Сам ты эмигрант… В Париж, люди говорят, уехал.
Vapaamies вне форума Ответить с цитированием
Старый 03.05.2015, 11:30   #45
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Массивы. Списки.

Цитата:
В Париж, люди говорят, уехал.
Да... Париж - голод балалаек... Особенно в начале тыщ девятьсотого...

Так...
Списки

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

Каждая переменная как объект имеет свойство, позволяющее внутри ее хранить массив или список. И в теории вложенность массивов или списков не ограничена.

Оператор формирования списка: <-

Т.е.
Код:
(a <- 1 2 "Строка" 5.56)
Читается как "в А внести список значений, разделенных пробелом"
Список вариантный. Строгости типов в Алисе нет. Надо признаться что иногда из-за отсутствия строгости бывают несуразицы, но редко.

По факту оператор внесения просто дописывает данные в конец списка.
Ну понятно что в качестве вносимого могут выступать выражения.
Т.е. запись типа:
Код:
(a <- (call obj.foo) 12 5)
Допустима вполне.

Обратиться к такому списку можно по индексу элемента.
Т.е. a[1] вернет 12. Хоть я и не любитель начала с нуля, но пошел на поводу у Делфи и Си.

По факту список - существо одномерное, и задать элементу списка подсписок нельзя. Т.е. это просто не предусмотренно. Пока не требовалось многомерные массивы обрабатывать. Понадобится - допилю.

Проход по списку производится циклом (тут scan не приделывал, хотя можно было бы)
Код:
(for i in a 
 (write i)
)
В данном случае аналог foreach. При этом редактирование итератора отражается на элементе списка. По крайней мере это предусматривалось.

Есть правда еще класс list, который призван выполнять то же самое, но я его не развиваю.

Ассоциативность проявляется в виде прямого указания ключа и значения элементу списка.
Код:
(c[3] := 123)
(c['ololo'] := 'aga')
(writeln '3 is ' c[3] \n c['ololo'])
(for i in c (writeln i))
Тут схоже с JS - в качестве ключа передается число (которое не имеет ничего общего с номером элемента по порядку, если такого элемента с таким номером заранее не существовало) или строку.

В данном примере с[3] означает фактически "Найти третий элемент списка. Если такого не найдено дописать в конец списка элемент, присвоив ему имя 3"

Т.е. по факту это больше справочник чем массив.


Массивы

Для однотипных массивов есть свои функции:
  1. (a := (bytes 1 2 3 5))
  2. (a := (words 1 2 3 4 5))
  3. (a := (integers 1 2 3 -4 5))
  4. (a := (doubles 1 2.568 3 4.6 5))
  5. (a := (strings 'Hello' 'world'))
Тип каждого массива определяется соответственно своей функцией.
Имена функции говорят какого типа будут элементы.
К ним уже операторы <- и -> неприменимы.
Однако цикл (for <итератор> in <объект>) применим вполне.
Обращение к элементу в массиве не предусмотрено.
Может потом допилю. Это такая область, которая мне не пригодилась пока. Но база для ее развития предусмотрена.
I'm learning to live...

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

Список ключевых слов можно продолжить следующими персонажами:

Код:
(return <значение или выражение>)
Прерывает выполнение функции, возвращая результат. Результат опционален, если его нет, то функция вернет False.
Необязательный параметр from=<имя файла> заставляет считать результат из файла, и вернуть его в виде строки, даже если это бинарный файл:
Код:
(return from='d:\файл.txt')
Сделано было для редких но метких случаев. Оказывается и такое бывает, особенно учитывая интергацию Алисы в WEB сервер.

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

Код:
(uses 'файл1' 'файл2')
Это аналог http://www.php.su/include
Если я не хочу большим кодом напрягать анализатор интерпретатора, зная что он будет выполняться не всегда, а по условию, я выношу его отдельно, а там где нужно приаттачиваю к процессу.
По факту происходит банальное считывание файла в строку и скармливание считанного функции (eval). О ней ниже.

Код:
(chr 13 10)
Функция, которая формирует строку из списка ANSI кодов, переданных ей. Фактически аналог chr() в Паскале.

format - функция, которая действует на основе StringReplace из делфи, подменяя в переданном ей тексте ВВ теги на некие значения.
Идея выдрана у Питона. Аналог вот такого чуда: http://pythonworld.ru/osnovy/formati...od-format.html

Код:
(s := (format
 `
   Это какой то там "текст". Причем с двумя видами ковычек.
   "Двойными" и 'одинарными'.
   А это заменяемые [tag1]  их  [tag2]
 `
 tag1='Теги' tag2='значениями'
))
Сделано для возможности форматнуть побыстрячку некий шаблончик документа. Применяю очень часто, в том числе при форматировании HTML.

Живой примерчик из рабочего модуля:
Код:
    (table += (format 
     `
       <tr onclick="PaintRow(this)">
        <th>[num]</th>
        <td>[gname]</td>
        <td>[gdict]</td>
        <td><input class="inputtext" id="[gname]" value="[gval]" onkeypress="objFB.ChangeGenerator(this,event)"></td>
       </tr>
     ` gname=fb[0] gval=fb[1] gdict=(if fb[2] fb[2] '') num=(i ++)
    ))
fb - объект firebird описанный выше.
ВВ теги подменяются реальными значениями и возвращается отформатированная строка.

Функция замены подстроки:
Код:
(replace in='исходная строка' from='Что заменять' to='чем заменять')
Результат - модифицированная строка.

Функция перевода вещественного значения в денежное представление:
Код:
(write (tellmoney 226.56))
Вернет строку Двести двадцать шесть 56
Алгоритм тут: http://www.programmersforum.ru/showthread.php?t=250384
Ну или вот: http://www.programmersforum.ru/showthread.php?t=134481

Функция переводящая значение типа TDate в строку формата dd.mm.yyyy
Код:
(s := (datetostr <переменка даты>))
Вместо перемнки можно подставить целое или вещественное. Будет считаться датой.

Функция форматирования вещественного:
Код:
(asdouble '%10.5f' <значение>)
Аналог делфийского format().

Функция перевода строки в дату:
Код:
... := (asdate '01.01.2015')
Основана на TryStrToDate

Функция перевода кодировки в ANSI из UTF
Код:
(ansi 'строка')
Функция перевода кодировки в UTF bp ANSI
Код:
(utf8 'строка')
Функция дополнения строки:
Код:
(pad direct=направление <Строка> <Чем дополнять> <Длина до которой дополнять>)
Направление может принимать значения left, right и middle.
Первое означает выравнивание строки символами слева, второе - справа, третье - центрирование строки. В качестве наполнителя могут участвовать не просто символ и целая строка.
Идея взята из функций FoxPro: PADL() PADR() PADC()

Функция trim. Обрезает пробельные символы в начале или конце строки
Код:
(trim <выражение>)
Функции проверки начала и конца строки:
  • first - (first Строка 'Начало') вернет True если строка начинается с подстроки
  • last - (last Строка 'Конец') вернет True если строка оканчивается подстрокой

Перевод в верхний\нижний регистр
Код:
(upper <строка>)
(lower <строка>)
Функция поиска позиции подстроки
Код:
(pos in=<Исходная строка> what=<что искать>)
Аналог паскалевской pos(). Вернет номер позиции или 0

Длина строки:
Код:
(length строка)
Преобразование из строки в число

Код:
(toint <строка>)
Код:
(tofloat <строка>)
Первая пытается преобразовать в целое, вторая в вещественное.
Основано на TryStrToInt и TryStrToFloat

base64 энкодер
Код:
(base64encode Строка)
base64 декодер
Код:
(base64decode Строка)
Соответственно кодируют и декодируют в BASE64

HEX энкодер
Код:
(tohex число1 число2 ...)
HEX декодер
Код:
(fromhex Строка)
Соответственно кодируют и декодируют в 16-ти ричное предстваление и наоборот.
Причем fromhex задуман как сумматор, если в строке закодировано более одного НЕХ значения.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.05.2015, 14:16   #47
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Еще немного.

Функция копирования подстроки:
Код:
(copy <строка> from=<позиция> to=<позиция> length=<длина>)
From указывает с какой позиции копировать
to до какой позиции
Length - длину копируемого. To и Length взаимоисключаемы

Диагностика кода
Код:
(debug <eval | functions | members | exceptions> [выражение])
eval говорит "покажи MessageBox с текстом, который сформирован выражением. Я так проверяю значения переменных при отладке. Ибо как таковой системы отладки нет.
functions выводит список методов объекта, что передается параметром
members - список переменных программы и их свойств

exceptions указывает что все исключения нужно не обрабатывать, а выводить сообщениями на экран.

Функция alert. Аналог JS функции по сути. Тот же Месседж Бокс.

Эвалюатор:
Код:
(eval 'Код Алисы строкой')
Какой же интерпретатор и без собственного вычислителя

Функция
Код:
(sleep <на сколько заснуть>)
Основа - виндовская sleep(). Применяю редко.

Освобождение переменных, уборка мусора:
Код:
(free <имя переменки>)
Вообще-то уборщик мусора есть, и ему самому виднее когда переменную турнуть со всеми ее объектами и массивами, но можно и принудительно это сделать. Редко использую.

Функция проверки на отсутствие внутреннего массива переменной:
Код:
(empty <имя переменной>)
Если внутри переменки не хранится список или массив - вернет True
Тоже редко использую.

Вывод в консоль
Код:
(write 'Текст' 123 'еще текст' \t 4556.23 \n)
(writeln 'Текст' 123 'еще текст' \t 4556.23 \n)
Вывод в консоль, или в стандартный буффер вывода, который потом Алиса умеет сливать в файл. writeln как в паскале переводит каретку.
модификаторы \t и \n как и в Си работают.

прерывание циклов:
Код:
(break)
Выход из for, scan. Пока не все scan методы этот оператор поддерживают, надо допилить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.05.2015, 14:35   #48
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так. Ну шо? Вроде все. Основные моменты описал.
Язык получился простенький, без особых наворотов, но вполне работоспособный.
При желании можно на нем уже в текушем состоянии решать достаточно серьезные задачи.

Язык написан на Free Pascal, так что лицензировать не требуется. Регистронезависимый.

Что еще сказать? Пожалуй про структуру переменных.

Во-первых самое главное правило: все переменные ГЛОБАЛЬНЫЕ.
Да. Сторонники локализаций, ООП, инкапсуляций и прочего - можете доставать свое венттопливо и готовиться забрасывать меня чем-то типа "Говнокод" "Фууу" "Ату его" "Лови быдлокодера" и прочими вашими любимыми фразочками.
А я скажу так: Глобальные переменные как показала практика только выигрыш дали.
Если хочется уникальности - давайте соответствующие имена переменкам.
По поводу многопотока. Ниче страшного. Можно делать стек переменных кадрами. На новый поток кадр с его локальными переменными + ссылка на основной стек. Но этого я пока делать не буду. Не требуется.
Глобальные переменные не такая уж и плохая концепция, и если отдавать себе отчет тому что пишешь помехи не создадут. А все эти стереотипы по поводу "глобальные это плохо" просто напросто навязаны модой ООП, который и сам имеет имеет кучу скелетов в шкафах. Ну раз уж его концепции проталкиваются везде, где надо и не надо пипл, как говорится, хавает. И не думает как лучше писать на самом деле, функционально, обьектами, там паттернами или еще как-то лишь бы в глазах других не упасть. Сколько замечаю многих программистов не интересует насколько правильно они применили те или иные технологии, главное что (вау!) применили суперпупер новое. А это прям "татышо". Это +100500 к карме в ИТ сообществе.
Бред...
Повестись за эффектом толпы может каждый, для этого ни мозгов ни фантазии не надо. А предки наши без проблем обходились без ООП, и писали то, на чем это ООП написано было потом, вот и стоит думать что это такое - прогресс или модничество.

Ладно. Не важно. Глобализация - стандарт языка, и баста.

Имена переменных и функции имеют только одно правило - нет пробелам. А так называть можно как угодно. Хоть с цифры в начале, хоть по русски, хоть с какого-то символа типа знака плюс. Лишь бы не было пробелов в имени.

Сами переменные (я уже говорил) ябляются объектами, даже если просто хранят скаляр.
По факту в их состав входит следующий интерфейс:
Value - поле скаляра. Тип Variant
Array - Список основанный на TObjectList.
FunctionsArray - список методов. Либо назначается по умолчанию системой, допустим есть это предопределенный класс, либо формируется пользователем следующим оператором:
Код:
(<Переменка> := func <Имя метода> ( тело метода ))
Так можно накидать переменке кучу методов (выше примеры есть), по факту определяя свой класс. Собственно идея взята из JS.

Вот такая вот структура позволила мне использовать саму переменную в циклах и проходах в качестве итератора. На каждой итерации поле Value получает от цикла нужное значение, и переменная используется в теле цикла.
Оказалось оч. удобно. Не надо каких то дополнительных итераторов создавать, все переменка делает сама.


Ну вот вроде бы и все... Такой вот блог получился скоропалительный.
Если кто заинтересуется - милости просим подискутировать. Язык развивается, дописывается. Появляются по мере необходимые новые фички и функции. Так что могу сказать что не зря начал это когда-то лет 6 назад с простой статейки в журнале. Вылилось в вполне полноценный продукт.

Кто пишет, написал, или собирается написать свой ЯВУ пожалуйста, пишите, критикуйте и так далее.

I'm learning to live...

Последний раз редактировалось Stilet; 03.05.2015 в 14:42.
Stilet вне форума Ответить с цитированием
Старый 03.05.2015, 14:55   #49
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Кто пишет, написал, или собирается написать свой ЯВУ пожалуйста, пишите, критикуйте и так далее.
А можно задать неудобный вопрос?
Vapaamies вне форума Ответить с цитированием
Старый 03.05.2015, 15:05   #50
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Конечно можно )
Любые вопросы - милости просим.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



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