Перейти к содержимому

Ktlo

Пользователи
  • Публикации

    96
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Все публикации пользователя Ktlo

  1. Неа, я только что проверил в CC, и как оказалось функция присутствует, также как coroutine.running().
  2. Ой напортачил... А как же coroutine.wrap(func: function):function? А так же ещё два статуса: normal (когда поток запустил другой поток он становится normal) и running (поток запущен и работает)?
  3. Подожди, это не динамические ли массивы в С++? Я то сделал библиотеку для работы с векторами из линейной алгебры.
  4. Какое посоветуешь? Признаю, сочинять названия я не умею.
  5. После того, как я написал про метатаблицы в Lua, захотелось провернуть что-нибудь этакое. Данная библиотека добавляет одну основную функцию, которая возвращается при вызове этой библиотеки с помощью require(module: string). Эта функция возвращает вектор и принимает в качестве аргументов числа, которые соответствуят каждому новому измерению в векторе. Но сначала, разумеется нужно скачать библиотеку. Вы можете сделать это с помощью команды в OpenOS или CraftOS. pastebin get mdfDvmps /lib/vector.lua Разумеется в CraftOS нет никакого require(), но вы можете посмотреть эту тему . Хотя также в CraftOS есть своя библиотека с векторами. Вернёмся к основной функции, если до сих пор не понятно, как она принимает аргументы, я просто запишу вот так: vector(x: number, y: number, z: number, ... ). Как видите у вектора может быть не ограниченное (ограничивается возможностями Lua) количество измерений. Сам вектор хранит измерения и их значения в себе как в массиве. Каждый вектор хранит количество измерений, которое он обрабатывает в поле n. То-есть, чтобы получить кол-во, обратитесь к этому полю примерно так: local vector = require "vector" local a = vector(1, 5, 89, 6) print(a.n) --> 4 Все операции с векторами создают новые вектора, а не изменяют старые. Теперь я опишу все операции с вектором Методы: Если хотите увидеть что-нибудь ещё в этой библиотеке, пишите. Постараюсь добавить.
  6. Ktlo

    Метатаблицы, Lua

    Нет, я проверил в Lua интерпритаторе, и твоё предположение на счёт __call не работает.
  7. Ktlo

    Метатаблицы, Lua

    Обновил и добавил про метаметоды сравнения. Возможно потом, что-то ещё буду дописывать, но скорее нет. Вроде описал все поля, используемые в метатаблицах. Но если что-то забыл, пишите.
  8. А мы не хуже! Давайте и свою ось склепаем. Будет у нас своя система динамических библиотек, мультипоточность, своя GUI библиотека. Будет... ВСЁ БУДЕТ!
  9. Ktlo

    Метатаблицы, Lua

    Но я упоминал об этом. Переделаю, так действительно будет лучше.
  10. Ktlo

    Метатаблицы, Lua

    Обновил и добавил про математические метаметоды.
  11. Ktlo

    Метатаблицы, Lua

    Метатаблицы — это самые обыкновенные таблицы, содержащие функции, которые изменяют стандартное поведение операторов в Lua. Метатаблица в Lua может быть у любого значения, но только у каждой таблицы может быть своя метатаблица, у всех остальных же одна на всех. Так например у типа значения строки есть своя встроенная метатаблица, которая позволяет нам делать так: ("строка"):rep(10) В данной таблице присутствует поле __index. А у потоков метатаблицы нет, а надо бы!!! Но обо всём по порядку. Для установки и получения метатаблиц в Lua по стандарту существует 4 функции: setmetatable(table: table, metatable: table):table — это основная функция, которая позволяет установить таблице метатаблицу. Такая функция работает только с таблицами. getmetatable(value: value):table or value — возвращает метатаблицу, если есть или значение поля __metatable в метатаблице, если есть. Работает со всеми значениями. debug.setmetatable(value: value):boolean or table — устанавливает метатаблицу любому значению и обходит метаполе __metatable. Действительно мощная штука, вот почему её убрали в Open Computers . debug.getmetatable(value: value):table or value — возвращает метатаблицу, обходя поле __metatable.​ Также отсутствует в OC. Теперь, я думаю, можно приступить к самим метаметодам. Для своего, а может быть и вашего удобства я их разделю на четыре категории: Разное Математические Сравнение Битовые операторы
  12. На этом сервере нет. Смысла данной либы нет, т.к. параллельная отрисовка у тебя всё равно не выйдет. Параллельность сможет сработать только при использовании функций, приостанавливающих действие каждого потока: coroutine.yield(), sleep(), os.pullEvent(), os.pullEventRaw() и т. д.
  13. Афигеть, я и не думал, что этот мод на такое способен. Я всё время использовал похожий ProjectRed.
  14. Перенос статьи Эта тема была перенесена из блока "Статьи". Эта простая программа служит в основном для декора. С её помощью вы сможете с лёгкостью выводить список цистерн, подключённых к компьютеру, с подробной информацией о каждой. Скачать её можно с pastebin CAUxJx2T. Как запустить Я подумал, что для такой программы не нужна система, поэтому для работы вам необходимо установить её на EEPROM. Комплектация компьютера - минимальная, необходим процессор первого уровня, видеокарта (желательно второго уровня), монитор (тоже желательно второго уровня), адаптеры с расширением tank controller с подключёнными цистернами. Как работает Программа ищет всё подключённые к компьютеру адаптеры с модулем tank controller. Более того вы можете спокойно присоединять цистерны ко всем её сторонам, и они все будут отображаться, главное не делайте это во время работы программы. Когда всё подключено, просто запустите компьютер. В конечном итоге всё должно выглядеть примерно так: Вверху каждой ячейки на мониторе название жидкости, по середине её количество в цистерне, снизу же располагается максимальный объём. Вы также можете прописать каждому типу жидкости свой цвет. У меня это проделано только для воды лавы и молока, что можно увидеть на скриншоте. Для этого откройте файл любым редактором и найдите первую локальную таблицу fluids в ней название каждой жидкости соответствует цвету, вам следует просто продолжить таблицу, также вы можете изменить надпись на верху, для этого придайте переменной name значение любой строки, но старайтесь не использовать 2-байтовые символы. Программа работает на компьютере не переставая, способ выключения я не придумал, т.к. зачем это надо. Обновление Я постарался учесть все ваши пожелания в коментариях и обновил программу. Ниже перечислены все изменения. Если размер каждой цистерны на экране меньше 15 в ширину, то он фиксируется на 15, другие же цистерны, которые не попали на экран можно увидеть, тыкнув в правую часть экрана, при этом экран будет прокручиваться вправо на одну ячейку цистерны. Если необходимо вернуться назад тыкните в левую часть экрана. Plug-and-Play добавлен, но плохо работает или вообще не работает с компонентами tank controller. Подключение новых цистерн и отключение работает без проблем. Теперь программа также может работать с OpenOS, но лучше использовать EEPROM.
  15. Решил написать немного о логических выражениях в Lua. Логические операции в Lua (в частности end и or) отличаются по возможностям с теми же операциями в других языках программирования. Во многом это зависит от того, что в Lua нет типов переменных (ну там всякие int, byte, short). Зная эти особенности, вы можете избавиться от ненужных логических блоков, но сначала следует разобраться, что они вообще делают и какие значения в lua истинные, а какие ложные. Ложные значения - это nil и false, а всё остальное (таблицы, числа, сопрограммы, true) - истинные. OR AND NOT Теперь можно показать самые используемые выражения. Наверняка у вас был случай, когда нужно, чтобы переменная приравнялась одному значению, а если его нет, то другому. Многие записали бы так: if var == nil then var = 23 end Это конечно работает, но не лучше ли записать так: var = var or 23 Кратко и красиво, да к тому же нет лишнего логического блока. Вы также можете продолжить эту цепочку: var = var or var2 or var3 or 23 В такой цепочке выражение вернёт первое истинное значение, при этом не трогая все те что за ним. Это значит, что вы спокойно можете сделать так: var = var or error("Переменная var содержит ложное значение!") И радовались бы дальше, но ведь иногда нам нужно, придать значение переменной в зависимости от истинности выражения. Не зная удобного способа, вы бы сделали так: if var then var2 = 23 else var2 = 42 end Но это можно записать без логического блока: var2 = var and 23 or 42 Вы можете заменить переменную var любым выражением, но если вы плохо разбираетесь в приоритетах операторов рекомендую выделять скобками: var2 = (var > 0) and 23 or 42 -- В данном примере скобки не обязательны Теперь давайте основываясь на узнанном, напишем функцию с проверкой аргумента: function func(var) var = type(var) == "number" and var == math.floor(var) and var or error("bad argument: celoe number expected, got "..var, 2) end И заметьте ни одного логического блока. В результате наша функция проверит является ли аргумент целым числом, иначе вернёт ошибку. Бывает случай, когда необходимо проверить существует ли поле в таблице и выполнять действия в зависимости от этого, но ведь значение может быть не таблицей, из-за этого ошибка будет не пользователя а ваша. Я не буду приводить всякие отдельные случаи просто напишу само выражение: if not (type(table) == "table" and table.field and ...) then -- ... - ваши логические выражения -- Какие-то действия end Ещё один важный момент, когда аргумент вашей функции может быть не указан, но потом внутри самой функции обретает значение типа boolean (true либо false) через оператор or это не выполнить, т.к. false - ложное значение, но можно воспользоваться следующими выражениями, в зависимости от того, что вам нужно: var = var ~= false -- Если var = nil, то вернёт true, если переменная типа boolean не изменит её значения var = not not var -- То же, что и первое, но при значении nil вернёт false Думаю, что наиболее используемые моменты осветил, но если что-то не понятно, спрашивайте. [ok=Ни один смайлик не использован][/ok]
  16. Ktlo

    [CC] Object API

    Object API (Работаю над названием) Представляю вам третью версию Object API, которое я начал писать ещё давно, первых двух версий вы здесь не найдёте. Это библиотека работает только на Computer Craft, так что возможно зря я её писал... В любом случае, я надеюсь, что вы оцените. Сейчас в этой библиотеке есть следующие элементы: Button, CheckBox, Graph, Image, Label, Process, Registry, TextBox (не доделано). Планирую написать ещё очень много. Скачать можно с pastebin: pastebin get 3Bq2Sgvi object Устанавливается стандартной функцией os.loadAPI("object") или с помощью require. Под мою функцию она изначально была лучше адаптированна. Но не подумайте, со стандартной функцией работает. Изображение Потом напишу про остальные объекты.
  17. Можно: function newClass() local object, private = class() setmetatable(object, {}) --Удаляем метатаблицу object.foo(...) --Добавляем метод --<Что-нибудь> end setmetatable(object, private) --Возвращаем нашу метатаблицу назад return object, private end
  18. Я почитал про метатаблицы поподробнее и всё исправил. Оказывается запретить изменение ключей можно.
  19. Да, так. Тоже бы хотелось так, но это не возможно, так как нельзя запретить добавление значения в таблицу объекта.
  20. Начнет с программы в шесть строк, закончит офигенной системой с графическим интерфейсом... Наверное.
  21. Всё я закончил с ООП, если есть вопросы, спрашивайте.
  22. Тогда будет писать с начала строки, а нужно, чтобы писал на кнопке. Я хотел, чтобы ошибки выводились на русском языке вместе с неправильным типом заданного параметра.
  23. Данное API будет добавлять в вашу систему более удобные средства программирования разных элементов типа кнопки, картинки, процесса в виде разных объектов. Это API ещё находится в разработке, пока я добавил один элемент, кнопку. Я постарался сделать это API максимально гибким, и пока я не начал делать следующий элемент, хотелось бы услышать ваше мнение. Устанавливается всё очень просто, как любая другая библиотека. Скачать можно с pastebin. Кнопка Если есть какие-то предложения по улучшению, пишите.
  24. Я видел статью про ООП (Объектно-Ориентированного Программирования), написанную на этом форуме, и вот, что могу сказать, он может быть немного непонятен новичкам в Lua. Я всегда пользовался другим способом создания "классов". Сначала следует разобраться со значениями. Класс - это набор методов (в нашем случае функций), процедур и переменных которые дальше будут наследоваться объектом или другим классом. Объектами называют сущности, обладающие набором свойств и операций над ними. Объект - это производное класса. В Lua классов как таковых нет, но если пофантазировать, то можно представить функцию как класс, а объект как таблицу. Создание простого псевдо-класса Наследование Экономия оперативной памяти Только читаемые свойства Вывод. Этот способ реализации ООП в Lua будет работать и в OC и в СС. "Классы" очень похожи на классы из других языков программирования. В моём варианте нет двоеточия, которое приносит странную возможность обработки одного объекта методом другого. Использовать ООП в игре можно для удобной разметки интерфейса в вашей программе (например для создания кнопок), и для экономии системных ресурсов в вашем компьютере внутри компьютера.
×
×
  • Создать...