FEli pozwala na tworzenie programów z wykorzystaniem schematów blokowych. Jest wzorowany na programie Eli, który mimo swojego wieku, ciągle jest wykorzystywany w polskich szkołach.
Główne założenia projektu to:
FEli jest rozprowadzane na licencji MIT, której treść można znaleźć w pliku License.txt. Licencje wykorzystanych bibliotek można znaleźć w sekcji Biblioteki.
Aplikacja wykorzystuje następujące biblioteki:
Aplikacja opiera swoje działanie na projektach, które zawierają plansze, zawierające kod programu, czyli bloki z ewentualnymi skryptami. Każdy projekt może składać się z teoretycznie nieograniczonej ilości plansz. Projektowi przypisuje się tzw. silnik wykonywania oraz silnik skryptów już przy tworzeniu i nie można tego później zmienić z poziomu interfejsu.
Głównym elementem każdego programu są bloki, które określają przepływ programu. Ogólnie dostępne bloki to:
Start
oraz Finish
;FunctionDefinition
, FunctionReturn
oraz FunctionCall
;Script
(dostępny wszędzie, ale niewspierany przez niektóre silniki skryptów);Dodatkowo dla każdej kombinacji silnik wykonywania + silnik skryptów można dodawać dodatkowe bloki(i tak np. dla silnika SimpleScriptingEngine
dostępne są bloki reprezentujące podstawowe operacje matematyczne).
Każdy projekt musi posiadać dokładnie jeden punkt wejścia, oznaczany blokiem Start
oraz dowolną ilość wyjść(blok Finish
). By zdefiniować funkcję, należy wykorzystać blok FunctionDefinition
. Takiej funkcji można nadać nazwę oraz przyjmowane parametry. Ważne jest, by pamiętać o zakończeniu funkcji blokiem FunctionReturn
, nie Finish
. Mimo, iż to będzie działać, nie jest uznawane za poprawne. Bloki skryptów i warunków mają składnie zależną od wykorzystywanego silnika skryptów(o czym dalej).
FEli opiera swoją budowę na dwóch rodzajach silników. Jednymi z nich są silniki wykonywania, które decydują, jak program się będzie zachowywał po napotkaniu danego bloku. Domyślny silnik(DefaultRunner
) jest bardzo przewidywalny - wykonuje bloki "jeden po drugim", pozwalając na skoki do funkcji i powroty z nich(imituje w niewielkim stopniu działanie jednordzeniowych procesorów). Oparty na nim jest ConsoleRunner
(widoczny jako Konsola), który pozwala na wysyłanie i pobieranie informacji na/z konsolę(aktualnie tylko systemy z rodziny Windows są wspierane).
Jednym z podstawowych założeń aplikacji była obsługa dynamicznie typowanych skryptów. Osiągnięte zostało to przez wykorzystanie typów dynamicznych(dostępnych od C# 4.0) oraz DLR. Każda zmienna może być konwertowana na inny typ, o ile taka konwersja jest możliwa(np. ciąg znaków '123'
może bez problemu zostać skonwertowany na wartość liczbową).
Silniki skryptów nie wspierają wywoływania funkcji zdefiniowanych przez użytkownika.
Ctrl+O
- otwórz projekt,Ctrl+S
, Ctrl+Shift+S
- zapisz projekt/zapisz projekt jako,Ctrl+Shift+N
- nowy projekt,Ctrl+N
- dodaj nową planszę,Ctrl+Z
, Ctrl+Shift+Z
- cofnij/powtórz cofniętą akcję,F5
- start/krok(zależnie od kontekstu),Ctrl+F5
- uruchom cały algorytm.Ctrl+C
, Ctrl+X
, Ctrl+V
- kopiuj, wytnij, wklej bloki(domyślnie tylko w ramach jednego projektu)Dodatkowo, przytrzymanie Ctrl
przy dodawaniu bloków na planszę, powoduje nieodznaczenie wybranego bloku, co pozwala na szybkie dodanie kilku bloków tego samego typu.
Domyślnie można wybrać tylko jeden blok na planszy. Zachowanie to można zmienić przytrzymując klawisz Ctrl
, co pozwoli na wybranie kilku bloków.
Kopiowane/wycinane bloki mogą być przenoszone między planszami w ramach projektu. Wklejając, ich ułożenie jest zachowane i ewentualne bloki, które przeszkadzały, będą nadpisane. Gdy istnieje możliwość wklejenia bloków, aplikacja pozwoli na wybranie pustego pola.
ConsoleRunner
(Konsola)Imituje działanie procesora(bazuje na DefaultRunner
, opisanym wcześniej), oraz udostępnia następujące funkcje:
Write(string)
- wypisuje podany ciąg znaków na konsole,WriteLine(string)
- wypisuje ciąg znaków na konsole i przechodzi do nowej linii,Read()
- wczytuje jeden znak z konsoli,ReadLine()
- wczytuje pełną linie,ClearConsole()
- czyści konsolę,Beep()
- odtwarza dźwięk beep przez głośnik konsoli.SimpleScriptingEngine
(Prosty język skryptów)Silnik ten nie udostępnia skryptów jako takich, pozwala jedynie na wywoływanie wbudowanych funkcji i operacje na zmiennych(odczyt/zapis). Wszystkie obliczenia odbywają się za pomocą bloków.
Silnik udostępnia następujące funkcje:
InitRandom(seed)
, Random()
, RandomRange(min, max)
- operacje na generatorze liczb pseudolosowych,GetTime()
- pobranie czasu Uniksa,FormatTime(time)
- formatuje czas Uniksa na ciąg znaków,CreateTimer()
, StartTimer(timer)
, StopTimer(timer)
, ResetTimer(timer)
, GetElapsed(timer)
- operacje na timerach,ReadFile(file)
, WriteFile(file, content)
- operacje na plikach,IsDouble(value)
, IsInteger(value)
- sprawdza, czy wartość jest podanego typu,ToString(value)
, ToDouble(value)
, ToInteger(value)
- konwertuje wartości na dany typ,StringLength(string)
- pobiera długość ciągu znaków.CLikeEngine
(Dialekt C)Oparty na Irony
, implementuje język skryptowy podobny do języka C. Obsługuje podstawowe operacje matematyczne, operacje na zmiennych i zmiennych tablicowych oraz wywoływanie funkcje wbudowanych. Nie obsługuje operacji binarnych.
Tablicach są wzorowane na tablicach z języka JavaScript(są dynamiczne, oparte na System.Collections.Generic.List).
Tablice tworzy się przez przypisanie do zmiennej wyrażenia [element1, element2, ..., elementN]
, gdzie element1
itp. to kolejne elementy tablicy.
Odwołanie do elementu odbywa się z wykorzystaniem operatora indeksowania [indeks]
, gdzie indeks
to dynamicznie obliczany indeks elementu. Dodanie nowego elementu do tablicy jest wykonywane poprzez dodanie do nazwy zmiennej operatora indeksowania, BEZ podawania indeksu(np. tablica[]
) i przypisanie do tego wyrażenia jakiejś wartości.
Tablice można również wykorzystywać w blokach, zachowując taką samą składnie jak w funkcjach.
W odróżnieniu od C, używając tego silnika ważne są nowe linie - każda instrukcja musi być w oddzielnej linii. Wyjątkiem jest zagnieżdżanie instrukcji, wtedy na jedną linie przypada ich więcej.
Silnik ten wspiera wszystkie funkcje obecne w SimpleScriptingEngine
oraz:
ArrayLength(array)
- pobiera aktualną długość tablicy,ArrayToString(array)
- konwertuje tablicę na ciąg znaków.Bazuje na IronRuby. Nie pozwala na wywoływanie wbudowanych funkcji inaczej niż za pomocą bloku Script
. Operacje na zmiennych są dozwolone(ale nie są wspierane zmienne tablicowe inaczej niż z poziomu skryptów).
Autorem FEli oraz biblioteki FLib jest Jakub Fijałkowski - uczeń, pasjonat programowania.
Kontakt: