This repository was archived by the owner on Oct 4, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnatrix.nx
78 lines (49 loc) · 2.43 KB
/
natrix.nx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// isto é um comentário
// a linguagem natrix é uma linguagem simples para computação numerica elementar
// trabalha com inteiros (64 bits) e intervalos de inteiros positivos, tem vetores definidos com base nestes intervalos
// dispõe também de uma estrutura condicional e de uma estrutura ciclíca
// finalmente natrix tem funções (passagem por valor)
// maxint e minint são *constantes* que existam por omissão na linguagem
// a palavra chave type introduz definições de tipos (com respectivo nome)
// por exdmplo intervalos são introduzidos desta forma
type i = [10 .. 20] ;
type i_max =[10 .. maxint] ;
// uma restrição: os intervalos são sempre sobre *valores* positivos
// podemos introduzir tipos de vectores desta forma
type arr = array i of i_max ;
// as variáveis da linguagem natrix são variáveis mutáveis (à la C) são tipadas (explicitamente) e necessariamente inicializadas
// Não há possibilidade das variáveis serem não inicializadas
var x : int = 5 ;
var y : i_max = 10 ;
var tab1 : arr filled by 0 ;
var tab2 : array 10 of int filled by 1 ;
// quando o vector é declarado sem o intervalo dos seus índices,
// o vector tem de ter a informação do seu tamanho, aqui o tamanho é 10
// o intervalo do índice é então 0..9
// a atribuição e expressões numéricas (exemplos ilustrativos)
// as expressões são as mesmas do que a linguagem arith, com o acréscimo
// da função size que devolve o tamanho dos intervalos e dos vectores
x := x + size(30..35) + size(tab1) ;
tab[5] := let y = x + 3 in y * 5 ; // potencialmente dá erro se o resultado está fora do intervalo i_max
// dispomos em natrix de uma instrução print para mostrar valores numéricos
print( x + 1 ) ;
// natrix dispõe de uma instrução condicional if clássica
if (x > 7) then { y := y + 1 ; }
else { y := y + 2 ; }
// as condições seguem o padrão clássico (=, != , <, <=, >, >=, &, |)
// finalemente natrix fornece ciclos deterministas
foreach i in 1..19 do { x := x + i; y = i * 2;}
// um programa natrix é uma sequência de instruções como as que foram acima apresentados
// um exemplo completo de um programa natrix
type t = 0 .. 1000 ;
type arr : array t of int;
var a : arr filled by 0;
var n2 : int = 0 ;
var n1 : int = 1 ;
a[0] := 0 ;
a[1] := 1 ;
foreach i in 2 .. 1000 do {a[i] := a[i-1] + a[i-2];}
print(a[1000]);
var tmp : int = 0 ;
foreach i in t do {tmp:= n1; n1:= n2 + n1; n2 := tmp;}
print(n1);