Lua ma ugruntowaną reputację jako półjęzyk, narzędzie, które od czasu do czasu może zostać wbudowane w skrypt aplikacji napisanej w skompilowanym języku, takim jak C++. Niemniej jednak Lua jest całkowicie niezależnym językiem, który posiada własny interpreter, możliwość tworzenia modułów, duża liczba bibliotek, a jednocześnie ten PL ma minimalną wielkość wśród analogów. Mówiąc najprościej, mamy wszystko, aby tworzyć te same aplikacje, co w perlu, pythonie i ogólnie w każdym innym powszechnym języku programowania.

Mogę przedstawić następujące powody dla Lua:

  • - aplikacje będą łatwe do przenoszenia pomiędzy Windows i Linux (nie to, że kod będzie działał bez zmian, ale portowanie będzie bezbolesne, jeśli nie zostaną użyte biblioteki specyficzne dla platformy)
  • - mały narzut stworzonych programów
  • - wysoka prędkość pracuj i pobieraj aplikacje
  • - możliwość szybkiego "przyklejenia" dowolnej biblioteki C do Twojej aplikacji - nie znajdziesz lepszego "kleju" do bibliotek
  • - ładna, minimalistyczna składnia języka, z możliwością implementacji na niej nowoczesnych paradygmatów programowania
  • - Programy Lua są bardzo łatwe do wdrożenia
  • - niskie zużycie pamięci

Aby zademonstrować moc Lua, pokażę Ci, jak używać Lua do tworzenia mały program do budowania wykresów punktowych z możliwością zapisania wykresu jako pliku graficznego.

Jako graficzny zestaw narzędzi wykorzystamy iup - wieloplatformową bibliotekę, oryginalnie stworzoną z myślą o wykorzystaniu jej z Lua.

Instalowanie pakietu Lua SDK
W ramach idei wykorzystania Lua jako samodzielnego języka programowania powstał asembler Lua for Windows, który zawiera biblioteki niezbędne do codziennych zadań, które pojawiają się podczas programowania dla określonego systemu operacyjnego: praca z bazą danych, GUI, parsowanie XML itp. Nie wstydź się, że wersja Lua jest w asemblerze 5.1, a nie 5.2 - w naszym przypadku nie ma między nimi dużej różnicy.

Pobierz i zainstaluj kompilację.

Krótki opis koncepcji iup
Długo zastanawiałem się, jak opisać proces tworzenia programu bez wchodzenia w szczegóły dotyczące urządzenia iup. I postanowiłem krótko opisać jego główne zasady:
  • - iup.dialog jest głównym elementem interfejsu programu - wszystkie elementy są umieszczone w tym kontenerze
  • - pozycjonowanie elementów w kontenerze odbywa się za pomocą layoutów: ustalanie zasad umieszczania elementu w kontenerze. Iup sam ustawi i narysuje element zgodnie z zasadami. Główne pojemniki to stelaż ramowy, miarka pionowa, miarka pozioma.
  • - programy obsługi zdarzeń są ustawione jako funkcje dołączone do widżetu
  • - po utworzeniu dialogu uruchamiana jest pętla zdarzeń
Jeśli pisałeś wcześniej dla GUI za pomocą Tk, WxWidgets lub WinAPI, to wszystko będzie brzmiało znajomo. Jeśli nie, program jest szczegółowo omówiony z komentarzami.
Kod programu

Dołączanie bibliotek iup require("iuplua") require("iupluacontrols") require("iuplua_pplot") -- biblioteka do pracy z kanwą w celu zapisania wykresu do pliku require("cdlua") require("iupluacd") require(" string ") -- zmienne globalne dla widżetów i ustawień programu -- maksymalna liczba wykresów numer_wydruku = 5 -- widżety zakładek, w których zostaną umieszczone widżety wprowadzania danych dla każdego wykresu tabs = () -- kontenery widżetów vboxes = () -- pola wyboru do wyboru wykresów do zbudowania pola wyboru = () -- tutaj przechowujemy widżety z danymi tekstowymi o punktach coords = () -- widżety etykiet dla każdego wykresu legendy = () -- widżety do wyznaczania osi współrzędnych global_legend = () -- ku największemu wstydowi, nie ma standardowej funkcji podziału Lua string:split(sep) local sep, fields = sep or ":", () local pattern = string.format("([^%s]+)", sep ) self:gsub (pattern, function(c) fields[#fields+1] = c end) return fields end -- funkcja rysuje wykres na ploterze w określonych punktach funkcja ion draw_plot(pwidget, pnum, data) x = data.value:split(",") y = data.value:split(",") if checkboxes.value == "(!LANG:OFF" then return end if not (#x == #y) or #x == 0 then iup.Message("Ошибка", "Задано неверное число точек для графика " .. pnum) return end iup.PPlotBegin(pwidget, 0) iup.PPlotAdd(pwidget, 0, 0) for i = 1,#x do iup.PPlotAdd(pwidget, x[i], y[i]) end iup.PPlotEnd(pwidget) end -- виджет отвечающий за кнопку построения графика plot_btn = iup.button{ title = "Budować"} -- колбэк для кнопки "построить график" function plot_btn:action() -- создать виджет графопостроителя plot = iup.pplot { expand="YES", TITLE = "prosta linia", MARGINBOTTOM="65", MARGINLEFT="65", AXS_XLABEL = global_legend.value, AXS_YLABEL = global_legend.value, LEGENDSHOW="YES", LEGENDPOS="TOPLEFT", size = "400x300" } -- этот блок для обхода бага - без него подпись к первому графику отображаться не будет iup.PPlotBegin(plot, 0) iup.PPlotAdd(plot,0,0) plot.DS_LEGEND = "" iup.PPlotEnd(plot) -- обходим виджеты с данными for i = 1, plots_number do -- чтобы свеженарисованный графи отобразился с правильной подписью print(legends[i].value) plot.DS_LEGEND = legends[i].value -- рисуем график draw_plot(plot, i, coords[i]) end -- кнопка сохранения графика в картинку на диске save_btn = iup.button{ title = "Ratować" } -- теперь создаем само окно, где будет отображаться график plot_dg = iup.dialog { iup.vbox -- это вертикальный сайзер, помести в него графопостроитель и кнопку { plot, save_btn }, } -- обработчик кнопки сохранения графика function save_btn:action() -- создаем диалог выбора имени файла ля сохранения -- в связи с ограничениями библиотеки сохранять можно только в EMF fs_dlg = iup.filedlg{DIALOGTYPE = "SAVE", FILTER = "*.emf" } iup.Popup(fs_dlg) -- если файл выбран if tonumber(fs_dlg.STATUS) >= 0 then -- дописать при необходимости !} pożądane rozszerzenie pic = fs_dlg.value jeśli nie (string.sub(pic, string.len(pic)-3) == ".emf") then pic = pic .. ".emf" end -- utwórz pseudokanwę skojarzoną z plikiem tmp_cv = cd.CreateCanvas(cd.EMF, pic .. " 400x300") -- kreślenie na płótnie iup.PPlotPaintTo(plot, tmp_cv) -- zapis danych do pliku cd.KillCanvas(tmp_cv) end end -- wyświetlenie okna dialogowego plot_dg: showxy(iup.CENTER, iup.CENTER) -- uruchom pętlę zdarzeń dla okna dialogowego if (iup.MainLoopLevel()==0) then iup.MainLoop() end end -- w pętli utwórz zakładki, w których umieścimy widgets - do zbierania danych dla i=1,plots_number do - tworzenie widgetów tekstowych, w których zostaną wprowadzone współrzędne punktów coords[i] = () for j = 1,2 do coords[i][j] = iup .text ( expand="POZIOMY", multiline = "TAK", WIDOCZNE LINIE = 5 ) end - widget do edycji legendy nagłówków wykresów[i] = iup.text( expand = "POZIOMY" ) - utwórz kontener kart i wypełnij jego elementy vboxy [i] = iup.vbox ( i up.hbox ( iup.label ( title = "(!LANG:Etykieta wykresu:" }, legends[i] }, iup.hbox { iup.label { title="X:", }, coords[i] }, iup.hbox { iup.label { title="Tak:", }, coords[i] }; expand="YES", } -- меняем заголовк вкладки vboxes[i].tabtitle = "Harmonogram" .. i -- создаем чекбокс, который будет указывать на то, нужно ли строить -- график по данным из указанной вкладки checkboxes[i] = iup.toggle{ title= "Harmonogram" .. i, value = "NA" } end -- теперь из заполненных нами контейнеров создаем вкладки tabs = iup.tabs{unpack(vboxes)} -- создаем текстовые виджеты для редактирования подписей осей global_legend = iup.text{} global_legend = iup.text{} -- создаем фрейм для !} Ustawienia główne ramka graficzna = iup.frame ( iup.vbox ( iup.label( title="(!LANG:Użyj danych:", expand="HORIZONTAL" }, iup.vbox { unpack(checkboxes) }, iup.label{}, -- пустую подпись можно использовать как распорку iup.label{title = "Podpisy"}, iup.hbox { iup.label{ title = "Oś X"}, global_legend }, iup.hbox { iup.label{ title = "Oś Y"}, global_legend }, iup.label{}, plot_btn }; expand = "VERTICAL", } -- создаем главное окно программы и наносим на него настройки и табы dg = iup.dialog { iup.hbox { frame, tabs }, title="Budowanie wykresu", size = "HALF" } -- показываем главное окно и запускаем обработку событий dg:showxy(iup.CENTER, iup.CENTER) if (iup.MainLoopLevel()==0) then iup.MainLoop() end !}

Kilka słów o wdrożeniu
Skrypt można uruchomić poleceniem:

Luaplotter.exe

W takim przypadku biblioteki zostaną dołączone z podkatalogu clibs/, który znajduje się w katalogu, w którym zainstalowano Lua for Windows. Aby spakować skrypt i biblioteki tak kompaktowo, jak to możliwe do przeniesienia na inny komputer, po prostu skopiuj następujące pliki do jednego folderu (wskazanego względnymi ścieżkami z katalogu instalacyjnego Lua):

Lua.exe lib/lua5.1.dll clibs/cd.dll clibs/cdlua51.dll clibs/iup.dll clibs/iup_pplot.dll clibs/iupcd.dll clibs/iupcontrols.dll clibs/iupgl.dll clibs/iuplua51.dll clibs/iuplua_pplot51.dll clibs/iupluacd51.dll clibs/iupluacontrols51.dll clibs/freetype6.dll

Nie zapomnij umieścić skryptu z programem w tym folderze. Teraz możesz przenieść ten folder na inny komputer i uruchamiać programy za pomocą powyższego polecenia. W takim przypadku nie są potrzebne żadne inne kroki w celu zainstalowania bibliotek i środowiska wykonawczego.

Niestety pliki cd.dll, cdluad51.dll i iupcd.dll mogą nie działać poprawnie w tej wersji Lua dla Windows, więc polecam pobrać je z archiwum za pomocą poniższego linku.

Wyniki
Archiwum z działającą wersją, dla wygody dodano launcher app.bat.

Zrzuty ekranu:

W rezultacie otrzymaliśmy, choć niezdarne, narzędzie, które ma taką samą funkcjonalność, jak gdyby zostało napisane w "poważnym" języku programowania. Jednocześnie jest łatwy do wdrożenia i ma łączną wagę poniżej 2 mb. Zużycie pamięci - około 7 MB. Kod źródłowy jest edytowalny, sama Lua jest interaktywnie zrozumiała, co ułatwia tworzenie takiego oprogramowania w terenie.

Moim zdaniem jest to doskonały wybór do pisania oprogramowania edukacyjnego dla szkół i instytutów, a także do użytku wewnętrznego w przedsiębiorstwach. Ponieważ słabe maszyny wciąż obfitują w podobne miejsca w całym CIS, używanie Lua w ten sposób ma sens, szczególnie w świetle stopniowego pojawiania się Linuksa na komputerach stacjonarnych. Ponadto tendencja do gubienia kodów źródłowych samodzielnie napisanego oprogramowania z jego straszliwym błędem może być utożsamiana z katastrofą narodową.

Tagi: Dodaj tagi

Wtyczka LUA - wymagana dla niektórych modów napisanych w języku hak skryptu V dla GTA 5.

Lua to skryptowy język programowania opracowany przez oddział Tecgraf (Computer Graphics Technology Group) Katolickiego Uniwersytetu w Rio de Janeiro (Brazylia). Tłumacz języka jest swobodnie rozpowszechniany, open source w języku C.

Pod względem funkcji, ideologii i implementacji język ten jest najbliższy JavaScriptowi, ale Lua ma potężniejsze i znacznie bardziej elastyczne konstrukcje. Chociaż Lua nie zawiera wprost pojęć klasy i obiektu, mechanizmy programowania obiektowego, w tym dziedziczenie wielokrotne, można łatwo zaimplementować za pomocą metatab, które są również odpowiedzialne za przeciążanie operatorów itp. Zaimplementowany model programowania obiektowego jest prototypowy (jak w JavaScript).

Wtyczka LUA do haka skryptów V

Język jest powszechnie używany do tworzenia replikowalnych oprogramowanie(na przykład jest napisane GUI Pakiet Adobe Lightroom). Popularność zyskał również jako język programowania poziomów i rozszerzeń w wielu grach (w tym World of Warcraft) ze względu na łatwość osadzania, szybkość wykonywania kodu i łatwość nauki.

Jak zainstalować

  1. Potrzebujesz zainstalowanego
  2. Następnie po prostu skopiuj wszystkie pliki z archiwum (w tym foldery) do Folder główny GTA 5.
  3. W przyszłości skrypty na LUA będą ładowane do folderu "/scripts/addins"

Lua dla Windows (LfW) to interpretowany język programowania opracowany przez oddział Tecgraf grupy Computer Graphics Technology Group na Papieskim Uniwersytecie Katolickim w Rio de Janeiro w Brazylii. Opracowany interpreter jest swobodnie rozpowszechniany, z tekstami open source w języku C.

Pod względem funkcji, ideologii i implementacji język ten jest najbliższy JavaScriptowi, ale Lua ma potężniejsze i znacznie bardziej elastyczne konstrukcje. Chociaż Lua nie zawiera wprost pojęć klasy i obiektu, mechanizmy programowania obiektowego, w tym dziedziczenie wielokrotne, można łatwo zaimplementować za pomocą metatab, które są również odpowiedzialne za przeciążanie operatorów itp. Zaimplementowany model programowania obiektowego jest prototypem (jak oraz w JavaScript).

Język jest powszechnie używany do tworzenia replikowanego oprogramowania - w szczególności jest na nim napisany interfejs graficzny pakietu. Adobe Photoshop Lightroom. Zyskał również na znaczeniu jako język programowania poziomów i rozszerzeń w wielu grach (takich jak World of Warcraft) ze względu na łatwość osadzania, szybkość wykonywania kodu i łatwość nauki.

Lua jest powszechnie określany jako język wieloparadygmatyczny. Zapewnia niewielki zestaw podstawowych mechanizmów, które można rozszerzyć w celu rozwiązywania różnych problemów, a nie zestaw złożonych, sztywnych specyfikacji, które zapewniają programowanie w jednym paradygmacie.

Na przykład nie ma wyraźnej obsługi dziedziczenia w Lua, ale można je łatwo zaimplementować za pomocą metatab.

- Rozszerzenie (format) to znaki na końcu pliku po ostatniej kropce.
- Komputer określa typ pliku dokładnie według rozszerzenia.
- Za pomocą Domyślny system Windows nie pokazuje rozszerzeń nazw plików.
- Niektóre znaki nie mogą być użyte w nazwie i rozszerzeniu pliku.
- Nie wszystkie formaty dotyczą tego samego programu.
- Poniżej znajdują się wszystkie programy, za pomocą których możesz otworzyć plik LUA.

Wielu użytkowników MS Windows od dawna zauważyło, że standardowy notatnik jest raczej niewygodnym programem w użyciu. To może być zamiennik darmowy edytor pliki tekstowe, który zapewnia obsługę składni dla dużej liczby języków programowania. Program zawiera dość szeroką gamę opcji i charakteryzuje się minimalnym zużyciem zasobów procesora. Program umożliwia jednoczesne przeglądanie kilku dokumentów jednocześnie i ich edycję bez zamykania zbędnych okien. Dostępna jest również opcja, na przykład edycja tego samego dokumentu w różne miejsca co jest bardzo wygodne...

Notepad2 to prosta aplikacja, która pozwala wpisywać i edytować tekst. Pomoże w tworzeniu stron HTML, programowaniu w różnych językach (CSS, Java, JavaScript, Python, SQL, Perl, PHP) dzięki możliwości podświetlenia kodu. Program zbudowany jest na zasadzie prostego notatnika, jest lekki i kompaktowy. Ten edytor tekstu sprawdza wszystkie nawiasy pod kątem par, obsługuje automatyczne wcięcie. Notepad2 nie tylko obsługuje kodowanie ASCII i UTF-8, ale także wie, jak je konwertować. Pozwala cofnąć niechciane operacje o wiele poziomów wstecz. Obsługuje blokowe zaznaczanie elementów tekstowych i ma ponumerowane wiersze...

Komodo Edit to poręczny edytor kodu, który obsługuje szeroką gamę różnych języków programowania. Program daje użytkownikom możliwość pracy z kilkoma plikami na raz, pisanie kodu stanie się bardziej wydajne dzięki funkcji autouzupełniania, wskazówkom. Aplikacja pozwala na automatyczne podświetlanie zmiennych po ich wybraniu. Za pomocą edytora można przeglądać pliki w innych językach programowania. Program obsługuje kolorowanie składni, wcięcia. Może sprawdzać parametry składni, fragmenty używane do przechowywania kodu kolumny źródłowej. Posiada łatwy tryb edycji i obsługuje przeciąganie i upuszczanie elementów...

W Internecie jest wiele programów umożliwiających edycję źródło inny program, plik itp. Jednak większość z tych programów to po prostu Edytor tekstu jak notatnik. Różnią się od powyższego edytora tylko tym, że mają podświetlanie składni. Jednak w niektórych przypadkach ta funkcjonalność programu nie wystarcza. Programista może potrzebować szybkiego znalezienia różnych części dokumentu. A teraz wreszcie pojawił się program, który pozwala rozwiązać ten problem. Program nazywa się SynWrite. Ją cecha wyróżniająca– obecność paska nawigacyjnego z drzewem, które ...

skrypty Lua

Skrypt napisany w Lua nie posiada żadnej specjalnej funkcji, od której rozpocznie się jego wykonanie. Skrypt można postrzegać po prostu jako zestaw poleceń (instrukcji), które są wykonywane od pierwszej instrukcji.

Skrypt może być albo bardzo prosty, składający się tylko z jednego polecenia, albo bardzo złożony, zawierający dziesiątki, setki, a nawet tysiące instrukcji. Kolejne instrukcje mogą być oddzielone średnikiem (;). Jednak to wymaganie nie jest obowiązkowe, więc cały poniższy kod jest poprawny pod względem składni:

Praca ze zmiennymi w Lua

Zmienne służą do przechowywania wartości podczas wykonywania skryptu.

Nazwy zmiennych w Lua

Nazwy zmiennych (identyfikatory) w Lua mogą być dowolnymi sekwencjami liter, cyfr i podkreśleń, które nie zaczynają się od cyfry.

Notatka

W języku Lua rozróżniana jest wielkość liter, więc abc, Abc, ABC to różne nazwy.

Poniższa tabela zawiera listę słów, które są zarezerwowane przez język Lua i nie mogą być używane w nazwach zmiennych:

i przerwij rób elseif

end false dla funkcji if

w lokalnym nil nie lub

powtórz powrót, a potem prawda, aż

Ponadto wszystkie nazwy zaczynające się od podkreślenia, po którym następuje wielkie litery(np. _VERSION) są również zastrzeżone.

Jakie są zmienne w Lua?

Zmienne w Lua mogą być globalne lub lokalne. Jeśli zmienna nie jest jawnie zadeklarowana jako lokalna, jest uważana za globalną.

Zmienne globalne Lua

Zmienna globalna pojawia się w momencie przypisania jej pierwszej wartości. Przed przypisaniem pierwszej wartości, dostęp do zmiennej globalnej daje zero.

MsgBox(tostring(g)) --> zero

MsgBox(tostring(g)) --> 1

Zmienna globalna istnieje tak długo, jak istnieje środowisko wykonywania skryptu i jest dostępna dla każdego kodu Lua wykonywanego w tym środowisku.

Jeśli to konieczne, możesz jawnie usunąć zmienną globalną, po prostu ustawiając ją na zero.

g = 1 - utwórz zmienną globalną g o wartości 1

g = nil - usuń zmienną globalną g

MsgBox(tostring(g)) --> zero

Wszystkie zmienne globalne to pola w zwykłej tabeli zwanej środowiskiem globalnym. Ta tabela jest dostępna poprzez zmienną globalną _G. Ponieważ pola środowiska globalnego są wszystkimi zmiennymi globalnymi (łącznie z samym _G), to _G._G == _G.

Zmienne lokalne Lua

Wszelkie zmienne lokalne muszą być zadeklarowane jawnie przy użyciu słowa kluczowego local. Zmienną lokalną można zadeklarować w dowolnym miejscu w skrypcie. Deklaracja może obejmować przypisanie zmiennej wartości początkowej. Jeśli nie przypisano żadnej wartości, zmienna zawiera zero.

lokalna a - zadeklaruj zmienną lokalną a

local b = 1 - zadeklaruj zmienną lokalną b, przypisz jej wartość 1

lokalne c, d = 2, 3 - zadeklaruj zmienne lokalne c i d, przypisz im wartości 2 i 3

Zakres zmiennej lokalnej rozpoczyna się po deklaracji i trwa do końca bloku.

Notatka

Zakres zmiennej to sekcja kodu programu, w obrębie której można uzyskać dostęp do wartości przechowywanej w tej zmiennej.

Blok oznacza:

ciało struktury kontrolnej (jeśli-to, else, na, while, powtórz);

ciało funkcyjne;

fragment kodu zawarty w słowach kluczowych do...end.

Jeśli zmienna lokalna jest zdefiniowana poza dowolnym blokiem, jej zakres rozciąga się na koniec skryptu.

lokalne i = 1 - zmienna i jest lokalna w skrypcie

podczas gdy ja<= a do - цикл от 1 до 5

local a = i^2 - zmienna a jest lokalna w pętli while

MsgBox(a) --> 1, 4, 9, 16, 25

MsgBox(a) -->

jeśli ja > 5 to

lokalna a - zmienna a jest lokalna wewnątrz wtedy

MsgBox(a) --> 10

MsgBox(a) --> 5 (odnosi się do globalnego a tutaj)

lokalne a = 20 - zmienna a jest lokalna wewnątrz do-end

MsgBox(a) --> 20

MsgBox(a) --> 5 (odnosi się do globalnego a tutaj)

Notatka

W miarę możliwości zaleca się używanie zmiennych lokalnych zamiast globalnych. Pozwoli to uniknąć zanieczyszczenia globalnej przestrzeni nazw i zapewni lepszą wydajność (ponieważ dostęp do zmiennych lokalnych w Lua jest nieco szybszy niż dostęp do zmiennych globalnych).

Typy danych Lua

Jakie typy danych obsługuje język Lua?

Lua obsługuje następujące typy danych:

1. Zero (nic). Odpowiada brakowi zmienna wartości. Ten typ jest reprezentowany przez pojedynczą wartość, zero.

2. Boole'owskie (logiczne). Do ten typ wartości obejmują fałsz (fałsz) i prawdę (prawdę).

Podczas wykonywania operacji logicznych wartość nil jest traktowana jako fałsz. Wszystkie inne wartości, w tym liczba 0 i pusty ciąg, są traktowane jako prawda.

3. Numer (numeryczny). Służy do reprezentowania wartości liczbowych.

Stałe numeryczne mogą być opcjonalne część ułamkowa oraz opcjonalny wykładnik dziesiętny określony znakami „e” lub „E”. Stałe liczbowe liczb całkowitych można określić w systemie szesnastkowym, używając przedrostka 0x.

Przykłady prawidłowych stałych numerycznych: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

4. Ciąg (ciąg). Używany do reprezentowania ciągów.

Wartości ciągu są określane jako ciąg znaków ujęty w pojedyncze lub podwójne cudzysłowy:

a = "to jest ciąg"

b = "to jest druga linia"

Ciągi ujęte w podwójne cudzysłowy mogą interpretować sekwencje specjalne w stylu C, które zaczynają się od znaku „\" (odwrotny ukośnik):

\b (spacja),

\n (wyjście wiersza),

\r (powrót karetki);

\t (karta pozioma),

\\ (ukośnik wsteczny);

\"" (cudzysłów);

\" (pojedynczy cytat).

Notatka

Znak w ciągu może być również reprezentowany przez jego kod za pomocą sekwencji ucieczki:

gdzie ddd to ciąg nie dłuższy niż trzy cyfry.

Oprócz cudzysłowów do zdefiniowania ciągu można również użyć podwójnych nawiasów kwadratowych:

Zdefiniowanie ciągu z podwójnymi nawiasami kwadratowymi pozwala zignorować wszystkie sekwencje specjalne, tzn. ciąg jest tworzony całkowicie zgodnie z opisem:

lokalne a = [] w Lua]=]

