Demonstracja funkcjonalności DSLExecutora

Przyszedł czas na mój przedostatni post w konkursie “Daj Się Poznać”. Najwyższa pora, aby zacząć podsumowania prac. Dzisiaj przedstawię podsumowanie tego, co udało mi się zaimplementować – tak jak obiecywałem, zaprezentuję aplikację demonstrującą możliwości DSLExecutora.

Krótka piłka: aplikacja dostępna jest tutaj. Jej działanie jest bardzo proste:

  1. W polu “Input” wpisz komendy do wykonania.
  2. Naciśnij przycisk “Run”.
  3. W polu “Result” pojawi się wynik podanych komend.
  4. W polu “Log” pojawią się zalogowane przez Ciebie informacje.

Jak widać po urlu, aplikacja stoi na darmowym koncie na Azure. Zbudowana jest na ASP.NET Core. Ostrzegam, że bardzo wolno wstaje (mam szczerą nadzieję, że to wina darmowego konta, a nie samego Azure lub ASP.NET Core). Kod apki jest dostępny na GitHubie – obok reszty projektów DSLExecutora – ale nie daję do niego linka, bo jest bardzo… roboczy :) .

Dostępne funkcje i literały

Załadowana biblioteka standardowa zawiera następujące funkcje:

  • Add [int, int -> int] – dodawanie dwóch liczb całkowitych,
  • Sub [int, int -> int] – odejmowanie dwóch liczb całkowitych,
  • Log [object -> void] – wypisanie argumentu do loga,
  • String [object -> string] – wywołanie ToString() na argumencie.

Dostępne literały opisałem tutaj.

Przykłady komend do wykonania

Cały zapis wejściowy kompiluje się do zbioru wyrażeń (BatchExpression), więc jego wynikiem jest wynik ostatniego wywołania funkcji. Wyniki pozostałych funkcji są ignorowane, więc aby ślad ich wykonania był widoczny, funkcje te powinny modyfikować stan systemu (w tym celu powstała funkcja Log, która tworzy log wypisywany na ekranie).

A oto przykłady różnych zapisów wejściowych (zapraszam do wypróbowania tych i własnych komend):

Poprawne
  • Przykład, który często przewijał się w postach:
 
Log('Calculating...') 
Sub(Add(1 2) 3) 
  • Zagnieżdżanie wywołań funkcji:
 
Add(Add(Add(Add(Add(1 1) 1) 1) 1) 1) 
  • Logowanie wartości o różnych typach:
 
Log(1) 
Log(1.1) 
Log(true) 
Log('1') 
Log(Add(1 0)) 
Log(null) 
Niepoprawne
  • Błąd składni:
 
Add 1 2 
  • Niewłaściwa liczba argumentów funkcji:
 
Add(1) 
  • Zły typ argumentu funkcji:
 
Add(1 '2') 
  • Próba wywołania nieistniejącej funkcji:
 
Mul(2 3) 

To by było na tyle, efekt trzymiesięcznej pracy (a właściwie pracy po pracy) jest widoczny jak na dłoni. Wygląda trochę jak język programowania, a “trochę jak język programowania” to mniej więcej definicja DSL, więc mam powody do zadowolenia.

Kolejny post będzie ostatnim wpisem konkursowym. Przeznaczę go na podsumowanie mojego udziału w “Daj Się Poznać” – zapraszam!