goscript 0.0.14 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +154 -40
  2. package/builtin/builtin.ts +1168 -178
  3. package/compiler/analysis.go +726 -0
  4. package/compiler/compiler.go +5706 -4
  5. package/compiler/compiler_test.go +104 -0
  6. package/compiler/config.go +3 -3
  7. package/compiler/config_test.go +89 -0
  8. package/compiler/output.go +26 -0
  9. package/compiler/write-type-spec.go +506 -0
  10. package/compiler/writer.go +25 -0
  11. package/dist/builtin/builtin.d.ts +204 -67
  12. package/dist/builtin/builtin.js +845 -144
  13. package/dist/builtin/builtin.js.map +1 -1
  14. package/go.mod +4 -7
  15. package/go.sum +6 -11
  16. package/package.json +4 -3
  17. package/compiler/compile.go +0 -190
  18. package/compiler/compile_comment.go +0 -41
  19. package/compiler/compile_decls.go +0 -84
  20. package/compiler/compile_expr.go +0 -1022
  21. package/compiler/compile_field.go +0 -110
  22. package/compiler/compile_spec.go +0 -566
  23. package/compiler/compile_stmt.go +0 -1616
  24. package/compiler/context.go +0 -9
  25. package/compiler/file_compiler.go +0 -80
  26. package/compiler/output_path.go +0 -31
  27. package/compiler/pkg_compiler.go +0 -72
  28. package/compiler/types/tokens.go +0 -66
  29. package/compiler/types/types.go +0 -46
  30. package/dist/compliance/tests/array_literal/array_literal.gs.d.ts +0 -1
  31. package/dist/compliance/tests/array_literal/array_literal.gs.js +0 -15
  32. package/dist/compliance/tests/array_literal/array_literal.gs.js.map +0 -1
  33. package/dist/compliance/tests/async_basic/async_basic.gs.d.ts +0 -1
  34. package/dist/compliance/tests/async_basic/async_basic.gs.js +0 -24
  35. package/dist/compliance/tests/async_basic/async_basic.gs.js.map +0 -1
  36. package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.d.ts +0 -1
  37. package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.js +0 -82
  38. package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.js.map +0 -1
  39. package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.d.ts +0 -1
  40. package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.js +0 -16
  41. package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.js.map +0 -1
  42. package/dist/compliance/tests/boolean_logic/boolean_logic.gs.d.ts +0 -1
  43. package/dist/compliance/tests/boolean_logic/boolean_logic.gs.js +0 -14
  44. package/dist/compliance/tests/boolean_logic/boolean_logic.gs.js.map +0 -1
  45. package/dist/compliance/tests/channel_basic/channel_basic.gs.d.ts +0 -1
  46. package/dist/compliance/tests/channel_basic/channel_basic.gs.js +0 -14
  47. package/dist/compliance/tests/channel_basic/channel_basic.gs.js.map +0 -1
  48. package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.d.ts +0 -1
  49. package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.js +0 -27
  50. package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.js.map +0 -1
  51. package/dist/compliance/tests/constants/constants.gs.d.ts +0 -1
  52. package/dist/compliance/tests/constants/constants.gs.js +0 -16
  53. package/dist/compliance/tests/constants/constants.gs.js.map +0 -1
  54. package/dist/compliance/tests/copy_independence/copy_independence.gs.d.ts +0 -1
  55. package/dist/compliance/tests/copy_independence/copy_independence.gs.js +0 -33
  56. package/dist/compliance/tests/copy_independence/copy_independence.gs.js.map +0 -1
  57. package/dist/compliance/tests/defer_statement/defer_statement.gs.d.ts +0 -1
  58. package/dist/compliance/tests/defer_statement/defer_statement.gs.js +0 -75
  59. package/dist/compliance/tests/defer_statement/defer_statement.gs.js.map +0 -1
  60. package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.d.ts +0 -1
  61. package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.js +0 -37
  62. package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.js.map +0 -1
  63. package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.d.ts +0 -1
  64. package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.js +0 -29
  65. package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.js.map +0 -1
  66. package/dist/compliance/tests/float64/float64.gs.d.ts +0 -1
  67. package/dist/compliance/tests/float64/float64.gs.js +0 -24
  68. package/dist/compliance/tests/float64/float64.gs.js.map +0 -1
  69. package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.d.ts +0 -1
  70. package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.js +0 -10
  71. package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.js.map +0 -1
  72. package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.d.ts +0 -1
  73. package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.js +0 -11
  74. package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.js.map +0 -1
  75. package/dist/compliance/tests/for_loop_condition_only/main.gs.d.ts +0 -1
  76. package/dist/compliance/tests/for_loop_condition_only/main.gs.js +0 -10
  77. package/dist/compliance/tests/for_loop_condition_only/main.gs.js.map +0 -1
  78. package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.d.ts +0 -1
  79. package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.js +0 -14
  80. package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.js.map +0 -1
  81. package/dist/compliance/tests/for_range/for_range.gs.d.ts +0 -1
  82. package/dist/compliance/tests/for_range/for_range.gs.js +0 -39
  83. package/dist/compliance/tests/for_range/for_range.gs.js.map +0 -1
  84. package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.d.ts +0 -1
  85. package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.js +0 -15
  86. package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.js.map +0 -1
  87. package/dist/compliance/tests/func_literal/func_literal.gs.d.ts +0 -1
  88. package/dist/compliance/tests/func_literal/func_literal.gs.js +0 -10
  89. package/dist/compliance/tests/func_literal/func_literal.gs.js.map +0 -1
  90. package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.d.ts +0 -12
  91. package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.js +0 -30
  92. package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.js.map +0 -1
  93. package/dist/compliance/tests/if_statement/if_statement.gs.d.ts +0 -1
  94. package/dist/compliance/tests/if_statement/if_statement.gs.js +0 -13
  95. package/dist/compliance/tests/if_statement/if_statement.gs.js.map +0 -1
  96. package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.d.ts +0 -1
  97. package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.js +0 -12
  98. package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.js.map +0 -1
  99. package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.d.ts +0 -1
  100. package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.js +0 -34
  101. package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.js.map +0 -1
  102. package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.d.ts +0 -1
  103. package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.js +0 -32
  104. package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.js.map +0 -1
  105. package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.d.ts +0 -1
  106. package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.js +0 -40
  107. package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.js.map +0 -1
  108. package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.d.ts +0 -1
  109. package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.js +0 -51
  110. package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.js.map +0 -1
  111. package/dist/compliance/tests/map_support/map_support.gs.d.ts +0 -1
  112. package/dist/compliance/tests/map_support/map_support.gs.js +0 -88
  113. package/dist/compliance/tests/map_support/map_support.gs.js.map +0 -1
  114. package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.d.ts +0 -1
  115. package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.js +0 -24
  116. package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.js.map +0 -1
  117. package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.d.ts +0 -1
  118. package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.js +0 -33
  119. package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.js.map +0 -1
  120. package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.d.ts +0 -1
  121. package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.js +0 -22
  122. package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.js.map +0 -1
  123. package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.d.ts +0 -1
  124. package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.js +0 -33
  125. package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.js.map +0 -1
  126. package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.d.ts +0 -1
  127. package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.js +0 -17
  128. package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.js.map +0 -1
  129. package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.d.ts +0 -1
  130. package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.js +0 -29
  131. package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.js.map +0 -1
  132. package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.d.ts +0 -1
  133. package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.js +0 -27
  134. package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.js.map +0 -1
  135. package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.d.ts +0 -1
  136. package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.js +0 -22
  137. package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.js.map +0 -1
  138. package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.d.ts +0 -1
  139. package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.js +0 -20
  140. package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.js.map +0 -1
  141. package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.d.ts +0 -1
  142. package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.js +0 -28
  143. package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.js.map +0 -1
  144. package/dist/compliance/tests/select_send_on_full_buffered_channel_with_default/select_send_on_full_buffered_channel_with_default.gs.d.ts +0 -1
  145. package/dist/compliance/tests/select_send_on_full_buffered_channel_with_default/select_send_on_full_buffered_channel_with_default.gs.js +0 -30
  146. package/dist/compliance/tests/select_send_on_full_buffered_channel_with_default/select_send_on_full_buffered_channel_with_default.gs.js.map +0 -1
  147. package/dist/compliance/tests/select_statement/select_statement.gs.d.ts +0 -1
  148. package/dist/compliance/tests/select_statement/select_statement.gs.js +0 -207
  149. package/dist/compliance/tests/select_statement/select_statement.gs.js.map +0 -1
  150. package/dist/compliance/tests/simple/simple.gs.d.ts +0 -1
  151. package/dist/compliance/tests/simple/simple.gs.js +0 -6
  152. package/dist/compliance/tests/simple/simple.gs.js.map +0 -1
  153. package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.d.ts +0 -1
  154. package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.js +0 -24
  155. package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.js.map +0 -1
  156. package/dist/compliance/tests/slices/slices.gs.d.ts +0 -1
  157. package/dist/compliance/tests/slices/slices.gs.js +0 -294
  158. package/dist/compliance/tests/slices/slices.gs.js.map +0 -1
  159. package/dist/compliance/tests/string_conversion/string_conversion.gs.d.ts +0 -1
  160. package/dist/compliance/tests/string_conversion/string_conversion.gs.js +0 -41
  161. package/dist/compliance/tests/string_conversion/string_conversion.gs.js.map +0 -1
  162. package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.d.ts +0 -1
  163. package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.js +0 -17
  164. package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.js.map +0 -1
  165. package/dist/compliance/tests/struct_embedding/struct_embedding.gs.d.ts +0 -1
  166. package/dist/compliance/tests/struct_embedding/struct_embedding.gs.js +0 -48
  167. package/dist/compliance/tests/struct_embedding/struct_embedding.gs.js.map +0 -1
  168. package/dist/compliance/tests/struct_field_access/struct_field_access.gs.d.ts +0 -1
  169. package/dist/compliance/tests/struct_field_access/struct_field_access.gs.js +0 -19
  170. package/dist/compliance/tests/struct_field_access/struct_field_access.gs.js.map +0 -1
  171. package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.d.ts +0 -1
  172. package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.js +0 -26
  173. package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.js.map +0 -1
  174. package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.d.ts +0 -1
  175. package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.js +0 -30
  176. package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.js.map +0 -1
  177. package/dist/compliance/tests/switch_statement/switch_statement.gs.d.ts +0 -1
  178. package/dist/compliance/tests/switch_statement/switch_statement.gs.js +0 -76
  179. package/dist/compliance/tests/switch_statement/switch_statement.gs.js.map +0 -1
  180. package/dist/compliance/tests/value_type_copy_behavior/value_type_copy_behavior.gs.d.ts +0 -1
  181. package/dist/compliance/tests/value_type_copy_behavior/value_type_copy_behavior.gs.js +0 -31
  182. package/dist/compliance/tests/value_type_copy_behavior/value_type_copy_behavior.gs.js.map +0 -1