Pojawi się termin: "definicja string[] w Lua"

5. Funkcja (funkcja). Funkcje w Lua mogą być zapisywane w zmiennych, przekazywane jako parametry do innych funkcji i zwracane w wyniku wykonania funkcji.

6. Stół (stół). Tabela to zestaw par „klucz” - „wartość”, które nazywane są polami lub elementami tabeli. Zarówno klucze, jak i wartości pól tabeli mogą być dowolnego typu z wyjątkiem zera. Tabele nie mają ustalonego rozmiaru: w każdej chwili możesz dodać do nich dowolną liczbę elementów.

Przeczytaj więcej w artykule "Tworzenie tabel w Lua"

7. Dane użytkownika (dane użytkownika). Jest to specjalny typ danych. Wartości tego typu nie można tworzyć ani modyfikować bezpośrednio w skrypcie Lua.

Userdata służy do reprezentowania nowych typów utworzonych w wywołaniu skryptu lub w bibliotekach napisanych w C. Na przykład biblioteki rozszerzeń Lua dla "CronosPRO" używają tego typu do reprezentowania obiektów takich jak:

banki danych (klasa Bank);

bazy danych (klasa Base);

rekordy (rekord klasowy) itp.

8. Wątek (nić). Odpowiada przepływowi egzekucji. Te strumienie nie są w żaden sposób powiązane z system operacyjny i są obsługiwane wyłącznie przez samą Lua.

