Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Гайд по булевой логике Lua для Женщин


SLA

Рекомендуемые сообщения

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

Гайд по булевой логике Lua для Женщин

(Guide to Lua boolean logic for Women)

Знаете, чем особенен язык Lua? Это один из очень-очень немногих языков программирования, у которого женское имя. (Lua - "луна" по-португальски, женский род, как в португальском, так и в русском языках). И вообще, у неё много чисто женских качеств - Lua гораздо мягче, и покладистее, чем всякие PHP и Python'ы. То есть, Lua - женщина (думаю, я не один заметил это?), и поэтому, подход к так называемой "булевой логике" (она у неё совсем даже не "булевая"!), и не только к ней, у Lua не такой, как в других языках. И в этом есть своя прелесть, этим Lua особенно хороша :) Lua развивает идею "булевой логики" гораздо дальше других языков, потому, что... как бы это сказать... идеалисты говорят, "у женщин, в 6 раз сильнее интуиция", а материалисты говорят, "у женщин, в 6 раз больше нейронных связей". Кто из них прав? Ладно, не важно, теперь, к делу. Представьте, что в программе, внезапно, попалось что-то вроде этого:

MyVariable = (true and (not 0 or 53) and ":-)") or {}

Так о чём же думает эта женщина, когда натыкается на такое вот?.. А вот, о чём. Когда Lua попадается любая "булева логика" (любые выражения с and, or и not - это boolean logic, "булева логика"), как в нашем примере - команда, в которой в какую-то переменную пытаются записать результат выполнения "булевой логики", то что тогда происходит? Она вдруг понимает, что перед ней - МИНИ-ИГРА! =) Женщины, вообще, обожают сюрпризы, любят, когда им оказывают внимание, например, когда предлагают сыграть в игру. Но мы-то знаем, что для Lua, это вообще слабость! Она страшно обожает мини-игры и несложные головоломки, и разумеется, с удовольствием берётся сыграть в неё... :) В этой игре, несколько уровней, я опишу правила каждого уровня игры.

Сначала, она делит булевое выражение на условия (то есть, просто расставляет обычные скобки), правила такие - нужно построить буквам домики и комнаты из скобок, при этом, and всегда означает дружбу, а or всегда означает "не сошлись характерами":

A and B --> (A and B)-- A и B живут вместе, в домике из скобок.

A or B --> (A) or (B)-- A и B вообще не общаются, живут каждый в своём домике.

A and B or C --> (A and B) or © -- A и B дружат, а C сам по себе.

A and B or C or D and E and F --> (A and B) or © or (D and E and F) -- в последнем домике уже завелись дети.

если программист своевольно вставил в изначальное выражение какие-то скобки, то Lua их тоже учитывает, например:

A and (B or C) or D --> (A and (B or C)) or (D) -- по прихоти программиста, B и C поселены в одну комнату, хотя им это вынужденное соседство совсем не нравится!

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

A and B or C or D --> (A and B) or © or (D) -- B переселилась к A, и им хорошо вместе, а C доволен, что избавился от B.

если где-то есть not, то он добавляет ещё одно выражение, то есть, ещё одни скобки:

A or not B --> (A) or (not (B))

A or not (B and C) --> (A) or (not (B and C))

Затем, Lua начинает подсчитывать значения выражений (то что в скобках), СЛЕВА-НАПРАВО. Обычно, она выписывает выражения на бумажку, ей так понятнее. Например, выражение:

(A and ((not B) or C) and D) or (E)

на бумажке, сначала, превращается в:

1) X = (A and ((not B) or C) and D) = ?

2) Y = (E) = ?

3) ОТВЕТ = ( X or Y ) = ?

Но она умница, и продолжает упрощать себе задачу, старательно "вынимая" все вложенные под-выражения, пока не вынет все до последнего. Тогда задачка становится совсем-совсем элементарной. Она испытывает радость, в этот момент, потому, что, в каждой отдельной строчке (на бумажке) - либо цепочка and'ов, либо цепочка or'ов, либо просто какая-то одинокая переменная, с not или без него. В итоге, на бумажке написано вот что:

