Votre langage de programmation fonctionnelle doit supporter au minimum les fonctionnalités suivantes :
- Définition de fonctions (non-récursives)
- Définition de variables
- Littéraux entiers, Booléens, tuples
- Occurrences de variable
- Applications de fonction
- Expressions let-in avec plusieurs définitions
- Ex-pressions case-of sans gardes avec motifs universel, variable, littéraux
- Opérations unaires, binaire
iiii
###### ###### i::::i
#::::# #::::# iiii
#::::# #::::#
######::::######::::######iiiiiii eeeeeeeeeeee rrrrr rrrrrrrrr
#::::::::::::::::::::::::#i:::::i ee::::::::::::ee r::::rrr:::::::::r
######::::######::::###### i::::i e::::::eeeee:::::eer:::::::::::::::::r
#::::# #::::# i::::i e::::::e e:::::err::::::rrrrr::::::r
#::::# #::::# i::::i e:::::::eeeee::::::e r:::::r r:::::r
######::::######::::###### i::::i e:::::::::::::::::e r:::::r rrrrrrr
#::::::::::::::::::::::::# i::::i e::::::eeeeeeeeeee r:::::r
######::::######::::###### i::::i e:::::::e r:::::r
#::::# #::::# i::::::ie::::::::e r:::::r
#::::# #::::# i::::::i e::::::::eeeeeeee r:::::r
###### ###### i::::::i ee:::::::::::::e r:::::r
iiiiiiii eeeeeeeeeeeeee rrrrrrr
Nicolas Crausaz & Maxime Scharwath
Language "Hachier / #ier"
expr -> value
| identifier
| varOccur
| funApp
| letIn
| caseOf
| unaryExpr
| binaryExpr
char -> ( [a-z] | [A-Z] )
bool -> ( True | False )
num -> [0-9]
int -> { num }
tuple -> "(" value "," value ")"
value -> ( bool | int | tuple )
alphaNumName -> char { char | int }
identifier -> ( varIdent | funIdent )
varIdent -> "#v" alphaNumName "#>" value
funIdent -> "#f" alphaNumName [{ identifier }] "#>" expr "#"
varOccur -> alphaNumName
funApp -> alphaNumName "(" [{ expr }] ")"
letIn -> "#l" { identifier } "#>" expr "#"
caseOf -> "#c" expr { caseBranch } "#"
caseBranch -> "#o" ( varOccur | value ) "#>" expr "#"
-
unary -> ( "-" | "!" )
-
arithmetic -> ( "+" | "-" | "*" | "/" | "%" )
-
comparison -> ( "==" | "!=" | "<" | ">" | "<=" | ">=" )
-
binary -> ( arithmetic | comparison )
-
unaryExpr -> unary expr
-
binaryExpr -> expr binary expr
Ce language s'appelle #ier (se prononce hachier
).
1
15
True
false
FALSE
(1, false)
(1, 2, 3)
(TRUE, (FALSE, TRUE, 23))
(TRUE, (false, (true, (false, false))))
1 + 1
1 + -1
3 * 4
5 * 1
5 / 1
9 % 2
4 < 9
1 > 20
5 >= 2
1 != 1
1 == 1
true && false
FALSE || TRUE
#v name #> 10
- name``
#l
#v a #> 1
#v b #> 2
#> a + b #
#c var
#o 1 #>
2
#
#o 3 #>
1
#
#o 5 #>
10
#
#>
-6
#
#
#f name p1, p2 #> p1 + p2 #
name (1, 2)
██╗ ██╗ ██╗███████╗██████╗
████████╗██║██╔════╝██╔══██╗
╚██╔═██╔╝██║█████╗ ██████╔╝
████████╗██║██╔══╝ ██╔══██╗
╚██╔═██╔╝██║███████╗██║ ██║
╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
#v hachier #>
(#c
#l
#v z #> 5
#v y #> #l
#v a #> 1 + 2
#f b x #> x * x #
#> b(5 + a) #
#> y * z #
#o 5 #> 6 #
#o 6 #> 7 #
#> 8 #
#, 5 > 2, 4 + 2, !(5 >= 4) )
La valeur de hachier est: ([8,True,6,False])
(#c #l #v z #> 5 #v y #> #l #v a #> 1 + 2 #f b x #> x * x # #> b(5 + a) # #> y * z # #o 5 #> 6 # #o 6 #> 7 # #> 8 # #, 5 > 2, 4 + 2, (!(5 >= 4), 44 / 2) )
Résultat: ([8,True,6,([False,22])])
Dans un Let In, les variables ne sont accessibles uniquement dans le in et pas dans le Let.