easycoder 241211.2__tar.gz → 241215.1__tar.gz

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.

Potentially problematic release.


This version of easycoder might be problematic. Click here for more details.

Files changed (74) hide show
  1. easycoder-241215.1/PKG-INFO +78 -0
  2. easycoder-241211.2/PKG-INFO → easycoder-241215.1/README.md +12 -17
  3. easycoder-241215.1/doc/README.md +20 -0
  4. {easycoder-241211.2 → easycoder-241215.1}/doc/core/add.md +1 -1
  5. {easycoder-241211.2 → easycoder-241215.1}/doc/core/append.md +1 -1
  6. {easycoder-241211.2 → easycoder-241215.1}/doc/core/assert.md +1 -1
  7. {easycoder-241211.2 → easycoder-241215.1}/doc/core/begin.md +1 -1
  8. {easycoder-241211.2 → easycoder-241215.1}/doc/core/clear.md +1 -1
  9. {easycoder-241211.2 → easycoder-241215.1}/doc/core/close.md +1 -1
  10. {easycoder-241211.2 → easycoder-241215.1}/doc/core/create.md +1 -1
  11. {easycoder-241211.2 → easycoder-241215.1}/doc/core/debug.md +1 -1
  12. {easycoder-241211.2 → easycoder-241215.1}/doc/core/decrement.md +1 -1
  13. {easycoder-241211.2 → easycoder-241215.1}/doc/core/delete.md +1 -1
  14. {easycoder-241211.2 → easycoder-241215.1}/doc/core/divide.md +1 -1
  15. {easycoder-241211.2 → easycoder-241215.1}/doc/core/exit.md +1 -1
  16. {easycoder-241211.2 → easycoder-241215.1}/doc/core/file.md +1 -1
  17. {easycoder-241211.2 → easycoder-241215.1}/doc/core/fork.md +1 -1
  18. {easycoder-241211.2 → easycoder-241215.1}/doc/core/get.md +1 -1
  19. {easycoder-241211.2 → easycoder-241215.1}/doc/core/go.md +1 -1
  20. {easycoder-241211.2 → easycoder-241215.1}/doc/core/gosub.md +1 -1
  21. {easycoder-241211.2 → easycoder-241215.1}/doc/core/if.md +2 -2
  22. easycoder-241215.1/doc/core/import.md +13 -0
  23. {easycoder-241211.2 → easycoder-241215.1}/doc/core/increment.md +2 -2
  24. {easycoder-241211.2 → easycoder-241215.1}/doc/core/index.md +1 -1
  25. {easycoder-241211.2 → easycoder-241215.1}/doc/core/init.md +1 -1
  26. {easycoder-241211.2 → easycoder-241215.1}/doc/core/input.md +1 -1
  27. {easycoder-241211.2 → easycoder-241215.1}/doc/core/multiply.md +1 -1
  28. {easycoder-241211.2 → easycoder-241215.1}/doc/core/open.md +1 -1
  29. {easycoder-241211.2 → easycoder-241215.1}/doc/core/pop.md +1 -1
  30. {easycoder-241211.2 → easycoder-241215.1}/doc/core/post.md +1 -1
  31. {easycoder-241211.2 → easycoder-241215.1}/doc/core/print.md +1 -1
  32. {easycoder-241211.2 → easycoder-241215.1}/doc/core/push.md +1 -1
  33. {easycoder-241211.2 → easycoder-241215.1}/doc/core/put.md +1 -1
  34. {easycoder-241211.2 → easycoder-241215.1}/doc/core/read.md +1 -1
  35. {easycoder-241211.2 → easycoder-241215.1}/doc/core/replace.md +1 -1
  36. {easycoder-241211.2 → easycoder-241215.1}/doc/core/return.md +1 -1
  37. {easycoder-241211.2 → easycoder-241215.1}/doc/core/script.md +1 -1
  38. {easycoder-241211.2 → easycoder-241215.1}/doc/core/set.md +1 -1
  39. {easycoder-241211.2 → easycoder-241215.1}/doc/core/split.md +1 -1
  40. {easycoder-241211.2 → easycoder-241215.1}/doc/core/stack.md +1 -1
  41. {easycoder-241211.2 → easycoder-241215.1}/doc/core/stop.md +1 -1
  42. {easycoder-241211.2 → easycoder-241215.1}/doc/core/system.md +1 -1
  43. {easycoder-241211.2 → easycoder-241215.1}/doc/core/take.md +1 -1
  44. {easycoder-241211.2 → easycoder-241215.1}/doc/core/toggle.md +1 -1
  45. {easycoder-241211.2 → easycoder-241215.1}/doc/core/truncate.md +1 -1
  46. {easycoder-241211.2 → easycoder-241215.1}/doc/core/variable.md +1 -1
  47. {easycoder-241211.2 → easycoder-241215.1}/doc/core/wait.md +1 -1
  48. {easycoder-241211.2 → easycoder-241215.1}/doc/core/while.md +1 -1
  49. {easycoder-241211.2 → easycoder-241215.1}/doc/core/write.md +1 -1
  50. {easycoder-241211.2 → easycoder-241215.1}/easycoder/__init__.py +2 -1
  51. {easycoder-241211.2 → easycoder-241215.1}/easycoder/ec_classes.py +5 -2
  52. {easycoder-241211.2 → easycoder-241215.1}/easycoder/ec_compiler.py +1 -1
  53. {easycoder-241211.2 → easycoder-241215.1}/easycoder/ec_core.py +16 -14
  54. easycoder-241215.1/easycoder/ec_graphics.py +376 -0
  55. {easycoder-241211.2 → easycoder-241215.1}/easycoder/ec_program.py +15 -7
  56. easycoder-241215.1/easycoder/ec_renderer.py +330 -0
  57. easycoder-241215.1/plugins/example.py +91 -0
  58. {easycoder-241211.2 → easycoder-241215.1}/pyproject.toml +4 -2
  59. easycoder-241215.1/scripts/graphics-demo.ecs +70 -0
  60. easycoder-241215.1/scripts/graphics-demo.json +36 -0
  61. easycoder-241215.1/scripts/points.ecs +16 -0
  62. easycoder-241211.2/README.md +0 -60
  63. easycoder-241211.2/doc/core.md +0 -12
  64. easycoder-241211.2/test.ecs +0 -10
  65. {easycoder-241211.2 → easycoder-241215.1}/LICENSE +0 -0
  66. {easycoder-241211.2 → easycoder-241215.1}/easycoder/ec_condition.py +0 -0
  67. {easycoder-241211.2 → easycoder-241215.1}/easycoder/ec_handler.py +0 -0
  68. {easycoder-241211.2 → easycoder-241215.1}/easycoder/ec_timestamp.py +0 -0
  69. {easycoder-241211.2 → easycoder-241215.1}/easycoder/ec_value.py +0 -0
  70. {easycoder-241211.2 → easycoder-241215.1}/plugins/ec_p100.py +0 -0
  71. {easycoder-241211.2 → easycoder-241215.1}/scripts/benchmark.ecs +0 -0
  72. {easycoder-241211.2 → easycoder-241215.1}/scripts/fizzbuzz.ecs +0 -0
  73. {easycoder-241211.2 → easycoder-241215.1}/scripts/hello.ecs +0 -0
  74. {easycoder-241211.2 → easycoder-241215.1}/scripts/tests.ecs +0 -0