package/README.md CHANGED
@@ -64,40 +64,40 @@ You can also use the compiler directly within your Go code. Here's a basic examp
64
64
  package main
65
65
 
66
66
  import (
67
- "context"
68
- "log"
67
+ "context"
68
+ "log"
69
69
 
70
- "github.com/aperturerobotics/goscript/compiler"
71
- "github.com/sirupsen/logrus"
70
+ "github.com/aperturerobotics/goscript/compiler"
71
+ "github.com/sirupsen/logrus"
72
72
  )
73
73
 
74
74
  func main() {
75
- // Initialize logger (optional)
76
- logger := logrus.New()
77
- logger.SetLevel(logrus.DebugLevel) // Adjust log level as needed
78
- le := logrus.NewEntry(logger)
79
-
80
- // Configure the compiler
81
- conf := &compiler.Config{
82
- OutputPathRoot: "./ts_output", // Directory for generated TypeScript files
83
- }
84
- if err := conf.Validate(); err != nil {
85
- log.Fatalf("invalid compiler config: %v", err)
86
- }
87
-
88
- // Create a new compiler instance
89
- comp, err := compiler.NewCompiler(conf, le, nil) // Pass nil for default package loading options
90
- if err != nil {
91
- log.Fatalf("failed to create compiler: %v", err)
92
- }
93
-
94
- // Compile the desired Go package(s)
95
- // Replace "." with the specific Go import path of the package you want to compile
96
- if err := comp.CompilePackages(context.Background(), "your/go/package/path"); err != nil {
97
- log.Fatalf("compilation failed: %v", err)
98
- }
99
-
100
- log.Println("Compilation successful!")
75
+ // Initialize logger (optional)
76
+ logger := logrus.New()
77
+ logger.SetLevel(logrus.DebugLevel) // Adjust log level as needed
78
+ le := logrus.NewEntry(logger)
79
+
80
+ // Configure the compiler
81
+ conf := &compiler.Config{
82
+ OutputPathRoot: "./ts_output", // Directory for generated TypeScript files
83
+ }
84
+ if err := conf.Validate(); err != nil {
85
+ log.Fatalf("invalid compiler config: %v", err)
86
+ }
87
+
88
+ // Create a new compiler instance
89
+ comp, err := compiler.NewCompiler(conf, le, nil) // Pass nil for default package loading options
90
+ if err != nil {
91
+ log.Fatalf("failed to create compiler: %v", err)
92
+ }
93
+
94
+ // Compile the desired Go package(s)
95
+ // Replace "." with the specific Go import path of the package you want to compile
96
+ if err := comp.CompilePackages(context.Background(), "your/go/package/path"); err != nil {
97
+ log.Fatalf("compilation failed: %v", err)
98
+ }
99
+
100
+ log.Println("Compilation successful!")
101
101
  }
