Skip to content
This repository was archived by the owner on Jul 29, 2024. It is now read-only.

Commit cb184c8

Browse files
Merge print and println into Printable trait (#158)
1 parent a8d1221 commit cb184c8

39 files changed

+756
-690
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,15 @@
2929
* [x] Fix memory leak due to pointers to builtin types
3030
* [x] Destructors for parameters
3131
* [x] No tmps for literals inside of constructors
32+
* [x] Fix recursive trait (AsString with prints)
3233
---
3334
### Current task
34-
* [ ] Sum of series benchmark
35+
* [ ] Benchmark for linear algebra
3536
---
37+
* [ ] Sum of series benchmark
38+
* [ ] Find test that is taking infinite time
39+
* [ ] Use traits to check for `clone` and `destructoy` functions
3640
* [ ] Forbid recursion without `@recursive` annotation
37-
* [ ] Fix recursive trait (AsString with prints)
3841
* [ ] Generate clone for types with clonable members
3942
* [ ] Generate destructors for types with destructible members
4043
* [ ] Add type aliases

ppl/src/array.ppl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use core.*
22

33
use math.*
44
use memory.*
5-
use as_string.*
5+
use printable.*
66

77
/// Array of values
88
type Array<T>:
@@ -48,7 +48,7 @@ fn<T> push <x: T> to <array: &mut Array<T>>:
4848
fn<T> <array: &Array<T>> is empty => array.size == 0
4949
fn<T> <array: &Array<T>> is not empty => array.size > 0
5050

51-
fn<U: AsString> String from <array: &Array<U>> -> String:
51+
fn<U: Printable> String from <array: &Array<U>> -> String:
5252
let mut str = "["
5353
if array is not empty:
5454
str += (String from array[0])

ppl/src/as_string.ppl

Lines changed: 0 additions & 11 deletions
This file was deleted.

ppl/src/lib.ppl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ use f64.*
66
use memory.*
77
use threads.*
88
use math.*
9-
use as_string.*
9+
use printable.*

ppl/src/printable.ppl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use core.*
2+
3+
/// Trait for things that may be printed
4+
trait Printable:
5+
fn String from <:Self> -> String
6+
7+
fn print <x: Self> => print (String from x)
8+
9+
fn println <x: Self> => println (String from x)

src/ir/to_ir.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,12 @@ impl<'llvm> DeclareGlobal<'llvm> for FunctionData {
289289
context.module.add_function(
290290
&self.mangled_name(),
291291
ty,
292-
// Private linkage for monomorphized generic functions
293-
if self.generic_types.is_empty() || self.mangled_name.is_some() {
294-
None
295-
} else {
292+
// Private linkage for monomorphized generic functions or functions from traits
293+
if self.mangled_name.is_none() && (!self.generic_types.is_empty() || self.tr.is_some())
294+
{
296295
Some(Linkage::Private)
296+
} else {
297+
None
297298
},
298299
)
299300
}

src/semantics/contexts/function.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,21 @@ impl FindDeclaration for FunctionContext<'_> {
5959
fn parent(&self) -> Option<&dyn FindDeclaration> {
6060
Some(self.parent as _)
6161
}
62+
63+
fn functions_with_n_name_parts(&self, n: usize) -> Vec<Function> {
64+
let mut functions: Vec<_> = self
65+
.functions_with_n_name_parts_here(n)
66+
.into_iter()
67+
.chain(
68+
FindDeclaration::parent(self)
69+
.and_then(|p| Some(p.functions_with_n_name_parts(n)))
70+
.unwrap_or_default(),
71+
)
72+
.collect();
73+
// TODO: allow recursion, if has @recursive
74+
functions.retain(|f| *f != self.function);
75+
functions
76+
}
6277
}
6378

6479
impl AddDeclaration for FunctionContext<'_> {

src/tests/snapshots/ppl__tests__address_of.hir.snap

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,17 @@ fn<Integer> address of <ref: Reference<Integer>> -> MemoryAddress
2020
fn<Integer> <ty: Type<Integer>> at <address: MemoryAddress> -> ReferenceMut<Integer>
2121

2222
@mangle_as("integer_as_string")
23-
fn String from <:Integer> -> String
23+
fn String from <$arg0: Integer> -> String
24+
25+
fn println <x: Integer> -> None:
26+
let $tmp@176: None = println String from (x:Integer)
27+
return ($tmp@176:None)
2428

25-
fn<Integer> println <x: Integer> -> None:
26-
let $tmp@314: None = println String from (x:Integer)
27-
return ($tmp@314:None)
2829

2930

3031
@mangle_as("integer_as_string")
31-
fn String from <:Integer> -> String
32+
fn String from <$arg0: Integer> -> String
3233

33-
fn<Integer> println <x: Integer> -> None:
34-
let $tmp@314: None = println String from (x:Integer)
35-
return ($tmp@314:None)
34+
fn println <x: Integer> -> None:
35+
let $tmp@176: None = println String from (x:Integer)
36+
return ($tmp@176:None)

src/tests/snapshots/ppl__tests__array.hir.snap

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ fn<Integer> <$arg0: Type<Integer>> [ ] -> Array<Integer>:
4242

4343

4444
fn<Integer> iterator for <array: Reference<Array<Integer>>> -> Iterator<Integer>:
45-
let $tmp@1686: Iterator<Integer> = Iterator<Integer> { array: (array:Reference<Array<Integer>>), index: 0 }
46-
return ($tmp@1686:Iterator<Integer>)
45+
let $tmp@1687: Iterator<Integer> = Iterator<Integer> { array: (array:Reference<Array<Integer>>), index: 0 }
46+
return ($tmp@1687:Iterator<Integer>)
4747

4848

4949
fn<Integer> String from <array: Reference<Array<Integer>>> -> String:
@@ -59,14 +59,15 @@ fn<Integer> String from <array: Reference<Array<Integer>>> -> String:
5959
destroy (i:Integer)
6060

6161
(&str:ReferenceMut<String>) += "]"
62-
let $tmp@1461: String = clone (str:String)
62+
let $tmp@1462: String = clone (str:String)
6363
destroy (str:String)
64-
return ($tmp@1461:String)
64+
return ($tmp@1462:String)
6565

6666

67-
fn<Array<Integer>> println <x: Array<Integer>> -> None:
68-
let $tmp@314: None = println String from (x:Array<Integer>)
69-
return ($tmp@314:None)
67+
fn println <x: Array<Integer>> -> None:
68+
let $tmp@176: None = println String from (x:Array<Integer>)
69+
return ($tmp@176:None)
70+
7071

7172

7273
fn<Integer> <array: Reference<Array<Integer>>> is empty -> Bool:
@@ -147,14 +148,15 @@ fn<Integer> String from <array: Reference<Array<Integer>>> -> String:
147148
destroy (i:Integer)
148149

149150
(&str:ReferenceMut<String>) += "]"
150-
let $tmp@1461: String = clone (str:String)
151+
let $tmp@1462: String = clone (str:String)
151152
destroy (str:String)
152-
return ($tmp@1461:String)
153+
return ($tmp@1462:String)
154+
153155

156+
fn println <x: Array<Integer>> -> None:
157+
let $tmp@176: None = println String from (x:Array<Integer>)
158+
return ($tmp@176:None)
154159

155-
fn<Array<Integer>> println <x: Array<Integer>> -> None:
156-
let $tmp@314: None = println String from (x:Array<Integer>)
157-
return ($tmp@314:None)
158160

159161

160162
fn<Integer> <array: Reference<Array<Integer>>> is not empty -> Bool:
@@ -181,16 +183,17 @@ fn<Integer> <array: Reference<Array<Integer>>> [ <i: Integer> ] -> Reference<Int
181183

182184

183185
@mangle_as("integer_as_string")
184-
fn String from <:Integer> -> String
186+
fn String from <$arg0: Integer> -> String
187+
188+
fn println <x: Integer> -> None:
189+
let $tmp@176: None = println String from (x:Integer)
190+
return ($tmp@176:None)
185191

186-
fn<Integer> println <x: Integer> -> None:
187-
let $tmp@314: None = println String from (x:Integer)
188-
return ($tmp@314:None)
189192

190193

191194
fn<Integer> <it: Reference<Iterator<Integer>>> exists -> Bool:
192-
let $tmp@1754: Bool = clone (*it:Iterator<Integer>).index < clone (*(*it:Iterator<Integer>).array:Array<Integer>).size
193-
return ($tmp@1754:Bool)
195+
let $tmp@1755: Bool = clone (*it:Iterator<Integer>).index < clone (*(*it:Iterator<Integer>).array:Array<Integer>).size
196+
return ($tmp@1755:Bool)
194197

195198

196199
fn<Integer> size of <ty: Type<Integer>> -> Integer:
@@ -220,16 +223,17 @@ fn<Integer> <array: Reference<Array<Integer>>> [ <i: Integer> ] -> Reference<Int
220223

221224

222225
fn<Integer> value from <it: Reference<Iterator<Integer>>> -> Reference<Integer>:
223-
let $tmp@1885: Reference<Integer> = (*it:Iterator<Integer>).array [ clone (*it:Iterator<Integer>).index ]
224-
return ($tmp@1885:Reference<Integer>)
226+
let $tmp@1886: Reference<Integer> = (*it:Iterator<Integer>).array [ clone (*it:Iterator<Integer>).index ]
227+
return ($tmp@1886:Reference<Integer>)
225228

226229

227230
@mangle_as("integer_as_string")
228-
fn String from <:Integer> -> String
231+
fn String from <$arg0: Integer> -> String
232+
233+
fn println <x: Integer> -> None:
234+
let $tmp@176: None = println String from (x:Integer)
235+
return ($tmp@176:None)
229236

230-
fn<Integer> println <x: Integer> -> None:
231-
let $tmp@314: None = println String from (x:Integer)
232-
return ($tmp@314:None)
233237

234238

235239
fn<Integer> advance <it: ReferenceMut<Iterator<Integer>>> -> None:

0 commit comments

Comments
 (0)