@@ -0,0 +1,78 @@
1
+ Metadata-Version: 2.3
2
+ Name: easycoder
3
+ Version: 241215.1
4
+ Summary: Rapid scripting in English
5
+ Keywords: compiler,scripting,prototyping,programming,coding,python,low code,hypertalk,computer language,learn to code
6
+ Author-email: Graham Trott <gtanyware@gmail.com>
7
+ Description-Content-Type: text/markdown
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Requires-Dist: pytz
10
+ Project-URL: Home, https://github.com/easycoder/easycoder-py
11
+
12
+ # Introduction
13
+ This is the Python version of **_EasyCoder_**, a high-level English-like scripting language suited for prototyping and rapid testing of ideas. It operates on the command line.
14
+
15
+ The JavaScript version of **_EasyCoder_**, which provides a full set of graphical features to run in a browser, is at
16
+
17
+ Repository: [https://github.com/easycoder/easycoder.github.io](https://github.com/easycoder/easycoder.github.io)
18
+ Website: [https://easycoder.github.io](https://easycoder.github.io)
19
+
20
+ ## Quick Start
21
+ Install **_EasyCoder_** in your Python environment:
22
+ ```
23
+ pip install easycoder
24
+ ```
25
+ Write a test script, 'hello.ecs', containing the following:
26
+ ```
27
+ print `Hello, world!`
28
+ ```
29
+ This is traditionally the first program to be written in virtually any language. To run it, use `easycoder hello.ecs`.
30
+
31
+ The output will look like this:
32
+
33
+ ```
34
+ EasyCoder version 5
35
+ Compiled <anon>: 1 lines (2 tokens) in 0 ms
36
+ Run <anon>
37
+ 1-> Hello, world!
38
+ ```
39
+ It's conventional to add a program title to a script:
40
+
41
+ ```
42
+ ! Test script
43
+ script Test
44
+ print `Hello, world!`
45
+ ```
46
+ The first line here is just a comment and has no effect on the running of the script. The second line gives the script a name, which is useful in debugging as it says which script was running. When run, the output is now
47
+
48
+ ```
49
+ EasyCoder version 5
50
+ Compiled Test: 5 lines (4 tokens) in 0 ms
51
+ Run Test
52
+ 5-> Hello, world!
53
+ ```
54
+ As you can guess from the above, the print command gives the line in the script it was called from. This is very useful in tracking down debugging print commands in large scripts.
55
+
56
+ Here in the repository is a folder called `scripts` containing some sample scripts:
57
+
58
+ `benchmark.ecs` allows the performance of EasyCoder to be compared to other languages if a similar program is written for each one
59
+ `tests.ecs` is a test program containing many of the EasyCoder features
60
+ `fizzbuzz.ecs` is a simple programming challenge often given at job interviews
61
+
62
+ ## Graphical programmming
63
+ **_EasyCoder_** is currently being extended to include a graphical programming environment. A single demo script `graphics-demo.ecs` is included in the `scripts` directory. To run it, first install the Python graphics library if it's not already present on your system. On Linux this is done with `sudo apt install python3-tk`. On Windows it's `pip install tk`. Then give the command `easycoder -g scripts/graphics-demo.ecs`.
64
+
65
+ As development progresses this demo script will be extended to include new features as they are added. **_EasyCoder_** graphics are handled by a library module, `ec_renderer` that can be used outside of the **EasyCoder_** environment, in other Python programs.
66
+
67
+ ## EasyCoder programming reference
68
+
69
+ The language comprises a general-purpose core package, which can be enhanced by plugins to provide special features on demand.
70
+
71
+ [The core package](doc/README.md)
72
+
73
+ ## Extending the language
74
+
75
+ **_EasyCoder_** can be extended to add new functionality with the use of 'plugins'. These contain compiler and runtime modules for the added language features. **_EasyCoder_** can use the added keywords, values and conditions freely; the effect is completely seamless. There is an outline example in the `plugins` directory called `example.py`, which comprises a module called `Points` with new language syntax to deal with two-valued items such as coordinates. In the `scripts` directory there is `points.ecs`, which exercises the new functionality.
76
+
77
+ A plugin can act as a wrapper around any Python functionality that has a sensible API, thereby hiding its complexity. The only challenge is to devise an unambiguous syntax that doesn't clash with anything already existing in **_EasyCoder_**
78
+
@@ -1,19 +1,9 @@
1
- Metadata-Version: 2.3
2
- Name: easycoder
3
- Version: 241211.2
4
- Summary: EasyCoder for Python
5
- Author-email: Graham Trott <gtanyware@gmail.com>
6
- Description-Content-Type: text/markdown
7
- Classifier: License :: OSI Approved :: MIT License
8
- Requires-Dist: pytz
9
- Project-URL: Home, https://github.com/easycoder
10
-
11
1
  # Introduction
12
2
  This is the Python version of **_EasyCoder_**, a high-level English-like scripting language suited for prototyping and rapid testing of ideas. It operates on the command line.
13
3
 
14
4
  The JavaScript version of **_EasyCoder_**, which provides a full set of graphical features to run in a browser, is at
15
5
 
16
- Repository: [https://github.com/easycoder/easycoder.github.io](https://github.com/easycoder/easycoder.github.io)
6
+ Repository: [https://github.com/easycoder/easycoder.github.io](https://github.com/easycoder/easycoder.github.io)
17
7
  Website: [https://easycoder.github.io](https://easycoder.github.io)
18
8
 
19
9
  ## Quick Start
@@ -58,14 +48,19 @@ Here in the repository is a folder called `scripts` containing some sample scrip
58
48
  `tests.ecs` is a test program containing many of the EasyCoder features
59
49
  `fizzbuzz.ecs` is a simple programming challenge often given at job interviews
60
50
 
61
- ## The EasyCoder programming language
62
- There are three primary components to the language:
51
+ ## Graphical programmming
52
+ **_EasyCoder_** is currently being extended to include a graphical programming environment. A single demo script `graphics-demo.ecs` is included in the `scripts` directory. To run it, first install the Python graphics library if it's not already present on your system. On Linux this is done with `sudo apt install python3-tk`. On Windows it's `pip install tk`. Then give the command `easycoder -g scripts/graphics-demo.ecs`.
53
+
54
+ As development progresses this demo script will be extended to include new features as they are added. **_EasyCoder_** graphics are handled by a library module, `ec_renderer` that can be used outside of the **EasyCoder_** environment, in other Python programs.
63
55
 
64
- - Keywords
65
- - Values
66
- - Conditions
56
+ ## EasyCoder programming reference
67
57
 
68
58
  The language comprises a general-purpose core package, which can be enhanced by plugins to provide special features on demand.
69
59
 
70
- [The core package](doc/core.md)
60
+ [The core package](doc/README.md)
61
+
62
+ ## Extending the language
63
+
64
+ **_EasyCoder_** can be extended to add new functionality with the use of 'plugins'. These contain compiler and runtime modules for the added language features. **_EasyCoder_** can use the added keywords, values and conditions freely; the effect is completely seamless. There is an outline example in the `plugins` directory called `example.py`, which comprises a module called `Points` with new language syntax to deal with two-valued items such as coordinates. In the `scripts` directory there is `points.ecs`, which exercises the new functionality.
71
65
 
66
+ A plugin can act as a wrapper around any Python functionality that has a sensible API, thereby hiding its complexity. The only challenge is to devise an unambiguous syntax that doesn't clash with anything already existing in **_EasyCoder_**
@@ -0,0 +1,20 @@
1
+ # The 'core' package
2
+
3
+ There are three primary components to the language:
4
+
5
+ - Keywords
6
+ - Values
7
+ - Conditions
8
+
9
+ The core package contains all the keywords values and conditionals needed for general programming, and in most cases these are all that will be needed.
10
+
11
+ The core keywords are:
12
+
13
+ [add](core/add.md) [append](core/append.md) [assert](core/assert.md) [begin](core/begin.md) [clear](core/clear.md) [close](core/close.md) [create](core/create.md) [debug](core/debug.md) [decrement](core/decrement.md) [delete](core/delete.md) [divide](core/divide.md) [exit](core/exit.md) [file](core/file.md) [fork](core/fork.md) [get](core/get.md) [go](core/go.md) [gosub](core/gosub.md) [if](core/if.md) [import](core/import.md) [increment](core/increment.md) [index](core/index.md) [init](core/init.md) [input](core/input.md) [multiply](core/multiply.md) [open](core/open.md) [pop](core/pop.md) [post](core/post.md) [print](core/print.md) [push](core/push.md) [put](core/put.md) [read](core/read.md) [replace](core/replace.md) [return](core/return.md) [script](core/script.md) [set](core/set.md) [split](core/split.md) [stack](core/stack.md) [stop](core/stop.md) [system](core/system.md) [take](core/take.md) [toggle](core/toggle.md) [truncate](core/truncate.md) [variable](core/variable.md) [wait](core/wait.md) [while](core/while.md) [write](core/write.md)
14
+
15
+ The core values are:
16
+
17
+
18
+ The core conditions are:
19
+
20
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Adds a numeric value to a numeric variable or adds two values and puts the resul
10
10
  Next: [append](append.md)
11
11
  Prev: [write](write.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Appends an item to a JSON array, which is is a string value held in a single var
10
10
  Next: [assert](assert.md)
11
11
  Prev: [add](add.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -8,4 +8,4 @@ Tests the condition and throws an exception if it is not true.
8
8
  Next: [begin](begin.md)
9
9
  Prev: [append](append.md)
10
10
 
11
- [Back](../core.md)
11
+ [Back](../README.md)
@@ -12,4 +12,4 @@
12
12
  Next: [clear](clear.md)
13
13
  Prev: [assert](assert.md)
14
14
 
15
- [Back](../core.md)
15
+ [Back](../README.md)
@@ -10,4 +10,4 @@
10
10
  Next: [close](close.md)
11
11
  Prev: [begin](begin.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -8,4 +8,4 @@ Close the file identified by the `{file}` variable. See `file`, `open`, `read` a
8
8
  Next: [create](create.md)
9
9
  Prev: [clear](clear.md)
10
10
 
11
- [Back](../core.md)
11
+ [Back](../README.md)
@@ -8,4 +8,4 @@ Create a directory, giving the full path in `{name}`.
8
8
  Next: [debug](debug.md)
9
9
  Prev: [close](close.md)
10
10
 
11
- [Back](../core.md)
11
+ [Back](../README.md)
@@ -13,4 +13,4 @@ Set up a debug option.
13
13
  Next: [decrement](decrement.md)
14
14
  Prev: [create](create.md)
15
15
 
16
- [Back](../core.md)
16
+ [Back](../README.md)
@@ -8,4 +8,4 @@ Decrements the value of the variable by 1. See also [increment](increment.md)
8
8
  Next: [delete](delete.md)
9
9
  Prev: [debug](debug.md)
10
10
 
11
- [Back](../core.md)
11
+ [Back](../README.md)
@@ -13,4 +13,4 @@ The second form deletes a named property of an object. See also [set property](s
13
13
  Next: [divide](divide.md)
14
14
  Prev: [decrement](decrement.md)
15
15
 
16
- [Back](../core.md)
16
+ [Back](../README.md)
@@ -11,4 +11,4 @@ Divides a numeric variable by a numeric value or divides one value by another an
11
11
  Next: [exit](exit.md)
12
12
  Prev: [delete](delete.md)
13
13
 
14
- [Back](../core.md)
14
+ [Back](../README.md)
@@ -8,4 +8,4 @@ Terminate the program.
8
8
  Next: [file](file.md)
9
9
  Prev: [divide](divide.md)
10
10
 
11
- [Back](../core.md)
11
+ [Back](../README.md)
@@ -11,4 +11,4 @@ Declare a file variable. See [open](open.md), [read](read.md), [write](write.md)
11
11
  Next: [fork](fork.md)
12
12
  Prev: [exit](exit.md)
13
13
 
14
- [Back](../core.md)
14
+ [Back](../README.md)
@@ -10,4 +10,4 @@ When `fork` is used, the forked commands run until they reach a [stop](stop.md)
10
10
  Next: [get](get.md)
11
11
  Prev: [exit](exit.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -12,4 +12,4 @@ Perform an HTTP GET to request data. In the second example, if the request fails
12
12
  Next: [gosub](gosub.md)
13
13
  Prev: [fork](fork.md)
14
14
 
15
- [Back](../core.md)
15
+ [Back](../README.md)
@@ -10,4 +10,4 @@
10
10
  Next: [gosub](gosub.md)
11
11
  Prev: [get](get.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -9,4 +9,4 @@
9
9
  Next: [if](if.md)
10
10
  Prev: [go](go.md)
11
11
 
12
- [Back](../core.md)
12
+ [Back](../README.md)
@@ -8,7 +8,7 @@
8
8
  ## Description:
9
9
  `if` tests the condition that follows. If the result is `true` then control resumes at the named label; otherwise if there's an `else` section this is executed, then the program resumes at the next instruction after the `if`. See also [while](while.md).
10
10
 
11
- Next: [increment](increment.md)
11
+ Next: [import](import.md)
12
12
  Prev: [gosub](gosub.md)
13
13
 
14
- [Back](../core.md)
14
+ [Back](../README.md)
@@ -0,0 +1,13 @@
1
+ ## Syntax:
2
+ `import {classname} from {path}`
3
+
4
+ ## Examples:
5
+ `import Points from plugins/example.py`
6
+
7
+ ## Description:
8
+ As with [script](script.md), `import` is a compiler directive that should be placed at the top of the script, under the [script](script.md) directive. It's used to call in a plugin language extension where needed. The example above is provided in the repository, to be used as a starting point for your own extra functionality.
9
+
10
+ Next: [increment](increment.md)
11
+ Prev: [if](if.md)
12
+
13
+ [Back](../README.md)
@@ -8,6 +8,6 @@
8
8
  Add 1 to the value of the variable. See also [decrement](decrement.md).
9
9
 
10
10
  Next: [index](index.md)
11
- Prev: [if](if.md)
11
+ Prev: [import](import.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -12,4 +12,4 @@
12
12
  Next: [init](init.md)
13
13
  Prev: [increment](increment.md)
14
14
 
15
- [Back](../core.md)
15
+ [Back](../README.md)
@@ -11,4 +11,4 @@
11
11
  Next: [input](input.md)
12
12
  Prev: [index](index.md)
13
13
 
14
- [Back](../core.md)
14
+ [Back](../README.md)
@@ -10,4 +10,4 @@
10
10
  Next: [multiply](multiply.md)
11
11
  Prev: [init](init.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -11,4 +11,4 @@ Multiplies a numeric variable by a numeric value or multiplies one value by anot
11
11
  Next: [open](open.md)
12
12
  Prev: [input](input.md)
13
13
 
14
- [Back](../core.md)
14
+ [Back](../README.md)
@@ -22,4 +22,4 @@ Opens a disk file for reading, writing or appending. Each of the [file](file.md)
22
22
  Next: [pop](pop.md)
23
23
  Prev: [multiply](multiply.md)
24
24
 
25
- [Back](../core.md)
25
+ [Back](../README.md)
@@ -9,4 +9,4 @@ Pops the top value from the specified [stack](stack.md).
9
9
  Next: [post](post.md)
10
10
  Prev: [open](open.md)
11
11
 
12
- [Back](../core.md)
12
+ [Back](../README.md)
@@ -14,4 +14,4 @@ Perform an HTTP PUT request with the specified data and endpoint, optionally sav
14
14
  Next: [print](print.md)
15
15
  Prev: [pop](pop.md)
16
16
 
17
- [Back](../core.md)
17
+ [Back](../README.md)
@@ -11,4 +11,4 @@ The output is prefixed by the script line number of the print command. This is v
11
11
  Next: [push](push.md)
12
12
  Prev: [post](post.md)
13
13
 
14
- [Back](../core.md)
14
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Push something onto the specified [stack](stack.md).
10
10
  Next: [put](put.md)
11
11
  Prev: [print](print.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Put a value into a [variable](variable.md). The second example illustrates how t
10
10
  Next: [read](read.md)
11
11
  Prev: [push](push.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -9,4 +9,4 @@ Read a value from a [file](file.md). See [open](open.md), [write](write.md) and
9
9
  Next: [replace](replace.md)
10
10
  Prev: [put](put.md)
11
11
 
12
- [Back](../core.md)
12
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Replaces all occurrences of one string with another in a string [variable](varia
10
10
  Next: [return](return.md)
11
11
  Prev: [read](read.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -9,4 +9,4 @@ Return from a subroutine. See [gosub](gosub.md).
9
9
  Next: [script](script.md)
10
10
  Prev: [replace](replace.md)
11
11
 
12
- [Back](../core.md)
12
+ [Back](../README.md)
@@ -9,4 +9,4 @@ Provides a name for the script. Note that `name` is literal text, not a script v
9
9
  Next: [set](set.md)
10
10
  Prev: [return](return.md)
11
11
 
12
- [Back](../core.md)
12
+ [Back](../README.md)
@@ -22,4 +22,4 @@
22
22
  Next: [split](split.md)
23
23
  Prev: [script](script.md)
24
24
 
25
- [Back](../core.md)
25
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Split a [variable](variable.md) containing a string into a number of parts on a
10
10
  Next: [stack](stack.md)
11
11
  Prev: [set](set.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Declares a stack variable, a special kind of array that permits elements to be [
10
10
  Next: [stop](stop.md)
11
11
  Prev: [split](split.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -12,4 +12,4 @@ Stop execution of the current thread. The program will not exit as there may be
12
12
  Next: [system](system.md)
13
13
  Prev: [stack](stack.md)
14
14
 
15
- [Back](../core.md)
15
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Issue a command to the operating system.
10
10
  Next: [take](take.md)
11
11
  Prev: [stop](stop.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -12,4 +12,4 @@ Subtracts a numeric value from a numeric variable or subtracts one value from an
12
12
  Next: [toggle](toggle.md)
13
13
  Prev: [system](system.md)
14
14
 
15
- [Back](../core.md)
15
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Toggle - change from `true` to `false` or vice versa - a variable that has been
10
10
  Next: [variable](variable.md)
11
11
  Prev: [take](take.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -11,4 +11,4 @@ Truncate a file
11
11
  Next: [variable](variable.md)
12
12
  Prev: [toggle](toggle.md)
13
13
 
14
- [Back](../core.md)
14
+ [Back](../README.md)
@@ -12,4 +12,4 @@ Variables can be assigned any number of elements - see [set the elements](set.md
12
12
  Next: [wait](wait.md)
13
13
  Prev: [toggle](toggle.md)
14
14
 
15
- [Back](../core.md)
15
+ [Back](../README.md)
@@ -15,4 +15,4 @@ By "thread" we mean the pseudo-threads **_EasyCoder_** uses to simulate multi-ta
15
15
  Next: [while](while.md)
16
16
  Prev: [variable](variable.md)
17
17
 
18
- [Back](../core.md)
18
+ [Back](../README.md)
@@ -17,4 +17,4 @@ When constructing loops like this it's common for programmers to forget to bump
17
17
  Next: [write](write.md)
18
18
  Prev: [wait](wait.md)
19
19
 
20
- [Back](../core.md)
20
+ [Back](../README.md)
@@ -10,4 +10,4 @@ Write a value to a [file](file.md). See [open](open.md), [read](read.md) and [cl
10
10
  Next: [add](add.md)
11
11
  Prev: [while](while.md)
12
12
 
13
- [Back](../core.md)
13
+ [Back](../README.md)
@@ -8,5 +8,6 @@ from .ec_handler import *
8
8
  from .ec_program import *
9
9
  from .ec_timestamp import *
10
10
  from .ec_value import *
11
+ from .ec_graphics import *
11
12
 
12
- __version__ = "241211.2"
13
+ __version__ = "241215.1"
@@ -9,11 +9,14 @@ class FatalError:
9
9
  sys.exit()
10
10
 
11
11
  class AssertionError:
12
- def __init__(self, program):
12
+ def __init__(self, program, msg=None):
13
13
  code = program.code[program.pc]
14
14
  lino = code['lino']
15
15
  script = program.script.lines[lino].strip()
16
- print(f'Assertion Error in {program.name} at line {lino + 1}')
16
+ message = f'Assertion Error in {program.name} at line {lino + 1}'
17
+ if msg != None:
18
+ message += f': {msg}'
19
+ print(message)
17
20
  sys.exit()
18
21
 
19
22
  class RuntimeError:
@@ -101,7 +101,7 @@ class Compiler:
101
101
 
102
102
  def showWarnings(self):
103
103
  for warning in self.warnings:
104
- print(f'Line {self.getLino() + 1}: {warning}')
104
+ print(f'Warning: Line {self.getLino() + 1}: {warning}')
105
105
 
106
106
  def getSymbolRecord(self):
107
107
  token = self.getToken()