Generic functions, first baby step (#658)

* generic functions: progress on parser and AST

* finished first baby step

* revisions based on reviews

* Update executable_semantics/interpreter/interpreter.cpp

Co-authored-by: Jon Meow <46229924+jonmeow@users.noreply.github.com>

* Symbol => VariableType

Co-authored-by: Jon Meow <46229924+jonmeow@users.noreply.github.com>
This commit is contained in:
Jeremy G. Siek
2021-07-22 15:16:56 -04:00
committed by GitHub
co-authored by Jon Meow
parent cc56afb79e
commit 864b3bde02
27 changed files with 437 additions and 24 deletions
+11
View File
@@ -0,0 +1,11 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
fn id[T:! Type](x: T) -> T {
return x;
}
fn main() -> Int {
return id(0);
}
@@ -0,0 +1 @@
result: 0
+11
View File
@@ -0,0 +1,11 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
fn fst[T:! Type](x: T, y: T) -> T {
return x;
}
fn main() -> Int {
return fst(0, 1);
}
@@ -0,0 +1 @@
result: 0
+11
View File
@@ -0,0 +1,11 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
fn snd[T:! Type](x: Int, y: T) -> T {
return y;
}
fn main() -> Int {
return snd(0, 1);
}
@@ -0,0 +1 @@
result: 1
@@ -0,0 +1,19 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
fn apply[T:! Type, U:! Type](f: fnty (T) -> U, x: T) -> U {
return f(x);
}
fn positive(x: Bool) -> Int {
if (x) {
return 2;
} else {
return -2;
}
}
fn main() -> Int {
return apply(positive, false);
}
@@ -0,0 +1 @@
result: -2
@@ -0,0 +1,11 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
fn fst[T:! Type](x: T, y: T) -> T {
return x;
}
fn main() -> Int {
return fst(0, true);
}
@@ -0,0 +1,4 @@
ERROR: 10: type error in argument deduction
expected: Int
actual: Bool
EXIT CODE: 255
@@ -0,0 +1,11 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
fn id[T:! Type](x: Int) -> Int {
return x;
}
fn main() -> Int {
return id(0);
}
@@ -0,0 +1,2 @@
10: error, could not deduce type argument for type parameter T
EXIT CODE: 255
@@ -0,0 +1,11 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
fn swap[T:! Type, U:! Type](tuple: (T, U)) -> (U, T) {
return (tuple[1], tuple[0]);
}
fn main() -> Int {
return swap((0, true))[1];
}
@@ -0,0 +1 @@
result: 0
@@ -0,0 +1,13 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
fn map[T:! Type](f: fnty (T) -> T, tuple: (T, T)) -> (T, T) {
return (f(tuple[0]), f(tuple[1]));
}
fn inc(x: Int) -> Int { return x + 1; }
fn main() -> Int {
return map(inc, (0, 2))[0];
}
@@ -0,0 +1 @@
result: 1