102
102
 
103
103
  ```
@@ -226,9 +226,41 @@ func main() {
226
226
  arr := [3]int{1, 2, 3}
227
227
  println("Array elements:", arr[0], arr[1], arr[2])
228
228
 
229
- // Slices and range loop
229
+ // Slices - Basic initialization and access
230
230
  slice := []int{4, 5, 6}
231
231
  println("Slice elements:", slice[0], slice[1], slice[2])
232
+ println("Slice length:", len(slice), "capacity:", cap(slice))
233
+
234
+ sliceWithCap := make([]int, 3, 5)
235
+ println("\nSlice created with make([]int, 3, 5):")
236
+ println("Length:", len(sliceWithCap), "Capacity:", cap(sliceWithCap))
237
+
238
+ println("\nAppend and capacity growth:")
239
+ growingSlice := make([]int, 0, 2)
240
+ println("Initial - Length:", len(growingSlice), "Capacity:", cap(growingSlice))
241
+
242
+ for i := 1; i <= 4; i++ {
243
+ growingSlice = append(growingSlice, i)
244
+ println("After append", i, "- Length:", len(growingSlice), "Capacity:", cap(growingSlice))
245
+ }
246
+
247
+ println("\nSlicing operations and shared backing arrays:")
248
+ original := []int{10, 20, 30, 40, 50}
249
+ println("Original slice - Length:", len(original), "Capacity:", cap(original))
250
+
251
+ slice1 := original[1:3]
252
+ println("slice1 := original[1:3] - Values:", slice1[0], slice1[1])
253
+ println("slice1 - Length:", len(slice1), "Capacity:", cap(slice1))
254
+
255
+ slice2 := original[1:3:4]
256
+ println("slice2 := original[1:3:4] - Values:", slice2[0], slice2[1])
257
+ println("slice2 - Length:", len(slice2), "Capacity:", cap(slice2))
258
+
259
+ println("\nShared backing arrays:")
260
+ slice1[0] = 999
261
+ println("After slice1[0] = 999:")
262
+ println("original[1]:", original[1], "slice1[0]:", slice1[0], "slice2[0]:", slice2[0])
263
+
232
264
  sum := 0
233
265
  for idx, val := range slice {
234
266
  sum += val
@@ -294,9 +326,24 @@ func main() {
294
326
  println("Goroutine: Sending message")
295
327
  ch <- "Hello from goroutine!"
296
328
  }()
329
+
297
330
  msg := <-ch
298
331
  println("Main goroutine: Received message:", msg)
299
332
 
333
+ // Select statement
334
+ println("\nSelect statement:")
335
+ selectCh := make(chan string)
336
+ go func() {
337
+ selectCh <- "Message from select goroutine!"
338
+ }()
339
+ anotherCh := make(chan string)
340
+ select {
341
+ case selectMsg := <-selectCh:
342
+ println("Select received:", selectMsg)
343
+ case anotherMsg := <-anotherCh: // Add another case
344
+ println("Select received from another channel:", anotherMsg)
345
+ }
346
+
300
347
  // Function Literals
301
348
  println("\nFunction Literals:")
302
349
  add := func(x, y int) int {
@@ -310,7 +357,7 @@ func main() {
310
357
  Generated with `goscript compile .`:
311
358
 
312
359
  ```typescript