Jak ustawić typ zmiennej w Lua?

Lua nie określa jawnie typu zmiennej. Typ zmiennej jest ustawiany w momencie przypisania zmiennej do wartości. Każdej zmiennej można przypisać wartość dowolnego typu (niezależnie od tego, jaki typ zawierała wcześniej).

a = 123 - zmienna a ma numer typu

a = "123" - teraz zmienna a jest typu string

a = true - zmienna a jest teraz typu boolean

a = () - teraz zmienna a jest typu table

Notatka

Zmienne typu table, function, thread i userdata nie zawierają samych danych, ale przechowują odniesienia do odpowiednich obiektów. Podczas przypisywania, przekazywania do funkcji jako argumentu i zwracania z funkcji jako wyniku, obiekty nie są kopiowane, kopiowane są tylko odwołania do nich.

a = () - utwórz tabelę. Odwołanie do tabeli znajduje się w zmiennej a

b = a - zmienna b odnosi się do tej samej tabeli co a

a = 10 - element tabeli o indeksie 1 otrzymuje wartość 10

MsgBox(b) --> "10"

MsgBox(a) --> "20"

Pozostałe dane to wartości bezpośrednie.

MsgBox(a) --> "20"

MsgBox(b) --> "10"

Jak uzyskać typ zmiennej w Lua?

