https://github.com/lpogic/fusy
Język programowania Fusy
https://github.com/lpogic/fusy
java programming-language scripting-language
Last synced: 10 months ago
JSON representation
Język programowania Fusy
- Host: GitHub
- URL: https://github.com/lpogic/fusy
- Owner: lpogic
- Created: 2021-07-27T09:26:42.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2022-03-05T17:48:28.000Z (almost 4 years ago)
- Last Synced: 2025-02-04T22:39:21.855Z (12 months ago)
- Topics: java, programming-language, scripting-language
- Language: Java
- Homepage:
- Size: 874 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Interpreter Fusy dla JVM
Projekt kompilatora i środowiska uruchomieniowego dla aplikacji tworzonych w języku Fusy.
## Użycie
1. Pobierz i rozpakuj najnowszą wersję skompilowaną
2. Uruchom plik launch.bat
3. Podaj lokalizację pliku ze skryptem (np. przeciągając plik ze skryptem na obszar terminala) i naciśnij Enter
Po zakończeniu wykonywania skryptu można uruchomić kolejny wykonując krok 3, albo zamknąć terminal wpisując 'exit'.
# Fusy
Eksperymentalny język programowania do szybkiego tworzenia niewielkich aplikacji.
# Próbka
(rozwiązanie zadania http://rosettacode.org/wiki/Dijkstra%27s_algorithm)
```
\\ 2x BACKSLASH = komentarz do końca linii
\\\
3x BACKSLASH = komentarz zamykany kolejną sekwencją 3x BS
\\\
\\ Przypisz nowej zmiennej "startNode" wartość "a"(String)
#startNode = "a"
\\ Uniwersalna struktura danych "Subject" jako zbiór liter od "a" do "f"
#vertices = [ .a[] .b[] .c[] .d[] .e[] .f[] ]
#edges = []:merge[ \\ Wywołanie metody "merge" na pustym Subject
.a [ .b [ 7 ] ]
.a [ .c [ 9 ] ]
.a [ .f [ 14 ] ]
.b [ .c [ 10 ] ]
.b [ .d [ 15 ] ]
.c [ .d [ 11 ] ]
.c [ .f [ 2 ] ]
.d [ .e [ 6 ] ]
.e [ .f [ 9 ] ]
] \\ Subject jako drzewo
@record Link( Object from, Object to, Integer cost, Object lastNode) < \\ Definicja rekordu "Link"
#input = []
#output = []
\\ Iterowanie po całej kolekcji; Wywołanie metody "eachRaw" bez argumentów; z użyciem kropki i nawiasów
for #v vertices.eachRaw()
if !startNode.equals(v)
\\ Przypisanie do zmiennej "iclass" klasy Integer
#iclass = @Integer
input.set(new Link(startNode, v, edges.in(startNode).in(v).as(iclass, null), startNode))
< \\ Domknięcie if-a
< \\ Domknięcie for-a
\\ Nagłówek funkcji "lowestCost", przyjmującej argument "input" typu Subject i zwracającej obiekt typu Link
@Link lowestCost(Subject input)
\\ "@(l) return l.cost() != null <" to funkcja lambda ( dłuższa forma )
#withCost = input.eachAs(@Link).select(@(l) return l.cost() != null )
\\ Wywołanie metody "first" bez argumentów; z użyciem dwukropka i z pominięciem nawiasów
#lowest = withCost:first
\\ for i if w postaci jednoliniowej ( z przecinkiem jako separator )
for #l withCost, if lowest:cost > l:cost, lowest = l
return lowest
< \\ Domknięcie funkcji "lowestCost"
\\ "@> lowestCost(input)" to krótsza forma funkcji lambda bez argumentów
for #lc pull(@> lowestCost(input))
if lc == null, break
input.unset(lc)
output.put(lc:to, lc:lastNode)
for #l edges.in(lc:to)
for #i input.eachAs(@Link)
#sumCost = l:in:asInt + lc:cost
if i:to:equals(l:one) && (i:cost == null || i:cost > sumCost)
input.swap(i, new Link(i:from, i:to, sumCost, lc:to))
<
<
<
<
@void printOutput(Subject output)
#c = output:reverse:cascade
for #o c
\\ Operator wyboru ( isTrue ? valueIfTrue !! valueIfFalse )
out:print(c:firstFall ? "[ " !! "\n ")
\\ Formatowany String z użyciem { wyrażenie, które zostanie sprowadzone toString }
out:print("{ o:in:raw }-->{ o:raw }")
<
out:println(" ]")
<
out:println("Output:")
printOutput(output)
@Subject shortestPath(Subject output, String from, String to)
#path = [ to ]
while !Objects.equals(path:last:raw, from), path.alter(output.in(path:last:raw))
> path \\ Krótka forma "return path"
<
@void printPath(Subject path)
#c = path:reverse:cascade
for #o c
out:print(c:firstFall ? "[ " !! "-->")
out:print(o:raw)
<
out:println(" ]")
<
out:println("\nShortest path from 'a' to 'e':")
printPath(shortestPath(output, "a", "e"))
out:println("\nShortest path from 'a' to 'f':")
printPath(shortestPath(output, "a", "f"))
```
wyjście:
```
Output:
[ d-->e
c-->d
c-->f
a-->c
a-->b ]
Shortest path from 'a' to 'e':
[ a-->c-->d-->e ]
Shortest path from 'a' to 'f':
[ a-->c-->f ]
```
Więcej przykładów na https://github.com/lpogic/fusy-rosetta-code