313
- import * as goscript from "@goscript/builtin"
360
+ import * as $ from "@goscript/builtin"
314
361
 
315
362
  class MyStruct {
316
363
  // MyInt is a public integer field, initialized to zero.
@@ -373,12 +420,44 @@ export async function main(): Promise<void> {
373
420
  console.log("string(0x221A):", s3)
374
421
 
375
422
  // Arrays
376
- let arr = [1, 2, 3]
377
- console.log("Array elements:", arr[0], arr[1], arr[2])
423
+ let arr = $.arrayToSlice([1, 2, 3])
424
+ console.log("Array elements:", arr![0], arr![1], arr![2])
425
+
426
+ // Slices - Basic initialization and access
427
+ let slice = $.arrayToSlice([4, 5, 6])
428
+ console.log("Slice elements:", slice![0], slice![1], slice![2])
429
+ console.log("Slice length:", $.len(slice), "capacity:", $.cap(slice))
430
+
431
+ let sliceWithCap = $.makeSlice<number>(3, 5)
432
+ console.log("\nSlice created with make([]int, 3, 5):")
433
+ console.log("Length:", $.len(sliceWithCap), "Capacity:", $.cap(sliceWithCap))
434
+
435
+ console.log("\nAppend and capacity growth:")
436
+ let growingSlice = $.makeSlice<number>(0, 2)
437
+ console.log("Initial - Length:", $.len(growingSlice), "Capacity:", $.cap(growingSlice))
438
+
439
+ for (let i = 1; i <= 4; i++) {
440
+ growingSlice = $.append(growingSlice, i)
441
+ console.log("After append", i, "- Length:", $.len(growingSlice), "Capacity:", $.cap(growingSlice))
442
+ }
443
+
444
+ console.log("\nSlicing operations and shared backing arrays:")
445
+ let original = $.arrayToSlice([10, 20, 30, 40, 50])
446
+ console.log("Original slice - Length:", $.len(original), "Capacity:", $.cap(original))
447
+
448
+ let slice1 = $.goSlice(original, 1, 3)
449
+ console.log("slice1 := original[1:3] - Values:", slice1![0], slice1![1])
450
+ console.log("slice1 - Length:", $.len(slice1), "Capacity:", $.cap(slice1))
451
+
452
+ let slice2 = $.goSlice(original, 1, 3, 4)
453
+ console.log("slice2 := original[1:3:4] - Values:", slice2![0], slice2![1])
454
+ console.log("slice2 - Length:", $.len(slice2), "Capacity:", $.cap(slice2))
455
+
456
+ console.log("\nShared backing arrays:")
457
+ slice1![0] = 999
458
+ console.log("After slice1[0] = 999:")
459
+ console.log("original[1]:", original![1], "slice1[0]:", slice1![0], "slice2[0]:", slice2![0])
378
460
 
379
- // Slices and range loop
380
- let slice = [4, 5, 6]
381
- console.log("Slice elements:", slice[0], slice[1], slice[2])
382
461
  let sum = 0
383
462
  for (let idx = 0; idx < slice.length; idx++) {
384
463
  const val = slice[idx]
@@ -444,14 +523,49 @@ export async function main(): Promise<void> {
444
523
 
445
524
  // Goroutines and Channels
446
525
  console.log("\nGoroutines and Channels:")
447
- let ch = goscript.makeChannel<string>(0)
526
+ let ch = $.makeChannel<string>(0, "")
448
527
  queueMicrotask(async () => {
449
- console.log("Goroutine: Sending message")
450
- await ch.send("Hello from goroutine!")
528
+ {
529
+ console.log("Goroutine: Sending message")
530
+ await ch.send("Hello from goroutine!")
531
+ }
451
532
  })
533
+
452
534
  let msg = await ch.receive()
453
535
  console.log("Main goroutine: Received message:", msg)
454
536
 
537
+ // Select statement
538
+ console.log("\nSelect statement:")
539
+ let selectCh = $.makeChannel<string>(0, "")
540
+ queueMicrotask(async () => {
541
+ {
542
+ await selectCh.send("Message from select goroutine!")
543
+ }
544
+ })
545
+ let anotherCh = $.makeChannel<string>(0, "")
546
+
547
+ // Add another case
548
+ await $.selectStatement([
549
+ {
550
+ id: 0,
551
+ isSend: false,
552
+ channel: selectCh,
553
+ onSelected: async (result) => {
554
+ const selectMsg = result.value
555
+ console.log("Select received:", selectMsg)
556
+ }
557
+ },
558
+ {
559
+ id: 1,
560
+ isSend: false,
561
+ channel: anotherCh,
562
+ onSelected: async (result) => {
563
+ const anotherMsg = result.value
564
+ console.log("Select received from another channel:", anotherMsg)
565
+ }
566
+ },
567
+ ], false)
568
+
455
569
  // Function Literals
456
570
  console.log("\nFunction Literals:")
457
571
  let add = (x: number, y: number): number => {