diff --git a/ExampleCodes/1-Variables.fig b/ExampleCodes/1-Variables.fig
index 260183e..1cad678 100644
--- a/ExampleCodes/1-Variables.fig
+++ b/ExampleCodes/1-Variables.fig
@@ -10,4 +10,70 @@ invalid!
*/
const Pi := 3.14; // recommended, auto detect type
-// equal -> const Pi: Double = 3.14;
\ No newline at end of file
+// equal -> const Pi: Double = 3.14;
+
+/*
+In fig, we have 13 builtin-type
+
+01 Any
+02 Null
+03 Int
+04 String
+05 Bool
+06 Double
+07 Function
+08 StructType
+09 StructInstance
+10 List
+11 Map
+12 Module
+13 InterfaceType
+
+3, 4, 5, 6, 10, 11 are initable
+
+value system:
+ object is immutable
+ (included basic types: Int, String...)
+
+ `variable` is a name, refers to an object
+ assignment is to bind name to value
+
+ Example: var a := 10;
+
+ [name] 'a' ---> variable slot (name, declared type, access modifier, [value) ---> ObjectPtr ---> raw Object class
+ bind bind (shared_ptr)
+
+ For example:
+ var a := 10;
+ var b := 10;
+
+ `a` and `b` reference to the same object in memory
+
+ a = 20;
+
+ now a refers to a new object (20, Int)
+
+ what about complex types?
+ they actually have same behaviors with basic types
+
+ var a := [1, 2, 3, 4];
+ var b := a;
+
+ > a
+ [1, 2, 3, 4]
+ > b
+ [1, 2, 3, 4]
+
+ set a[0] to 5
+
+ > a
+ [5, 2, 3, 4]
+ > b
+ [5, 2, 3, 4]
+
+ Why did such a result occur?
+
+ " `a` and `b` reference to the same object in memory "
+
+ If you wish to obtain a copy, use List {a} to deeply copy it
+*/
\ No newline at end of file
diff --git a/ExampleCodes/SpeedTest/fibBenchmark.fig b/ExampleCodes/SpeedTest/fibBenchmark.fig
new file mode 100644
index 0000000..28ab6cb
--- /dev/null
+++ b/ExampleCodes/SpeedTest/fibBenchmark.fig
@@ -0,0 +1,65 @@
+import std.io;
+import std.time;
+
+func benchmark(fn: Function, arg: Any) -> Null
+{
+ io.println("Testing fn:", fn, "with arg:", arg);
+ const start := time.now();
+
+ const result := fn(arg);
+
+ const end := time.now();
+ const duration := new time.Time{
+ end.since(start)
+ };
+ io.println("=" * 50);
+ io.println("fn returns:", result, "\n");
+ io.println("Cost:", duration.toSeconds(), "s");
+ io.println(" ", duration.toMillis(), "ms");
+}
+
+var memo := {};
+
+func fib_memo(x)
+{
+ if memo.contains(x)
+ {
+ return memo.get(x);
+ }
+ if x <= 1
+ {
+ memo[x] = x;
+ return x;
+ }
+ var result := fib_memo(x - 1) + fib_memo(x - 2);
+ memo[x] = result;
+ return result;
+}
+
+func fib_iter(n)
+{
+ var a := 0;
+ var b := 1;
+ for var i := 0; i < n; i = i + 1
+ {
+ var temp := a + b;
+ a = b;
+ b = temp;
+ }
+ return a;
+}
+
+func fib(x)
+{
+ if x <= 1
+ {
+ return x;
+ }
+ return fib(x - 1) + fib(x - 2);
+}
+
+const n := 28;
+
+benchmark(fib, n);
+benchmark(fib_memo, n);
+benchmark(fib_iter, n);
\ No newline at end of file
diff --git a/fig-vscode/package.json b/fig-vscode/package.json
index ee53153..f5eb4e5 100644
--- a/fig-vscode/package.json
+++ b/fig-vscode/package.json
@@ -2,7 +2,7 @@
"name": "fig-vscode",
"displayName": "Fig Language",
"description": "VSCode extension for Fig language with syntax highlighting",
- "version": "0.0.2",
+ "version": "0.4.2",
"publisher": "PuqiAR",
"engines": {
"vscode": "^1.90.0"
diff --git a/fig-vscode/syntaxes/fig.tmLanguage.json b/fig-vscode/syntaxes/fig.tmLanguage.json
index 011a4e5..2404f07 100644
--- a/fig-vscode/syntaxes/fig.tmLanguage.json
+++ b/fig-vscode/syntaxes/fig.tmLanguage.json
@@ -57,7 +57,7 @@
"patterns": [
{
"name": "keyword.control.fig",
- "match": "\\b(and|or|not|import|func|var|const|final|while|for|if|else|struct|interface|impl|public|return|break|continue|try|catch|throw)\\b"
+ "match": "\\b(and|or|not|import|func|var|const|final|while|for|if|else|new|struct|interface|impl|public|return|break|continue|try|catch|throw)\\b"
},
{ "name": "constant.language.fig", "match": "\\b(true|false|null)\\b" }
]
diff --git a/src/Ast/Statements/FunctionDefSt.hpp b/src/Ast/Statements/FunctionDefSt.hpp
index 7d6674e..e668062 100644
--- a/src/Ast/Statements/FunctionDefSt.hpp
+++ b/src/Ast/Statements/FunctionDefSt.hpp
@@ -23,14 +23,14 @@ namespace Fig::Ast
FString name;
FunctionParameters paras;
bool isPublic;
- FString retType;
+ Expression retType;
BlockStatement body;
- FunctionDefSt() :
- retType(ValueType::Null.name)
+
+ FunctionDefSt()
{
type = AstType::FunctionDefSt;
}
- FunctionDefSt(FString _name, FunctionParameters _paras, bool _isPublic, FString _retType, BlockStatement _body)
+ FunctionDefSt(FString _name, FunctionParameters _paras, bool _isPublic, Expression _retType, BlockStatement _body)
{
type = AstType::FunctionDefSt;
diff --git a/src/Ast/Statements/InterfaceDefSt.hpp b/src/Ast/Statements/InterfaceDefSt.hpp
index d062fa4..e0fb141 100644
--- a/src/Ast/Statements/InterfaceDefSt.hpp
+++ b/src/Ast/Statements/InterfaceDefSt.hpp
@@ -25,7 +25,7 @@ namespace Fig::Ast
{
FString name;
FunctionParameters paras;
- FString returnType;
+ Expression returnType;
BlockStatement defaultBody = nullptr; // nullptr is non-default func
diff --git a/src/Ast/Statements/StructDefSt.hpp b/src/Ast/Statements/StructDefSt.hpp
index 9a81bdf..d04d467 100644
--- a/src/Ast/Statements/StructDefSt.hpp
+++ b/src/Ast/Statements/StructDefSt.hpp
@@ -12,12 +12,12 @@ namespace Fig::Ast
{
AccessModifier am;
FString fieldName;
- FString tiName;
+ Expression declaredType;
Expression defaultValueExpr;
StructDefField() {}
- StructDefField(AccessModifier _am, FString _fieldName, FString _tiName, Expression _defaultValueExpr) :
- am(std::move(_am)), fieldName(std::move(_fieldName)), tiName(std::move(_tiName)), defaultValueExpr(std::move(_defaultValueExpr))
+ StructDefField(AccessModifier _am, FString _fieldName, Expression _declaredType, Expression _defaultValueExpr) :
+ am(std::move(_am)), fieldName(std::move(_fieldName)), declaredType(std::move(_declaredType)), defaultValueExpr(std::move(_defaultValueExpr))
{
}
};
diff --git a/src/Ast/Statements/VarDef.hpp b/src/Ast/Statements/VarDef.hpp
index a5ad13e..d53d879 100644
--- a/src/Ast/Statements/VarDef.hpp
+++ b/src/Ast/Statements/VarDef.hpp
@@ -11,22 +11,28 @@ namespace Fig::Ast
bool isPublic;
bool isConst;
FString name;
- FString typeName;
+ // FString typeName;
+ Expression declaredType;
Expression expr;
- VarDefAst() :
- typeName(ValueType::Any.name)
+ bool followupType;
+
+ VarDefAst()
{
type = AstType::VarDefSt;
+ declaredType = nullptr;
+ expr = nullptr;
+ followupType = false;
}
- VarDefAst(bool _isPublic, bool _isConst, FString _name, FString _info, Expression _expr) :
- typeName(std::move(_info))
+ VarDefAst(bool _isPublic, bool _isConst, FString _name, Expression _declaredType, Expression _expr, bool _followupType)
{
type = AstType::VarDefSt;
isPublic = _isPublic;
isConst = _isConst;
name = std::move(_name);
+ declaredType = std::move(_declaredType);
expr = std::move(_expr);
+ followupType = _followupType;
}
};
diff --git a/src/Ast/astBase.hpp b/src/Ast/astBase.hpp
index 0e0ec29..a406b44 100644
--- a/src/Ast/astBase.hpp
+++ b/src/Ast/astBase.hpp
@@ -26,14 +26,15 @@ namespace Fig::Ast
TernaryExpr,
/* Postfix */
- MemberExpr, // a.b
- IndexExpr, // a[b]
+ MemberExpr, // a.b
+ IndexExpr, // a[b]
FunctionCall, // a()
/* Literals */
ListExpr, // [1, "2", 3
TupleExpr, // (1, 2, 3)
MapExpr, // {a: 1}
+
InitExpr, // struct{"123", 456}
FunctionLiteralExpr,
@@ -119,30 +120,20 @@ namespace Fig::Ast
_AstBase() {}
- void setAAI(AstAddressInfo _aai)
- {
- aai = std::move(_aai);
- }
+ void setAAI(AstAddressInfo _aai) { aai = std::move(_aai); }
virtual FString typeName()
{
- return FString::fromStringView(
- FStringView::fromBasicStringView(magic_enum::enum_name(type)));
+ return FString::fromStringView(FStringView::fromBasicStringView(magic_enum::enum_name(type)));
}
virtual FString toString()
{
return FString(std::format("", typeName().toBasicString(), aai.line, aai.column));
}
- AstAddressInfo getAAI()
- {
- return aai;
- }
+ AstAddressInfo getAAI() { return aai; }
- AstType getType()
- {
- return type;
- }
+ AstType getType() { return type; }
};
class StatementAst : public _AstBase
@@ -150,10 +141,7 @@ namespace Fig::Ast
public:
using _AstBase::_AstBase;
using _AstBase::operator=;
- StatementAst()
- {
- type = AstType::StatementBase;
- }
+ StatementAst() { type = AstType::StatementBase; }
virtual FString toString() override
{
@@ -164,10 +152,7 @@ namespace Fig::Ast
class EofStmt final : public StatementAst
{
public:
- EofStmt()
- {
- type = AstType::StatementBase;
- }
+ EofStmt() { type = AstType::StatementBase; }
virtual FString toString() override
{
@@ -180,10 +165,7 @@ namespace Fig::Ast
public:
using _AstBase::_AstBase;
using _AstBase::operator=;
- ExpressionAst()
- {
- type = AstType::ExpressionBase;
- }
+ ExpressionAst() { type = AstType::ExpressionBase; }
virtual FString toString() override
{
@@ -242,41 +224,22 @@ namespace Fig::Ast
static const std::unordered_set unaryOps{
Operator::Not, // !
Operator::Subtract, // -
- Operator::BitNot, // ~
+ Operator::BitNot, // ~
Operator::BitAnd, // reference operator &
};
static const std::unordered_set binaryOps{
- Operator::Add,
- Operator::Subtract,
- Operator::Multiply,
- Operator::Divide,
- Operator::Modulo,
- Operator::Power,
- Operator::And,
- Operator::Or,
+ Operator::Add, Operator::Subtract, Operator::Multiply, Operator::Divide,
+ Operator::Modulo, Operator::Power, Operator::And, Operator::Or,
- Operator::Equal,
- Operator::NotEqual,
- Operator::Less,
- Operator::LessEqual,
- Operator::Greater,
- Operator::GreaterEqual,
- Operator::Is,
+ Operator::Equal, Operator::NotEqual, Operator::Less, Operator::LessEqual,
+ Operator::Greater, Operator::GreaterEqual, Operator::Is,
- Operator::BitAnd,
- Operator::BitOr,
- Operator::BitXor,
- Operator::BitNot,
- Operator::ShiftLeft,
- Operator::ShiftRight,
+ Operator::BitAnd, Operator::BitOr, Operator::BitXor, Operator::BitNot,
+ Operator::ShiftLeft, Operator::ShiftRight,
- Operator::Assign,
- Operator::PlusAssign,
- Operator::MinusAssign,
- Operator::AsteriskAssign,
- Operator::SlashAssign,
- Operator::CaretAssign
+ Operator::Assign, Operator::PlusAssign, Operator::MinusAssign, Operator::AsteriskAssign,
+ Operator::SlashAssign, Operator::CaretAssign
// Operator::Walrus,
// Operator::Dot
@@ -352,19 +315,9 @@ namespace Fig::Ast
{
public:
std::vector stmts;
- BlockStatementAst()
- {
- type = AstType::BlockStatement;
- }
- BlockStatementAst(std::vector _stmts) :
- stmts(std::move(_stmts))
- {
- type = AstType::BlockStatement;
- }
- virtual FString typeName() override
- {
- return FString(u8"BlockStatement");
- }
+ BlockStatementAst() { type = AstType::BlockStatement; }
+ BlockStatementAst(std::vector _stmts) : stmts(std::move(_stmts)) { type = AstType::BlockStatement; }
+ virtual FString typeName() override { return FString(u8"BlockStatement"); }
virtual FString toString() override
{
return FString(std::format("", typeName().toBasicString(), aai.line, aai.column));
diff --git a/src/Core/core.hpp b/src/Core/core.hpp
index 769991e..a49dec2 100644
--- a/src/Core/core.hpp
+++ b/src/Core/core.hpp
@@ -4,7 +4,7 @@
#include
#include
-#define __FCORE_VERSION "0.4.1-alpha"
+#define __FCORE_VERSION "0.4.2-alpha"
#if defined(_WIN32)
#define __FCORE_PLATFORM "Windows"
diff --git a/src/Evaluator/Context/context.hpp b/src/Evaluator/Context/context.hpp
index 9709ac0..903876e 100644
--- a/src/Evaluator/Context/context.hpp
+++ b/src/Evaluator/Context/context.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include "Ast/Statements/InterfaceDefSt.hpp"
#include "Value/interface.hpp"
#include
#include
@@ -303,7 +304,7 @@ namespace Fig
return false;
}
- Function getDefaultImplementedMethod(const TypeInfo &structType, const FString &functionName)
+ Ast::InterfaceMethod getDefaultImplementedMethod(const TypeInfo &structType, const FString &functionName)
{
// O(N²)
// SLOW
@@ -336,15 +337,12 @@ namespace Fig
if (method.name == functionName)
{
if (!method.hasDefaultBody()) assert(false);
-
- return Function(
- method.paras, TypeInfo(method.returnType), method.defaultBody, shared_from_this());
+ return method;
}
}
}
assert(false);
- return Function(); // ignore warning
}
const Function &getImplementedMethod(const TypeInfo &structType, const FString &functionName) const
diff --git a/src/Evaluator/Value/IntPool.hpp b/src/Evaluator/Value/IntPool.hpp
new file mode 100644
index 0000000..203f323
--- /dev/null
+++ b/src/Evaluator/Value/IntPool.hpp
@@ -0,0 +1,40 @@
+#pragma once
+
+#include "Value/value.hpp"
+#include
+#include
+#include
+#include
+#include
+
+namespace Fig
+{
+ class IntPool
+ {
+ private:
+ static constexpr ValueType::IntClass CACHE_MIN = -128;
+ static constexpr ValueType::IntClass CACHE_MAX = 127;
+
+ std::array cache;
+
+ public:
+ IntPool()
+ {
+ for (ValueType::IntClass i = CACHE_MIN; i <= CACHE_MAX; ++i)
+ {
+ cache[i - CACHE_MIN] = std::make_shared