Typ wartości przechowywanej w zmiennej można znaleźć za pomocą standardowego typu funkcji. Ta funkcja zwraca ciąg znaków zawierający nazwę typu ("nil", "number", "string", "boolean", "table", "function", "thread", "userdata").

t = type("to jest napis") - t jest równe "napisowi"

t = typ(123) - t to "liczba"

t = typ(typ) - t jest równe "funkcji"

t = typ(prawda) - t jest "boolowskie"

t = typ(zerowy) - t to "zerowy"

t = type(CroApp.GetBank()) - t jest równe "dane użytkownika"

Jak przekonwertować typ zmiennej w Lua?

Lua automatycznie konwertuje liczby na ciągi i odwrotnie, jeśli to konieczne. Na przykład, jeśli wartość ciągu jest operandem w operacji arytmetycznej, jest konwertowana na liczbę. Podobnie wartość liczbowa napotkana w miejscu, w którym oczekiwany jest ciąg, zostanie przekonwertowana na ciąg.

a = "10" + 2 - a jest równe 12

a = „10” + 2 - a jest równe „10 + 2”

a = "-5.3e-10"*"2" - a jest równe -1,06e-09

a = "ciąg" + 2 - Błąd! Nie można przekonwertować „ciągu” na liczbę

Wartość dowolnego typu można jawnie przekonwertować na ciąg znaków za pomocą standardowej funkcji tostring.

