Restructure
This commit is contained in:
40
Windows.kl
40
Windows.kl
@@ -1,40 +0,0 @@
|
||||
DWORD :: U32
|
||||
LPCSTR :: *char
|
||||
HWND :: *void
|
||||
HMENU :: *void
|
||||
HINSTANCE :: *void
|
||||
LPVOID :: *void
|
||||
SIZE_T :: U64
|
||||
BOOL :: int
|
||||
HANDLE :: *void
|
||||
VOID :: void
|
||||
LPDWORD :: *DWORD
|
||||
|
||||
CreateWindowA :: #foreign (dwExStyle: DWORD, lpClassName: *char, lpWindowName: *char, dwStyle: DWORD, X: int, Y: int, nWidth: int, nHeight: int, hWndParent: HWND, hMenu: HMENU, hInstance: HINSTANCE, lpParam: *void): HWND
|
||||
|
||||
|
||||
MEM_COMMIT :: 0x00001000
|
||||
MEM_RESERVE :: 0x00002000
|
||||
MEM_RESET :: 0x00080000
|
||||
MEM_RESET_UNDO :: 0x1000000
|
||||
|
||||
MEM_DECOMMIT :: 0x00004000
|
||||
MEM_RELEASE :: 0x00008000
|
||||
|
||||
PAGE_NOACCESS :: 1
|
||||
PAGE_READONLY :: 2
|
||||
PAGE_READWRITE :: 4
|
||||
PAGE_WRITECOPY :: 8
|
||||
PAGE_EXECUTE :: 0x10
|
||||
PAGE_EXECUTE_READ :: 0x20
|
||||
PAGE_EXECUTE_READWRITE :: 0x40
|
||||
PAGE_EXECUTE_WRITECOPY :: 0x80
|
||||
|
||||
VirtualAlloc :: #foreign (lpAddress: LPVOID, dwSize: SIZE_T, flAllocationType: DWORD, flProtect: DWORD): LPVOID
|
||||
VirtualFree :: #foreign (lpAddress: LPVOID, dwSize: SIZE_T, dwFreeType: DWORD): BOOL
|
||||
|
||||
STD_INPUT_HANDLE :: 4294967286//(-10)->DWORD
|
||||
STD_OUTPUT_HANDLE :: 4294967285//(-11)->DWORD
|
||||
//STD_ERROR_HANDLE :: (-12)->DWORD
|
||||
GetStdHandle :: #foreign (nStdHandle: DWORD): HANDLE
|
||||
WriteConsoleA :: #foreign (hConsoleOutput: HANDLE,lpBuffer: *VOID,nNumberOfCharsToWrite: DWORD,lpNumberOfCharsWritten: LPDWORD,lpReserve: LPVOID): BOOL
|
||||
24
base.kl
24
base.kl
@@ -1,24 +0,0 @@
|
||||
Os :: #import "os.kl"
|
||||
|
||||
SizeU :: #strict U64
|
||||
|
||||
Arena :: struct
|
||||
memory: Os.Memory
|
||||
alignment: U64
|
||||
len: U64
|
||||
|
||||
clamp_top_sizeu :: (val: SizeU, max: SizeU): SizeU
|
||||
if val > max
|
||||
return max
|
||||
return val
|
||||
|
||||
get_align_offset :: (size: SizeU, align: SizeU): SizeU
|
||||
mask := align - 1
|
||||
val := size & mask
|
||||
if val != 0
|
||||
val = align - val
|
||||
return val
|
||||
|
||||
align_up :: (size: SizeU, align: SizeU): SizeU
|
||||
result := size + get_align_offset(size, align)
|
||||
return result
|
||||
7
enums.kl
7
enums.kl
@@ -1,7 +0,0 @@
|
||||
Allocator_Kind :: enum #flag
|
||||
Null; Arena; Heap
|
||||
|
||||
kind := Allocator_Kind.Heap
|
||||
|
||||
basic_type_assignment :: () // This works
|
||||
return
|
||||
78
euler.kl
78
euler.kl
@@ -1,78 +0,0 @@
|
||||
// @todo: Add more stats in the preview
|
||||
// @todo: for 0..1000(implicit i) and for i in 0..1000
|
||||
// @todo: Add blocks of stmts that you can simply define inside a function etc.
|
||||
|
||||
entry :: ()
|
||||
print_str("\n")
|
||||
euler1()
|
||||
euler3()
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Euler 2
|
||||
//-----------------------------------------------------------------------------
|
||||
euler1 :: ()
|
||||
end := 1000
|
||||
result := 0
|
||||
for i := 0, i < end, i++
|
||||
if i % 3 == 0
|
||||
result += i
|
||||
else if i % 5 == 0
|
||||
result += i
|
||||
print_str("Euler1: ")
|
||||
print_int(result)
|
||||
print_str("\n")
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Euler 3
|
||||
//-----------------------------------------------------------------------------
|
||||
int_sqrt :: (s: S64): S64
|
||||
result := sqrt(cast(s: F64))
|
||||
return cast(result: S64)
|
||||
|
||||
// https://en.wikipedia.org/wiki/Integer_square_root
|
||||
int_sqrt1 :: (s: S64): S64
|
||||
x0 := s / 2
|
||||
|
||||
if x0 != 0
|
||||
x1 := (x0 + s / x0) / 2
|
||||
for x1 < x0
|
||||
x0 = x1
|
||||
x1 = (x0 + s / x0) / 2
|
||||
return x0
|
||||
else
|
||||
return s
|
||||
|
||||
euler3 :: ()
|
||||
n := 600851475143
|
||||
results: [32]S64
|
||||
results_len := 0
|
||||
|
||||
// First search all 2's
|
||||
for n % 2 == 0
|
||||
results[results_len++] = 2
|
||||
n /= 2
|
||||
|
||||
// Then search other primes, 3, 5, 7 etc.
|
||||
for i := 3, i <= int_sqrt1(n), i += 2
|
||||
for n % i == 0
|
||||
results[results_len++] = i
|
||||
n /= i
|
||||
|
||||
// Then check if our number is a prime it self
|
||||
if n > 2
|
||||
results[results_len++] = n
|
||||
|
||||
print_str("Euler3: ")
|
||||
|
||||
is_correct: S64 = 1
|
||||
for i := 0, i < results_len, i++
|
||||
is_correct = is_correct * results[i]
|
||||
print_int(is_correct)
|
||||
|
||||
print_str(":: ")
|
||||
print_int(is_correct)
|
||||
|
||||
sqrt :: (v: F64): F64 #foreign
|
||||
print_int :: (i: S64) #foreign
|
||||
print_str :: (i: String) #foreign
|
||||
91
globals.kl
91
globals.kl
@@ -1,91 +0,0 @@
|
||||
lambdas :: #load "lambdas.kl"
|
||||
Memory :: #load "enums.kl"
|
||||
#load "lambdas.kl"
|
||||
#load "lambdas.kl"
|
||||
#import "order1.kl"
|
||||
#import "order1.kl"
|
||||
order :: #import "order1.kl"
|
||||
|
||||
|
||||
|
||||
test_load :: ()
|
||||
new_types :: #load "new_types.kl"
|
||||
new_types.basic_type_assignment()
|
||||
arena__: order2.Arena
|
||||
Arena_ :: order.order2.Arena
|
||||
arena___: Arena_
|
||||
//-----------------------------------------------------------------------------
|
||||
// Function types
|
||||
//-----------------------------------------------------------------------------
|
||||
test_function :: (thing: S64): *S64
|
||||
function_type: test_function
|
||||
const_function_alias :: test_function
|
||||
// null_function: (t: S64): *S64 = null
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Booleans
|
||||
//-----------------------------------------------------------------------------
|
||||
Boolean: Bool = true
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Nulls
|
||||
//-----------------------------------------------------------------------------
|
||||
// int_null: S64 = null
|
||||
// str_null: String = null
|
||||
// Bool_null: Bool = null
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Compound expressions
|
||||
//-----------------------------------------------------------------------------
|
||||
array1: [4]S64 = {1,2,3,4}
|
||||
imp_array := [5]S64{1,2}
|
||||
// imp_array_a := [5]S64{1,2,3,4,5,6}
|
||||
// imp_array_b: [5]S64 = {1,2,3,4,5,6}
|
||||
imp_array_c: [5]S64 = {[0] = 1, [2] = 2, [1] = 0} // @todo this should be illegal
|
||||
// without_size: []S64 = {} // @todo: this should be slice, converting from array should be implicit
|
||||
|
||||
string: *char = "string"
|
||||
first_letter := string[0]
|
||||
decl_char: char = 55
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Pointers
|
||||
//-----------------------------------------------------------------------------
|
||||
pointer_decl : *S64
|
||||
variable_from_deref: S64 = *pointer_decl
|
||||
pointer_from_var : *S64 = &variable_from_deref
|
||||
Boolean_pointer := &Boolean
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Implicit type
|
||||
//-----------------------------------------------------------------------------
|
||||
implicit_int :: 10
|
||||
implicit_str :: "Hello world"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Pointers
|
||||
//-----------------------------------------------------------------------------
|
||||
// pointer1: *S64 = 0
|
||||
// pointer2: *S64 = pointer1
|
||||
// pointer3: **S64 = 0
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// String types
|
||||
//-----------------------------------------------------------------------------
|
||||
string1 :: "Test"
|
||||
string2 :: string1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Constant S64 variables
|
||||
//-----------------------------------------------------------------------------
|
||||
thing0 :: 10
|
||||
thing4 :: thing0 + 11
|
||||
thing3 :: thing4 + 20
|
||||
combin :: thing0 + thing4 + thing3
|
||||
|
||||
Some :: struct
|
||||
len: S64
|
||||
cap: S64
|
||||
|
||||
some := Some{3, 2}
|
||||
other := Some{len = 1, cap = 3}
|
||||
64
lambdas.kl
64
lambdas.kl
@@ -1,64 +0,0 @@
|
||||
Test :: struct
|
||||
len: S64
|
||||
|
||||
|
||||
test: Test
|
||||
member := test.len
|
||||
|
||||
enum_val: Memory.Allocator_Kind = Memory.Allocator_Kind.Heap
|
||||
other_enum_val: S64 = enum_val->S64
|
||||
|
||||
a_type :: S64
|
||||
pointer_type :: *S64
|
||||
// null_pointer: pointer_type = null
|
||||
|
||||
if_stmt :: (cond: S64): type
|
||||
CONSTANT :: 10
|
||||
thing := 10
|
||||
if i := thing + cond, cond > CONSTANT
|
||||
return i + CONSTANT
|
||||
else if cond < CONSTANT
|
||||
return i - CONSTANT
|
||||
else
|
||||
return CONSTANT
|
||||
|
||||
|
||||
for_stmt :: ()
|
||||
for i := 0, i < 10, i+=1
|
||||
out_of_order_resolving()
|
||||
|
||||
out_of_order_resolving :: ()
|
||||
i := 10
|
||||
|
||||
add_10 :: (size: S64): S64
|
||||
add_20 :: (new_size: S64): S64
|
||||
return 20
|
||||
|
||||
add :: (a: S64, b: S64 = 10): S64
|
||||
return a + b
|
||||
|
||||
constant :: 20; result := constant + 10
|
||||
|
||||
v3 := add(1,2)
|
||||
// v2 := add(a = 1, b = 2)
|
||||
// v1 := add(a = 1)
|
||||
// // v_err := add([0] = 1)
|
||||
// v4 := add(b = 1, a = 2)
|
||||
// // v_err := add([0] = 1, [1] = 2)
|
||||
// // v_err := add([0] = 1, 10) // illegal
|
||||
// // v_err := add([1] = 1) // illegal
|
||||
// // v_err := add() // illegal
|
||||
v4 := constant
|
||||
return v4
|
||||
|
||||
return_constant :: (): S64
|
||||
constant :: 10
|
||||
return constant
|
||||
|
||||
returning_void :: (insert: S64)
|
||||
// val1: S64 = return_constant()
|
||||
// val2: S64 = add_10(val1)
|
||||
return
|
||||
|
||||
|
||||
type :: a_type
|
||||
9
main.kl
9
main.kl
@@ -1,9 +0,0 @@
|
||||
#import "base.kl"
|
||||
os :: #import "os.kl"
|
||||
|
||||
main :: (argc: int, argv: **char): int
|
||||
memory := os.reserve(size = 10000)
|
||||
os.commit(&memory, 1000)
|
||||
os.release(&memory)
|
||||
os.print("Hello world")
|
||||
|
||||
110
new_types.kl
110
new_types.kl
@@ -1,110 +0,0 @@
|
||||
|
||||
unary_test :: ()
|
||||
int_val :: 141
|
||||
float_val :: 124.42
|
||||
conversion: F64 = -+int_val
|
||||
float2 := -float_val
|
||||
unsigned: S64 = -+-+-int_val
|
||||
|
||||
not: Bool = !int_val
|
||||
notf := !float_val
|
||||
notb := !true
|
||||
neg64: S64 = ~int_val
|
||||
neg32: S32 = ~int_val
|
||||
big_neg32: U32 = ~41512512->U32
|
||||
|
||||
var1: S64
|
||||
var2: S64 = 20
|
||||
var_bool: Bool = !var1 == !var2
|
||||
|
||||
pointer: *S64
|
||||
pointer += 10
|
||||
// pointer = pointer + pointer
|
||||
|
||||
// uns: U64 = -int_val
|
||||
// int_float: S64 = float_val
|
||||
// string :: -"Thing"
|
||||
// boolean :: -true
|
||||
// var := -true
|
||||
// var := +true
|
||||
|
||||
// @note: Poggers
|
||||
big_number1 :: 12512512512512521524242
|
||||
big_number2 :: 12512512512512521524242
|
||||
big_number3 :: 12512512512512521524242
|
||||
big_number4 :: 12512512512512521524242
|
||||
big_number5 :: 12512512512512521524242 + big_number1 * big_number1
|
||||
binary_test :: (thing: S32 = 442)
|
||||
int_val :: 1000
|
||||
add :: int_val + 10 + 2.242 + 124
|
||||
mul :: 4 * 2
|
||||
bit_and :: 3 & 1
|
||||
bit_or :: 1 | 4
|
||||
bit_xor :: 8 ^ 7
|
||||
character :: 'ó
|
||||
|
||||
// '
|
||||
|
||||
boolean_equals :: true == false
|
||||
boolean_var: Bool = boolean_equals
|
||||
|
||||
cast_value :: 4242 + 32->S32 + 42->S32
|
||||
value: S32 = cast_value
|
||||
|
||||
bvar2 := int_val > 1
|
||||
if int_val < 1
|
||||
if int_val > 1
|
||||
pass
|
||||
|
||||
basic_type_assignment :: ()
|
||||
// custom_data1 := Custom_Data(thing = 23)
|
||||
// custom_data2: Custom_Data
|
||||
some_constant :: true
|
||||
thing: Bool = some_constant
|
||||
float_val :: 325.42
|
||||
float_var := float_val
|
||||
|
||||
|
||||
for_loops :: ()
|
||||
for thing2 := 10
|
||||
pass
|
||||
for thing1 := 10,,thing1+=1
|
||||
pass
|
||||
for
|
||||
pass
|
||||
for i := 0, i == 4, i+=1
|
||||
pass
|
||||
for j:=0, j < 10
|
||||
pass
|
||||
|
||||
/*
|
||||
Custom_Data :: struct
|
||||
thing: S32
|
||||
|
||||
get_element_item :: (array: []Custom_Data, index: S64): Custom_Data
|
||||
if index < array.len
|
||||
return array[index]
|
||||
else
|
||||
return Custom_Data()
|
||||
|
||||
get_element_pointer :: (array: []Custom_Data, index: S64): *Custom_Data
|
||||
if index < array.len
|
||||
return &array[index]
|
||||
else
|
||||
return 0
|
||||
|
||||
get_slice_len :: (array: []Custom_Data): S64
|
||||
return array.len
|
||||
|
||||
array_test :: ()
|
||||
thing := []Custom_Data(Custom_Data(1), Custom_Data(2))
|
||||
reference := thing
|
||||
length := reference.len
|
||||
|
||||
item := get_element_item(thing, 1)
|
||||
pointer := get_element_pointer(thing, 0)
|
||||
len := get_slice_len(thing)
|
||||
|
||||
with_size: [2]Custom_Data
|
||||
*/
|
||||
// get_slice_len(with_size)
|
||||
21
order1.kl
21
order1.kl
@@ -1,21 +0,0 @@
|
||||
order2 :: #load "order2.kl"
|
||||
|
||||
recursive_lambda :: (thing: S64)
|
||||
in_val := recursive_lambda
|
||||
some_value := thing + const_in_lambda
|
||||
|
||||
other_func :: ()
|
||||
a_val := recursive_lambda
|
||||
|
||||
const_in_lambda :: 10
|
||||
|
||||
not_const := val + 10
|
||||
val := CONSTANT_VAL
|
||||
|
||||
DEPENDENCE :: CONSTANT_VAL
|
||||
CONSTANT_VAL :: 10
|
||||
|
||||
global_thing: a_type = 10
|
||||
|
||||
arena: *order2.Arena
|
||||
order1_arena: order2.Arena
|
||||
69
order2.kl
69
order2.kl
@@ -1,69 +0,0 @@
|
||||
|
||||
Str16 :: String16
|
||||
arena_pointer: *Arena = 0
|
||||
order2_arena: Arena
|
||||
no_type := order2_arena
|
||||
|
||||
Arena :: struct
|
||||
next: *Arena
|
||||
data: *S64
|
||||
len : S64
|
||||
cap : S64
|
||||
|
||||
string16: Str16
|
||||
|
||||
String16 :: struct
|
||||
data: *void
|
||||
len : S64
|
||||
|
||||
thing := arena_pointer.len
|
||||
with_type: Arena = order2_arena
|
||||
test_dot := with_type.len
|
||||
pointer := &with_type
|
||||
deref := *pointer
|
||||
|
||||
|
||||
test_assignments :: ()
|
||||
i := 0
|
||||
i += 4
|
||||
i -= 1
|
||||
i *= 2
|
||||
i /= 2
|
||||
i %= 2
|
||||
i = 2
|
||||
i &= 2
|
||||
i |= 2
|
||||
i >>= 2
|
||||
i <<= 2
|
||||
|
||||
boolean := i > 2
|
||||
CONST :: 23 == 23
|
||||
CONST_FLOAT :: 23.52
|
||||
|
||||
j: *S64
|
||||
*j = 1
|
||||
/* invalid
|
||||
8 = 32
|
||||
i + 4 = 32
|
||||
i += "String"
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
for
|
||||
pass
|
||||
for i:=0, i < 10, i+=1
|
||||
pass
|
||||
for array
|
||||
pass
|
||||
for it in array
|
||||
pass
|
||||
for it,i in array
|
||||
pass
|
||||
for i in 0..10
|
||||
pass
|
||||
|
||||
|
||||
|
||||
*/
|
||||
44
os.kl
44
os.kl
@@ -1,44 +0,0 @@
|
||||
#import "Windows.kl"
|
||||
#import "base.kl"
|
||||
|
||||
PAGE_SIZE :: 4096
|
||||
Memory :: struct
|
||||
commit : SizeU
|
||||
reserve: SizeU
|
||||
data : *U8
|
||||
|
||||
reserve :: (size: SizeU): Memory
|
||||
result := Memory{reserve=align_up(size, PAGE_SIZE)}
|
||||
result.data = VirtualAlloc(
|
||||
flProtect = PAGE_READWRITE,
|
||||
dwSize = result.reserve,
|
||||
flAllocationType = MEM_RESERVE,
|
||||
lpAddress = 0)->*U8
|
||||
return result
|
||||
|
||||
commit :: (m: *Memory, size: SizeU): Bool
|
||||
commit_size := align_up(size, PAGE_SIZE)
|
||||
total_commit := m.commit + commit_size
|
||||
clamped_commit := clamp_top_sizeu(total_commit, m.reserve)
|
||||
adjusted_commit := clamped_commit - m.commit
|
||||
if adjusted_commit != 0
|
||||
result := VirtualAlloc(
|
||||
lpAddress = (m.data + m.commit)->*void,
|
||||
dwSize = adjusted_commit,
|
||||
flAllocationType = MEM_COMMIT,
|
||||
flProtect = PAGE_READWRITE,
|
||||
)
|
||||
m.commit += adjusted_commit
|
||||
return true
|
||||
return false
|
||||
|
||||
release :: (m: *Memory)
|
||||
result := VirtualFree(m.data->*void, 0, MEM_RELEASE)
|
||||
if result != 0
|
||||
m.data = 0
|
||||
m.commit = 0
|
||||
m.reserve = 0
|
||||
|
||||
print :: (string: String)
|
||||
handle := GetStdHandle(STD_OUTPUT_HANDLE)
|
||||
WriteConsoleA(handle, &string[0]->*void, length_of(string)->DWORD, 0, 0)
|
||||
43
program.kl
43
program.kl
@@ -1,43 +0,0 @@
|
||||
#foreign printf :: (str: String, ...)
|
||||
|
||||
Token :: struct
|
||||
kind: U8
|
||||
str: *U8
|
||||
len: S64
|
||||
|
||||
Kind :: enum
|
||||
Number
|
||||
|
||||
|
||||
kind_name :: (kind: U8): String
|
||||
if kind == Token.Kind.Number
|
||||
return "<Number>"
|
||||
else
|
||||
return "<Unknown>"
|
||||
|
||||
is_numeric :: (c: U8): Bool
|
||||
result := c >= '0 && c <= '9
|
||||
return result
|
||||
|
||||
print_tokens :: (tokens: []Token)
|
||||
for i := 0, i < tokens.len, i++
|
||||
t := &tokens[i]
|
||||
printf("%d. %.*s", i, cast(t.len: S32), t.str)
|
||||
|
||||
entry :: ()
|
||||
string_to_lex := "Identifier 2425525 Not_Number"
|
||||
token_array: [32]Token
|
||||
token_count: S64 = 0
|
||||
|
||||
t: Token
|
||||
for i := 0, i < string_to_lex.len, i+=1
|
||||
if is_numeric(string_to_lex.str[i])
|
||||
t.kind = Token.Kind.Number
|
||||
t.str = &string_to_lex.str[i]
|
||||
t.len = i
|
||||
for is_numeric(string_to_lex.str[i])
|
||||
i+=1
|
||||
t.len = i - t.len
|
||||
token_array[token_count++] = t
|
||||
print_tokens(token_array)
|
||||
|
||||
Reference in New Issue
Block a user