1) V = (not B) = ?

2) Z = ( V or C) = ?

3) X = (A and Z and D) = ?

4) Y = (E) = ?

5) ОТВЕТ = ( X or Y ) = ?

Вот в таком виде, уже можно решать в уме, понимает Lua, и приступает. Тут правила такие:

"Переменная X истина" (X верна) - значит, "X равна чему угодно, кроме nil и false",

"Переменная X ложь" (X не верна) - значит, "X равна nil или false".

ВАЖНО: Для Lua, в отличие от других языков программирования, число 0 (ноль) - ИСТИНА. Говорю же, что женщина! :)

И если кто не в курсе, пустые таблицы и пустые строки тоже ИСТИНА.

То есть, истина, буквально, "всё что угодно, кроме nil и false" - то есть, эта женщина, как бы, говорит нам - "да будь он хоть северный олень, лишь бы не п***р и не к***л!" :))

A and B and C =

A истина? Если НЕТ, то ОТВЕТ - A

Но если A истина, тогда...

B истина? Если НЕТ, то ОТВЕТ - B

Но если B истина, тогда...

ОТВЕТ - C (чем бы он ни был, т.к. это последний элемент).

ОТВЕТ - значение ПЕРВОГО попавшейся в цепочке ЛОЖНОГО элемента. На этом, разбор цепочки немедленно прекращается.

Иначе, если пришлось пройти всю цепочку (ВСЕ элементы цепочки оказались ИСТИННЫ), ответом станет значение ПОСЛЕДНЕГО элемента.

A or B or C =

A истина? Если ДА, то ОТВЕТ - A.

Но если A ложь, тогда...

B истина? Если ДА, то ОТВЕТ - B.

Но если B ложь, тогда...

ОТВЕТ - C (чем бы он ни был, т.к. это последний элемент).

ОТВЕТ - значение ПЕРВОГО попавшейся в цепочке ИСТИННОГО элемента. На этом, разбор цепочки немедленно прекращается.

Иначе, если пришлось пройти всю цепочку (ВСЕ элементы цепочки оказались ЛОЖНЫ), ответом станет значение ПОСЛЕДНЕГО элемента.

ВАЖНО: В Lua, операторы and и or возвращают не просто какой-нибудь дурацкий true/false, а возвращают именно ЗНАЧЕНИЕ ПЕРЕМЕННОЙ. То есть, в примерах выше, фраза "ОТВЕТ - A" означает, буквально, "ОТВЕТ - значение переменной A". И это краеугольный камень всей "женской булевой логики" Lua! :)

ВАЖНО: Если в цепочке and'ов попалась ложь, или в цепочке or'ов попалась истина, то на этом, разбор цепочки заканчивается (ведь, ответ уже известен, и нет смысла продолжать), и все остальные элементы в цепочке НЕ ПРОВЕРЯЮТСЯ ВООБЩЕ. При том, что проверка выражений идёт СЛЕВА-НАПРАВО, программисты знают эту хитрость, и как ею пользоваться. Кстати, Lua не считает, что они ею "пользуются", даже наоборот, она знает, что они знают, как этим пользоваться, но всегда с удовольствием подыгрывает им - НИКОГДА не проверяет остальные условия, как только появляется такая возможность. Но это никакое не свойство женской психики, на самом деле, так ведут себя все языки программирования. И что же нам даёт знание этой тонкости? Многое! В самом конце гайда, есть популярные примеры её использования.

not A =

A верно? Если да, то ОТВЕТ - false.

Но если A не верно, то ОТВЕТ - true.