a = tostring(10) - a to "10"

a = tostring(prawda) - a jest równe "prawda"

a = tostring(nil) - a jest równe "nil"

a = tostring (( = "to jest pole 1")) - a jest równe "tabela: 06DB1058"

Z poprzedniego przykładu widać, że zawartość tabel nie jest konwertowana przez funkcję tostring. Tę transformację można wykonać za pomocą funkcji render.

a = render(10) - a to "10"

a = render(true) - a jest równe "prawda"

a = render(nil) - a to „nil”

a = render (( = "to jest pole 1")) - a to "( = "to jest pole 1")"

Aby jawnie przekonwertować wartość na liczbę, możesz użyć standardowej funkcji tonumer. Jeśli wartość jest ciągiem, który można przekonwertować na liczbę (lub jest już liczbą), funkcja zwraca wynik konwersji, w przeciwnym razie zwraca zero.

a = tonumber("10") - a jest równe "10"

a = tonumber("10"..5") - a jest równe 10,5

a = tonumber(true) - a jest równe „zero”

a = tonumber (nil) - a jest równe „zero”

Układ komentarzy w Lua

Komentarz w Lua zaczyna się od dwóch znaków minusa (--) i ciągnie się do końca wiersza.

lokalne a = 1 - komentarz w jednej linii

Jeśli dwa otwierające nawiasy kwadratowe ([[) bezpośrednio następują po znakach „--”, komentarz jest wielowierszowy i jest kontynuowany aż do dwóch zamykających nawiasów kwadratowych (]]).

lokalne a = 1 - [[ multilinia

komentarz ]]

Nawiasy podwójne w komentarzach mogą być zagnieżdżane. Aby ich nie pomylić, między nawiasami wstawiany jest znak równości (=):

lokalne a = [[Firma Kronos]] - [=[

lokalne a = [[Firma Kronos]]

Liczba znaków „=” określa zagnieżdżenie:

lokalne a = [=[definicja jakiegoś ciągu [] w Lua]=] --[==[

lokalne a = [=[definicja jakiegoś ciągu [] w Lua]=]

Operacje używane w Lua

W wyrażeniach pisanych w Lua można stosować następujące rodzaje operacji:

1. Operacje arytmetyczne.

Lua obsługuje następujące działania arytmetyczne:

+ (dodatek);

- (odejmowanie);

* (mnożenie);

/ (podział);

^ (potęgowanie);

% (pozostała część podziału).

Notatka

Operacje arytmetyczne dotyczą zarówno liczb, jak i łańcuchów, które w tym przypadku są konwertowane na liczby.

2. Operacje porównawcze.

W Lua dozwolone są następujące operacje porównywania wartości:

== (równe);

~= (nie równe);

< (меньше);

> (większe);

<= (меньше или равно);

>= (większe lub równe).

Notatka

Operacje porównania zawsze zwracają logiczne prawda czy fałsz.

Reguły konwersji liczb na ciągi (i odwrotnie) nie działają podczas porównań, tzn. wyrażenie „0” == 0 daje fałsz.

3. Operacje logiczne.

Do operacje logiczne odnosić się:

i (logiczne AND).

Operator and zwraca swój pierwszy operand, jeśli jego wynikiem jest fałsz lub zero. W przeciwnym razie operacja zwraca drugi operand (a ten operand może być dowolnego typu).

a = (nil i 5) - a jest równe nil

a == (false i 5) - a jest fałszywe

a == (4 i 5) - a jest równe 5

lub (logiczne LUB).

Operator lub zwraca pierwszy operand, jeśli nie jest ani fałszywy, ani zero, w przeciwnym razie zwraca drugi operand.

a == (4 lub 5) - a jest równe 4

a == (fałsz lub 5) - a jest równe 5

Notatka

łamigłówka operacje i i lub może zwracać wartości dowolnego typu.

Operacje logiczne i i lub oceniają wartość drugiego operandu tylko wtedy, gdy musi zostać zwrócona. Jeśli nie jest to wymagane, drugi operand nie jest oceniany. Na przykład:

a == (4 lub f()) - funkcja f() nie zostanie wywołana

nie (logiczne NIE).

Operator not zawsze zwraca prawdę lub fałsz.

4. Działanie konkatenacji.

Aby połączyć (połączyć) ciągi, użyj operacji ... (dwie kropki).

a = "Kronos".."-".."Inform" - zmienna a otrzyma wartość "Kronos-Inform"

Notatka

Jeśli jeden lub oba operandy są liczbami, są one konwertowane na łańcuchy.

a = 0..1 - zmienna a otrzyma wartość "01"

5. Operacja uzyskania długości.

Lua definiuje operator długości #, którego można użyć do uzyskania długości łańcucha.

a = "ciąg"

len = #a - len jest równe 6

len = #"jeszcze jedna linia" - len to 10

Notatka

Możesz również użyć operatora #, aby znaleźć maksymalny indeks (lub rozmiar) tablicy. Więcej szczegółów znajdziesz w artykule „Praca z tablicami w Lua”.

Pierwszeństwo operatora w Lua

W Lua operacje wykonywane są według następującego pierwszeństwa (w porządku malejącym):

2. nie # - (jednoargumentowy)

6. < > <= >= ~= ==

Wywoływanie skryptów z formularzy

Z każdym formularzem (w tym formularzami zagnieżdżonymi) jest powiązany osobny skrypt, który zwykle zawiera funkcje obsługujące zdarzenia formularza i jego elementów.

Po uruchomieniu formularza jego skrypt jest ładowany do środowiska globalnego. Gdy wystąpi zdarzenie formularza lub jego elementu, system wywołuje funkcję obsługi powiązaną z tym zdarzeniem.

Należy zauważyć, że skrypt formularza, chociaż nie zawiera wywołania funkcji modułu, w rzeczywistości jest modułem. Oznacza to, że zmienne zadeklarowane w skrypcie formularza bez słowa kluczowego local nie są eksponowane w środowisku globalnym i są dostępne tylko w tym skrypcie. Jeśli wartość musi być udostępniona innym skryptom formularzy, musi być jawnie zdefiniowana w globalnej tabeli _G:

lokalne a = _G.var

Bloki oświadczeń (instrukcje)

Głównymi operatorami Lua są:

zadanie;

operator warunkowy;

operatorów do organizowania cykli.

Grupę instrukcji można połączyć w blok (instrukcję złożoną) za pomocą konstrukcji do...end.

do - początek bloku

<оператор1>- blok ciała

<оператор2>

<операторN>

koniec - koniec bloku

Blok otwiera nowy zakres, w którym można zdefiniować zmienne lokalne.

a = 5 - zmienna globalna a

local a = 20 - zmienna lokalna a jest zdefiniowana wewnątrz do-end

MsgBox(a) --> 20

MsgBox(a) --> 5 (tu odwołanie jest już do globalnego a)

Operator przydziału w Lua

Przypisanie zmienia wartość zmiennej lub pola tabeli. W najprostszej formie zadanie może wyglądać tak:

a = 1 - zmienna a ma przypisaną wartość 1

a = b + c - zmiennej a przypisana jest suma wartości zmiennych b i c

a = f(x) - zmiennej a przypisywana jest wartość zwracana przez funkcję f(x)

W Lua dozwolone jest tak zwane przypisanie wielokrotne, gdy kilka zmiennych po lewej stronie operatora przypisania otrzymuje wartości kilku wyrażeń zapisanych po prawej stronie operatora przypisania:

a, b = 1,5*c - a jest równe 1; b jest równe 5*c

Jeśli jest więcej zmiennych niż wartości, „dodatkowe” zmienne są przypisywane do zera.

a, b, c = 1, 2 - a jest równe 1; b wynosi 2; c równa się zero

Jeśli wartości jest więcej niż zmiennych, wartości „dodatkowe” są ignorowane.

a, b = 1, 2, 3 - a jest równe 1; b wynosi 2; wartość 3 nieużywana

Wielokrotne przypisanie może służyć do wymiany wartości między zmiennymi:

a = 10; b = 20 - a to 10, b to 20

a, b = b, a - teraz a wynosi 20, b wynosi 10

Oświadczenie warunkowe (jeśli) w Lua

jeśli stwierdzenie sprawdza prawdziwość dany warunek. Jeśli warunek jest prawdziwy, wykonywana jest następująca część kodu. słowo kluczowe następnie (wtedy sekcja). W przeciwnym razie wykonywany jest kod następujący po słowie kluczowym else (sekcja else).

jeśli a > b to

zwróć a - jeśli a jest większe od b, zwróć a

zwróć b - w przeciwnym razie zwróć b

Sekcja else jest opcjonalna.

Jeśli< 0 then

a = 0 - jeśli a jest mniejsze od 0, ustaw a na 0

Możesz użyć konstrukcji elseif zamiast zagnieżdżonych instrukcji if. Na przykład następujący kod:

będzie łatwiejszy do odczytania, jeśli zastąpisz go następującym:

zwróć "Iwan" - jeśli a jest równe 1

elseif a == 2 wtedy

zwróć "Piotr" - jeśli a jest 2

elseif a == 3 wtedy

zwróć "Sergey" - jeśli a jest równe 3

zwróć "Brak takiego gracza" - jeśli a nie znajduje się na liście

Pętla z warunkiem wstępnym (gdy) w Lua

Instrukcja while ma na celu organizowanie cykli z warunkiem wstępnym i ma następującą postać:

podczas gdy robić

... - ciało pętli

Przed każdą iteracją pętli sprawdzany jest warunek :

jeśli warunek jest fałszywy, pętla kończy się i sterowanie jest przekazywane do pierwszej instrukcji następującej po instrukcji while;

jeśli warunek jest spełniony, wykonywana jest treść pętli, po czym wszystkie akcje są powtarzane.

while i > 0 do - pętla od 10 do 1

t[i] = "pole"..i

a = (3, 5, 8, -6, 5)

while i > 0 do - szukaj ujemnej wartości w tablicy

jeśli [ja]< 0 then break end - если найдено, прерываем цикл

i = i - 1 - w przeciwnym razie przejdź do następnego elementu

jeśli ja > 0 wtedy

MsgBox("Indeks wartości ujemnej: "..i)

MsgBox("Tablica nie zawiera wartości ujemnych")

Notatka

Pętla z warunkiem końcowym (powtórzenie) w Lua

Operator powtarzania jest przeznaczony do organizowania cykli z warunkiem końcowym i ma następującą postać:

... - ciało pętli

aż do

Ciało pętli jest wykonywane aż do warunku nie stanie się prawdą. Warunek jest sprawdzany po wykonaniu ciała pętli, więc w każdym przypadku treść pętli zostanie wykonana przynajmniej raz.

Sumuj wartości tablicy a, aż suma przekroczy 10

a = (3, 2, 5, 7, 9)

suma = suma + a[i]

do sumy > 10

MsgBox("Dodano elementy ..i.. Suma równa się "..sumie)

Możesz użyć instrukcji break, aby wyrwać się z pętli przed jej zakończeniem.

Notatka

Aby uzyskać więcej informacji na temat funkcji korzystania z instrukcji break, zobacz artykuł „Wyciągi łamania i zwracania”

Pętle z instrukcją for w języku Lua

Instrukcja for służy do organizowania pętli i umożliwia dwie formy pisania:

proste (liczbowe dla);

rozszerzony (uniwersalny dla).

Prosta forma wyrażenia for

Prosta forma wyrażenia for jest następująca:

dla var = exp1, exp2, exp3 do

... - ciało pętli

Ciało pętli jest wykonywane dla każdej wartości zmienna pętli(licznik) var w zakresie od exp1 do exp2, z krokiem exp3.

Notatka

Nie można określić kroku. W tym przypadku przyjmuje się, że wynosi 1.

dla i = 1, 10 do - pętla od 1 do 10 z krokiem 1

MsgBox("i jest równe"..i)

dla i = 10, 1, -1 do - pętla od 10 do 1 z krokiem -1

MsgBox("i jest równe"..i)

Notatka

Wyrażenia exp1, exp2 i exp3 są oceniane tylko raz, przed rozpoczęciem pętli. Tak więc w poniższym przykładzie funkcja f(x) zostanie wywołana, aby obliczyć górną granicę pętli tylko raz:

dla i = 1, f(x) do - pętla od 1 do wartości zwracanej przez f()

MsgBox("i jest równe"..i)

Zmienna loop jest lokalna dla instrukcji loop i nie jest zdefiniowana na końcu pętli.

for i = 1, 10 do - pętla od 1 do wartości zwracanej przez f()

MsgBox("i jest równe"..i)

MsgBox("Po wyjściu z pętli i jest "..i") - Źle! ja równa się zero

Notatka

Wartość zmiennej pętli nie może być zmieniona wewnątrz pętli: konsekwencje takiej zmiany są nieprzewidywalne.

Instrukcja break służy do wyjścia z pętli przed jej zakończeniem.

a = (3, 5, 8, -6, 5)

for i = 1,#a do - szukaj wartości ujemnej w tablicy

jeśli [ja]< 0 then - если найдено...

index = i - zapisz indeks znalezionej wartości...

przerwać - i przerwać pętlę

MsgBox("Indeks wartości ujemnych: "..indeks)

Notatka

Aby uzyskać więcej informacji na temat funkcji korzystania z instrukcji break, zobacz artykuł „Wyciągi łamania i zwracania”