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

Commit

Permalink
Merge print and println into Printable trait (#158)
Browse files Browse the repository at this point in the history
  • Loading branch information
gavrilikhin-d authored May 11, 2024
1 parent a8d1221 commit cb184c8
Show file tree
Hide file tree
Showing 39 changed files with 756 additions and 690 deletions.
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,15 @@
* [x] Fix memory leak due to pointers to builtin types
* [x] Destructors for parameters
* [x] No tmps for literals inside of constructors
* [x] Fix recursive trait (AsString with prints)
---
### Current task
* [ ] Sum of series benchmark
* [ ] Benchmark for linear algebra
---
* [ ] Sum of series benchmark
* [ ] Find test that is taking infinite time
* [ ] Use traits to check for `clone` and `destructoy` functions
* [ ] Forbid recursion without `@recursive` annotation
* [ ] Fix recursive trait (AsString with prints)
* [ ] Generate clone for types with clonable members
* [ ] Generate destructors for types with destructible members
* [ ] Add type aliases
Expand Down
4 changes: 2 additions & 2 deletions ppl/src/array.ppl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use core.*

use math.*
use memory.*
use as_string.*
use printable.*

/// Array of values
type Array<T>:
Expand Down Expand Up @@ -48,7 +48,7 @@ fn<T> push <x: T> to <array: &mut Array<T>>:
fn<T> <array: &Array<T>> is empty => array.size == 0
fn<T> <array: &Array<T>> is not empty => array.size > 0

fn<U: AsString> String from <array: &Array<U>> -> String:
fn<U: Printable> String from <array: &Array<U>> -> String:
let mut str = "["
if array is not empty:
str += (String from array[0])
Expand Down
11 changes: 0 additions & 11 deletions ppl/src/as_string.ppl

This file was deleted.

2 changes: 1 addition & 1 deletion ppl/src/lib.ppl
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ use f64.*
use memory.*
use threads.*
use math.*
use as_string.*
use printable.*
9 changes: 9 additions & 0 deletions ppl/src/printable.ppl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use core.*

/// Trait for things that may be printed
trait Printable:
fn String from <:Self> -> String

fn print <x: Self> => print (String from x)

fn println <x: Self> => println (String from x)
9 changes: 5 additions & 4 deletions src/ir/to_ir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -289,11 +289,12 @@ impl<'llvm> DeclareGlobal<'llvm> for FunctionData {
context.module.add_function(
&self.mangled_name(),
ty,
// Private linkage for monomorphized generic functions
if self.generic_types.is_empty() || self.mangled_name.is_some() {
None
} else {
// Private linkage for monomorphized generic functions or functions from traits
if self.mangled_name.is_none() && (!self.generic_types.is_empty() || self.tr.is_some())
{
Some(Linkage::Private)
} else {
None
},
)
}
Expand Down
15 changes: 15 additions & 0 deletions src/semantics/contexts/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,21 @@ impl FindDeclaration for FunctionContext<'_> {
fn parent(&self) -> Option<&dyn FindDeclaration> {
Some(self.parent as _)
}

fn functions_with_n_name_parts(&self, n: usize) -> Vec<Function> {
let mut functions: Vec<_> = self
.functions_with_n_name_parts_here(n)
.into_iter()
.chain(
FindDeclaration::parent(self)
.and_then(|p| Some(p.functions_with_n_name_parts(n)))
.unwrap_or_default(),
)
.collect();
// TODO: allow recursion, if has @recursive
functions.retain(|f| *f != self.function);
functions
}
}

impl AddDeclaration for FunctionContext<'_> {
Expand Down
17 changes: 9 additions & 8 deletions src/tests/snapshots/ppl__tests__address_of.hir.snap
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,17 @@ fn<Integer> address of <ref: Reference<Integer>> -> MemoryAddress
fn<Integer> <ty: Type<Integer>> at <address: MemoryAddress> -> ReferenceMut<Integer>

@mangle_as("integer_as_string")
fn String from <:Integer> -> String
fn String from <$arg0: Integer> -> String

fn println <x: Integer> -> None:
let $tmp@176: None = println String from (x:Integer)
return ($tmp@176:None)

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


@mangle_as("integer_as_string")
fn String from <:Integer> -> String
fn String from <$arg0: Integer> -> String

fn<Integer> println <x: Integer> -> None:
let $tmp@314: None = println String from (x:Integer)
return ($tmp@314:None)
fn println <x: Integer> -> None:
let $tmp@176: None = println String from (x:Integer)
return ($tmp@176:None)
52 changes: 28 additions & 24 deletions src/tests/snapshots/ppl__tests__array.hir.snap
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ fn<Integer> <$arg0: Type<Integer>> [ ] -> Array<Integer>:


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


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

(&str:ReferenceMut<String>) += "]"
let $tmp@1461: String = clone (str:String)
let $tmp@1462: String = clone (str:String)
destroy (str:String)
return ($tmp@1461:String)
return ($tmp@1462:String)


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



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

(&str:ReferenceMut<String>) += "]"
let $tmp@1461: String = clone (str:String)
let $tmp@1462: String = clone (str:String)
destroy (str:String)
return ($tmp@1461:String)
return ($tmp@1462:String)


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

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


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


@mangle_as("integer_as_string")
fn String from <:Integer> -> String
fn String from <$arg0: Integer> -> String

fn println <x: Integer> -> None:
let $tmp@176: None = println String from (x:Integer)
return ($tmp@176:None)

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


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


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


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


@mangle_as("integer_as_string")
fn String from <:Integer> -> String
fn String from <$arg0: Integer> -> String

fn println <x: Integer> -> None:
let $tmp@176: None = println String from (x:Integer)
return ($tmp@176:None)

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


fn<Integer> advance <it: ReferenceMut<Iterator<Integer>>> -> None:
Expand Down
Loading

0 comments on commit cb184c8

Please sign in to comment.