В отличие от "and" и "or" (в Lua, возвращающих значения каких-то подсунутых им переменных), оператор "not" обладает жёстким, нордическим характером (точно как в других языках). Ему ВООБЩЕ НЕ ИНТЕРЕСНО, что ему подсунули, что бы там ни было, вариантов ОТВЕТА у него ВСЕГО ДВА - либо true либо false. Третьего не дано! Исключений нет! Пленных не брать!

Например: not 10 -> false, not "" -> false, not {} -> false, not false -> true, not nil -> true.

И вот, Lua решает наше выражение, подставив значения переменных вместо букв. Она с нетерпением ждала этот важный момент, это последний уровень игры, самый интересный! У неё замирает сердце, и перехватывает дыхание.

Допустим, наше выражение:

(A and ((not B) or C) and D) or (E)

со значениями выглядит вот так:

(true and ((not 0) or 53) and ":-)") or ({})

И вот, она считает (у неё есть калькулятор, но здесь он ей совсем не понадобится):

1) V = (not 0) = false -- Как я уже упомянул выше, в "женской булевой логике" Lua, число 0 это истина.

2) Z = ( V or C) = (false or 53) = 53

3) X = (A and Z and D) = (true and 53 and ":-)") = ":-)"

4) Y = (E) = {}

5) ОТВЕТ = ( X or Y ) = (":-)") or ({}) = ":-)"

С приятным ощущением совершённого полезного дела, Lua записывает строку ":-)" в переменную MyVariable. Это, наверное, для чата, или для какого-то диалогового окна, - думает она, - получается, я только что подарила кому-то улыбку, значит, мой день прожит не зря :)

Мини-игра пройдена! :) Lua радуется, программист счастлив, все пользователи довольны :)

P.S. Примеры из жизни и быта - на Lua, они просты, как японские Хайку! :)

Tools = GetTools() or {} -- Lua, принеси мне коробку с инструментами, а если не найдёшь её, то принеси пустую коробку. (Суть в том, что функция GetTools() должна вернуть либо таблицу, либо nil. Если инструменты не найдутся, то nil, возвращённый функцией GetTools(), здесь будет заменен на пустую таблицу. То есть - можно быть 100% уверенными, что после выполнения этой команды, в переменной Tools НУ ТОЧНО-ТОЧНО находится ТАБЛИЦА, к гадалке не ходи!)

Name = ID and GetName( ID ) -- Lua, скажи, как его зовут, НО только если знаешь его ID. Если ID не знаешь, то пусть его зовут nil. (ВАЖНО: Здесь, смысл в том, что если первое условие НЕверно (ID=nil), то, второе условие ДАЖЕ НЕ ПРОВЕРЯЕТСЯ, что спасает нас от ужасной катастрофы, которая ОБЯЗАТЕЛЬНО возникла бы при попытке выполнить GetName( ID ) при ID равном nil. Такая катастрофа закончилась бы ошибкой в логе, и прекращением выполнения функции - нам так не надо!)

Element = Index and ElementsTable [ index ] or 0 -- Lua, если известен индекс элемента, дай его значение из таблицы. А если нет индекса, ИЛИ ДАЖЕ, если есть индекс но в таблице нет элемента под этим номером, тогда дай-ка 0.

Power = A and B and math.pow( A, B ) or 0 -- Lua, если имеются A и B, то посчитай, "A в степени B". Но если нет A или B (или обоих), то пусть ответ будет 0, так как мне тут НУ ОЧЕНЬ-ОЧЕНЬ нужно получить именно ЧИСЛО.

print( A == B and "A равно B" or "A и B не равны" ) -- Lua, если A равно B, то напиши фразу "A равно B", а если не равны, то напиши "A и B не равны". (Ага, здесь мы используем "булеву логику" как параметр функции. Но и это не предел! Поскольку смысл "булевой логики" в Lua - вернуть значение какой-нибудь переменной, то мы можем использовать "булеву логику" в совершенно любом месте программы, где предполагается подстановка какого-нибудь значения переменной. Без никаких ограничений. То есть, чуть реже, чем в каждой строке программы :))

