فهرست منبع

Add `int` and `float` functions

gingerBill 3 سال پیش
والد
کامیت
a7c0edb046
4فایلهای تغییر یافته به همراه58 افزوده شده و 4 حذف شده
  1. 1 1
      core/text/template/execute.odin
  2. 57 1
      core/text/template/function.odin
  3. 0 1
      core/text/template/parse/ast.odin
  4. 0 1
      core/text/template/parse/parse.odin

+ 1 - 1
core/text/template/execute.odin

@@ -547,7 +547,7 @@ eval_field :: proc(s: ^State, dot: any, ident: string) -> (value: any, err: Erro
 			rm := (^mem.Raw_Map)(dot.data)
 
 			data := uintptr(rm.entries.data)
-			for i in 0..<rm.entries.len {
+			for _ in 0..<rm.entries.len {
 				key: string
 				switch key_type.id {
 				case typeid_of(string):

+ 57 - 1
core/text/template/function.odin

@@ -1,8 +1,8 @@
 package text_template
 
-import "core:mem"
 import "core:fmt"
 import "core:reflect"
+import "core:strconv"
 
 Function :: #type proc(args: []any) -> (value: any, err: Error)
 
@@ -59,6 +59,62 @@ init_builtin_funcs :: proc() {
 		return new_any(n), nil
 	}
 
+	builtin_funcs["int"] = proc(args: []any) -> (value: any, err: Error) {
+		if len(args) != 1 {
+			err = .Invalid_Argument_Count
+			return
+		}
+		res: i64
+		switch v in get_value(args[0]) {
+		case bool:
+			res = i64(v)
+		case i64:
+			res = i64(v)
+		case f64:
+			res = i64(v)
+		case string:
+			if value, ok := strconv.parse_f64(v); ok {
+				res = i64(value)
+			} else if value, ok := strconv.parse_i64(v); ok {
+				res = i64(value)
+			} else {
+				return nil, .Invalid_Argument_Type
+			}
+		case:
+			return nil, .Invalid_Argument_Type
+		}
+
+		return new_any(res), nil
+	}
+
+	builtin_funcs["float"] = proc(args: []any) -> (value: any, err: Error) {
+		if len(args) != 1 {
+			err = .Invalid_Argument_Count
+			return
+		}
+		res: f64
+		switch v in get_value(args[0]) {
+		case bool:
+			res = f64(i64(v))
+		case i64:
+			res = f64(v)
+		case f64:
+			res = f64(v)
+		case string:
+			if value, ok := strconv.parse_f64(v); ok {
+				res = f64(value)
+			} else if value, ok := strconv.parse_i64(v); ok {
+				res = f64(value)
+			} else {
+				return nil, .Invalid_Argument_Type
+			}
+		case:
+			return nil, .Invalid_Argument_Type
+		}
+
+		return new_any(res), nil
+	}
+
 
 	builtin_funcs["print"] = proc(args: []any) -> (value: any, err: Error) {
 		return new_any(fmt.aprint(..args)), nil

+ 0 - 1
core/text/template/parse/ast.odin

@@ -1,7 +1,6 @@
 package text_template_parse
 
 import "../scan"
-import "core:strings"
 
 Pos :: scan.Pos
 Token :: scan.Token

+ 0 - 1
core/text/template/parse/parse.odin

@@ -1,6 +1,5 @@
 package text_template_parse
 
-import "core:io"
 import "core:fmt"
 import "core:mem"
 import "core:mem/virtual"