1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Sample program which draws an arithmetic operation to the terminal
19 # Output (and input) example:
23 # Operator (+, -, *, /, %): +
26 # Space between digits: 1
56 if ( abs(self) >= 10 )
57 c = 1+(int)log10f( (float)abs(self) );
66 fun as_operator
(a
, b
: Int): Int
68 if self == '+' then return a
+ b
69 if self == '-' then return a
- b
70 if self == '*' then return a
* b
71 if self == '/' then return a
/ b
72 if self == '%' then return a
% b
76 fun override_dispc
: Bool
78 return self == '+' or self == '-' or self == '*' or self == '/' or self == '%'
81 fun lines
(s
: Int): Array[Line]
84 return [new Line(new P
(0,s
/2),1,0,s
), new Line(new P
(s
/2,1),0,1,s-2
)]
85 else if self == '-' then
86 return [new Line(new P
(0,s
/2),1,0,s
)]
87 else if self == '*' then
88 var lines
= new Array[Line]
90 lines
.add
( new Line(new P
(1,y
), 1,0,s-2
) )
93 else if self == '/' then
94 return [new Line(new P
(s-1
,0), -1,1, s
)]
95 else if self == '%' then
97 var lines
= [new Line(new P
(s-1
,0),-1,1,s
)]
99 lines
.append
([ new Line( new P
(0,l
), 1,0,q4
), new Line( new P
(s-1
,s-1-l
), -1,0,q4
) ])
102 else if self == '1' then
103 return [new Line(new P
(s
/2,0), 0,1,s
),new Line(new P
(0,s-1
),1,0,s
),
104 new Line( new P
(s
/2,0),-1,1,s
/2)]
105 else if self == '2' then
106 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
/2),
107 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,s
/2), 0,1,s
/2),
108 new Line( new P
(0,s
/2), 1,0,s
)]
109 else if self == '3' then
110 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
111 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,s
/2), 1,0,s
)]
112 else if self == '4' then
113 return [new Line(new P
(s-1
,0),0,1,s
), new Line( new P
(0,0), 0,1,s
/2),
114 new Line( new P
(0,s
/2), 1,0,s
)]
115 else if self == '5' then
116 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,s
/2),0,1,s
/2),
117 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
/2),
118 new Line( new P
(0,s
/2), 1,0,s
)]
119 else if self == '6' then
120 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,s
/2),0,1,s
/2),
121 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
),
122 new Line( new P
(0,s
/2), 1,0,s
)]
123 else if self == '7' then
125 var tr
= new P
(s-1
,0)
126 return [new Line(tl
, 1,0,s
), new Line(tr
,-1,1,s
)]
127 else if self == '8' then
128 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
129 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
),
130 new Line( new P
(0,s
/2), 1,0,s
)]
131 else if self == '9' then
132 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
133 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
/2),
134 new Line( new P
(0,s
/2), 1,0,s
)]
135 else if self == '0' then
136 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
137 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
)]
139 return new Array[Line]
149 # hack is to support a bug in the evaluation software
150 fun draw
(dispc
: Char, size
, gap
: Int, hack
: Bool)
152 var w
= size
* length
+(length-1
)*gap
154 var map
= new Array[Array[Char]]
156 map
[x
] = new Array[Char].filled_with
( ' ', h
)
160 for c
in self.chars
do
162 if c
.override_dispc
then
168 var lines
= c
.lines
( size
)
170 var x
= line
.o
.x
+ci
*size
173 for s
in [0..line
.len
[ do
174 assert map
.length
> x
and map
[x
].length
> y
else print
"setting {x},{y} as {local_dispc}"
175 map
[x
][y
] = local_dispc
185 for c
in [0..size
[ do
186 map
[c
][0] = map
[map
.length-size
+c
][0]
187 map
[map
.length-size
+c
][0] = ' '
214 if "NIT_TESTING".environ
== "true" then
222 printn
"Left operand: "
225 printn
"Right operand: "
228 printn
"Operator (+, -, *, /, %): "
229 op_char
= gets
.chars
[0]
231 printn
"Char to display: "
232 disp_char
= gets
.chars
[0]
234 printn
"Size of text: "
235 disp_size
= gets
.to_i
237 printn
"Space between digits: "
241 var result
= op_char
.as_operator
( a
, b
)
243 var len_a
= a
.n_chars
244 var len_b
= b
.n_chars
245 var len_res
= result
.n_chars
246 var max_len
= len_a
.max
( len_b
.max
( len_res
) ) + 1
249 var d
= max_len
- len_a
251 for i
in [0..d
[ do line_a
+= " "
253 line_a
.draw
( disp_char
, disp_size
, disp_gap
, false )
257 d
= max_len
- len_b-1
258 var line_b
= op_char
.to_s
259 for i
in [0..d
[ do line_b
+= " "
261 line_b
.draw
( disp_char
, disp_size
, disp_gap
, false )
265 for i
in [0..disp_size
*max_len
+(max_len-1
)*disp_gap
] do
272 d
= max_len
- len_res
274 for i
in [0..d
[ do line_res
+= " "
275 line_res
+= result
.to_s
276 line_res
.draw
( disp_char
, disp_size
, disp_gap
, false )