Ссылка на комментарий
Поделиться на другие сайты

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

Наконец разобрался в этой логике..

Quote:
число 0 это истина.

.. если бы я знал это ^^ . Сколько дней плясок с бубном не были бы потеряны..

Стиль написания просто радует ))

:D

Ссылка на комментарий
Поделиться на другие сайты

круто! а я только по интуиции по примеру из AddomsManager смутно понимала эту "нашу женскую" логику ))

спасибки за юморной стиль изложения

Ссылка на комментарий
Поделиться на другие сайты

Как определить, какого пола ваш язык программирования? Очень просто.

Переход с любого "мужского" языка программирования на Lua выглядит примерно так:

-- Меня зовут Lua. Я неприхотлива и не капризна. Буду помогать тебе во всём, и наведу порядок в твоём холостяцком доме, и ты узнаешь, что такое уютный домашний очаг.

-- Хорошо, спасибо тебе.

Переход с Lua на PHP выглядит примерно так:

Гусарское училище, 6 часов утра, построение на плацу.

-- Перед именами переменных нужно ставить знак $, понятно, солдат?!

-- Так точно!

-- Почему нет точки с запятой в конце строки? Поставь!

-- Есть!

-- И здесь поставь!

-- Есть!

-- И здесь поставь!

-- Есть!

-- Где все точки с запятой, в конце строк, Б***Ь ???? Ты издеваешься надо мной?!

-- Никак нет!

-- Ну вот, опять! Ты что, С ЛУНЫ СВАЛИЛСЯ ???

-- Так точно, с Луны! Пришёл из Lua.

-- На гаупвахту его. Посидишь там, подумаешь, зачем в PHP нужны точки с запятой!

:))

Ссылка на комментарий
Поделиться на другие сайты

вот что я после этого придумала - вместо кучи if - then:

Code:
for k, v in bHplace do

bHplace [k]  = PS [key.."HPplace"]  and PS [key.."HPplace"] [k]  or PS.HPplace [k]  or v

end

присвоение с наследованием параметров: если есть локальный - берем его, если нет то берем глобальный параметр, а если нет и его, то оставим что есть

Ссылка на комментарий
Поделиться на другие сайты

Пример с переходом на PHP очень напомнил мне Си, но я не могу перейти как раз в другую сторону, на Lua =)

Есть в этом языке что-то противное моей природе =D

Буду дальше копать документацию, уже забуду, что за аддон делаю, наверное. =)

Ссылка на комментарий
Поделиться на другие сайты

ВО!, тогда вот еще упрощение - вместо конструкций if then end делать все как присваивание:

Code:
local o

  o = v or func(v)

тут переменная о никуда ничего не передает а просто для синтаксиса, ведь нельзя просто так написать:

Code:

...

  v or func(v)

...

Ссылка на комментарий
Поделиться на другие сайты

В Си компилятор выводит только "внимание" (warning) на подобный код при компиляции: "Code has no effect". Но это считается допустимым. На Lua это проверено, или тут может быть так же?

Минус: читабельность кода страдает.

PS: кто это там неприхотливый? :))

Ссылка на комментарий
Поделиться на другие сайты

o = v or func(v) вернет v при v == not nil, а при v == nil будет выполнена функция func(nil). Смысла данного кода я особо не улавливаю. Зачем func(v) если оно будет выполнено только в случае когда v == nil?

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

ну в этом случае f(v) выполнится при не nil\false v. В этом смысл?

да и вариант результата(если передается не по адресу), может ну очень сильно нагружать как память так и процессор. Увы тонкостей внутренней работы интерпретатора луа не знаю, но, если так, то делать так точно не стоит(в локальную переменную передавать результат работы функции) это же может быть здоровенная таблица. так что лучше использовать if или, если допустимо v and f(g)

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования