Mały, rozszerzalny język programowania używający zwięzłych wyrażeń.
Rising star czy tylko kometa?
Passerine działa na wirtualnej maszynie napisanej w Rust. Ten nowy język oprogramowania ma korzenie w językach Scheme i ML - to kulminacja wszystkiego, czego oczekują minimaliści. Tu wszystko jest tak proste jak to tylko możliwe. W swej istocie Passerine to po prostu lambda z dopasowywaniem wzorców, typami strukturalnymi, współbieżnością i rozszerzalną składnią.
Jest to pierwszy projekt The Veritable Computation Initiative. Ich celem jest ulepszanie narzędzi używanych przez programistów do pisania oprogramowania. Passerine jest obecnie rozwijany głównie przez Isaaca Claytona, o którym piszą tak: licealista, który ma zbyt dużo wolnego czasu. Czy to czyni ten język tylko ciekawostką?
Instalujemy
Pobieranie Passerine jest szybkie i łatwe. Po prostu uruchom następujące polecenie w wybranym przez siebie interpreterze powłoki: sh <(curl -sSf https://www.passerine.io/install.sh)
. Ten skrypt po prostu pobiera najnowszą wersję Passerine, buduje ją ze źródła i dodaje do $PATH
. W przyszłości mają też być rozpowszechnianie gotowe pliki binarne.
Sprawdź oferty pracy na TeamQuest
Aby utworzyć i uruchomić nowy projekt Passerine wykonaj polecenie:
aspen new hello-passerine
cd hello-passerine
aspen run
Składnia
Celem składni Passerine jest uczynienie wszystkich wyrażeń tak zwięzłymi, jak to tylko możliwe, przy jednoczesnym zachowaniu „wrażenia” różnych typów wyrażeń. Już tłumaczymy - oto definicja funkcji:
linear = m b x -> b + m * x
linear 2 3 5
-- evaluates to 13
Z tego krótkiego przykładu możemy się już dowiedzieć kilku ważnych rzeczy o Passerine. Przede wszystkim, podobnie jak inne języki programowania, Passerine używa =
do przypisania. Po lewej stronie znajduje się wzorzec - w tym przypadku tylko zmienna linear - który rozkłada wyrażenie na zestaw powiązań. Po prawej stronie jest wyrażenie; w tym przypadku wyrażenie jest definicją funkcji.
Passerine jest językiem zorientowanym na wyrażenia, dlatego wszystkie funkcje są anonimowe. Wszystkie funkcje mają więc postać p₀ ... pₙ -> e, gdzie p jest wzorcem, a e jest wyrażeniem. Passerine szanuje pierwszeństwo operatorów: 3 + 2 * 5
to 13, a nie 25. Notacja jest potężnym narzędziem - chociaż Passerine jest inspirowana lispem (jak Scheme), zapewnia całkiem przyjazną składnię.
Nasz nowy język używa też białych znaków do wywołań funkcji. Wywołanie funkcji ma postać l e₀ ... eₙ, gdzie l jest funkcją, a e jest wyrażeniem. Każda para wzorzec-wyrażenie jest odgałęzieniem - każda wartość jest skierowana do kolejnej gałęzi w kolejności, dopóki gałąź nie zostanie pomyślnie dopasowana i obliczona - wyrażenie przyjmuje wartość odpowiadającej mu gałęzi.
Błędy
Passerine używa kombinacji wyjątków i algebraicznych typów danych do obsługi błędów. Błędy, które mają wystąpić, powinny być opakowane w typ Result:
validate_length = n -> {
if length n <5 {
Result.Error "To jest za krótkie!"
} else {
Result.Ok n
}
}
Rozszerzenia
Rozszerzenia są definiowane za pomocą słowa kluczowego syntax, po którym następuje kilka wzorców argumentów, po których wreszcie mamy kod, do którego zostaną podpięte przechwycone argumenty. Oto prosty przykład: używamy makra do zdefiniowania operatora wymiany:
syntax a 'swap b {
tmp = a a = b
b = tmp
}
x = 7
y = 3
x swap y
Zobacz też nad czym spędzają większość czasu programiści.