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 "#>" valuefunIdent -> "#f" alphaNumName [{ identifier }] "#>" expr "#"
varOccur -> alphaNumNamefunApp -> 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).
115
TruefalseFALSE
(1, false)(1, 2, 3)(TRUE, (FALSE, TRUE, 23))(TRUE, (false, (true, (false, false))))
1 + 11 + -13 * 45 * 15 / 19 % 24 < 91 > 205 >= 21 != 11 == 1true && falseFALSE || 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.