pyscript-programming-language 1.12.6__tar.gz → 1.12.7__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.
Files changed (89) hide show
  1. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/PKG-INFO +18 -16
  2. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/README.md +17 -15
  3. pyscript_programming_language-1.12.7/changelog.md +12 -0
  4. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyproject.toml +1 -1
  5. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/__main__.py +2 -2
  6. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/constants.py +10 -7
  7. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/editor/bases.py +2 -2
  8. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/handlers.py +2 -2
  9. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/highlight.py +5 -4
  10. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/interpreter.py +22 -14
  11. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/lexer.py +1 -1
  12. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/nodes.py +7 -0
  13. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/parser.py +47 -40
  14. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/position.py +2 -2
  15. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/pysbuiltins.py +4 -4
  16. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/runner.py +10 -2
  17. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/shell.py +104 -6
  18. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/debug.py +6 -6
  19. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/generic.py +3 -2
  20. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/module.py +5 -6
  21. pyscript_programming_language-1.12.7/pyscript/core/utils/path.py +28 -0
  22. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/version.py +2 -2
  23. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/ast/ast_dump.py +3 -0
  24. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/ast/ast_literal_eval.py +1 -3
  25. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/ast/ast_unparse.py +3 -0
  26. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/brainfuck.pys +75 -47
  27. pyscript_programming_language-1.12.7/pyscript/lib/history.pys +40 -0
  28. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/parser.pys +4 -4
  29. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript_programming_language.egg-info/PKG-INFO +18 -16
  30. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript_programming_language.egg-info/SOURCES.txt +1 -0
  31. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/setup.py +1 -1
  32. pyscript_programming_language-1.12.6/changelog.md +0 -7
  33. pyscript_programming_language-1.12.6/pyscript/core/utils/path.py +0 -29
  34. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/MANIFEST.in +0 -0
  35. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/__init__.py +0 -0
  36. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/__init__.pyi +0 -0
  37. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/__init__.py +0 -0
  38. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/analyzer.py +0 -0
  39. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/bases.py +0 -0
  40. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/buffer.py +0 -0
  41. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/cache.py +0 -0
  42. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/checks.py +0 -0
  43. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/context.py +0 -0
  44. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/editor/__init__.py +0 -0
  45. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/editor/gui.py +0 -0
  46. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/editor/terminal.py +0 -0
  47. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/exceptions.py +0 -0
  48. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/mapping.py +0 -0
  49. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/objects.py +0 -0
  50. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/results.py +0 -0
  51. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/symtab.py +0 -0
  52. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/token.py +0 -0
  53. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/__init__.py +0 -0
  54. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/ansi.py +0 -0
  55. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/decorators.py +0 -0
  56. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/jsdict.py +0 -0
  57. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/similarity.py +0 -0
  58. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/core/utils/string.py +0 -0
  59. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/__hello__.pys +0 -0
  60. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/ansi.pys +0 -0
  61. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/ast/__init__.pys +0 -0
  62. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/ast/ast_walk.py +0 -0
  63. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/dis.pys +0 -0
  64. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/explorer.pys +0 -0
  65. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/fpstimer/__init__.pys +0 -0
  66. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/fpstimer/py_fpstimer.py +0 -0
  67. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/getch/__init__.pys +0 -0
  68. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/getch/py_getch.py +0 -0
  69. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/inspect.pys +0 -0
  70. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/jsdict.pys +0 -0
  71. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/keyword.pys +0 -0
  72. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/opcode.pys +0 -0
  73. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/pdisplay.pys +0 -0
  74. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/site.pys +0 -0
  75. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/symtable.pys +0 -0
  76. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/token.pys +0 -0
  77. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/tokenize/__init__.pys +0 -0
  78. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/lib/tokenize/tok_untokenize.py +0 -0
  79. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/other/.nomedia +0 -0
  80. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/other/PyScript.ico +0 -0
  81. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/other/copyright +0 -0
  82. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/other/credits +0 -0
  83. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/other/license +0 -0
  84. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/site-packages/this.pys +0 -0
  85. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript/this.py +0 -0
  86. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  87. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript_programming_language.egg-info/requires.txt +0 -0
  88. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  89. {pyscript_programming_language-1.12.6 → pyscript_programming_language-1.12.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.12.6
3
+ Version: 1.12.7
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: azzammuhyala
@@ -26,7 +26,7 @@ Dynamic: author
26
26
  Dynamic: home-page
27
27
  Dynamic: requires-python
28
28
 
29
- # PyScript
29
+ # PyScript 🐍🟨🟦⬛
30
30
 
31
31
  <div align="center">
32
32
  <img src="https://github.com/azzammuhyala/pyscript/blob/main/PyScript.png?raw=true" alt="PyScript Logo" width="200">
@@ -35,7 +35,7 @@ Dynamic: requires-python
35
35
  PyScript is a simple programming language built on top of Python. It combines some syntax from Python and JavaScript,
36
36
  so if you're already familiar with Python, JavaScript or both, it should be quite easy to learn.
37
37
 
38
- ## Introduction
38
+ ## Introduction 📖
39
39
  PyScript may not be the language we'll be discussing, but the name PyScript already exists, a flexible and platform for
40
40
  running Python in a browser. Since it's inception, the language was inspired by Python and JavaScript, which are
41
41
  relatively easy for humans to read. This name was chosen because it wasn't immediately known whether this name was
@@ -50,7 +50,7 @@ low-level languages.
50
50
  To learn more about PyScript, you can see on [PyScript documentation](https://azzammuhyala.github.io/pyscript) or
51
51
  [PyScript repository](https://github.com/azzammuhyala/pyscript) for full source code.
52
52
 
53
- ## Installation
53
+ ## Installation ⬇️
54
54
  First, you'll need to download Python. Make sure you're using the latest version above `3.10`, to ensure the code runs
55
55
  correctly. Visit the official [Python website](https://python.org) to download it.
56
56
 
@@ -82,11 +82,11 @@ If successful, you can see the version, release date, and a `>>>` like Python sh
82
82
  > If you are using the VS Code editor, you can use the
83
83
  [PyScript extension](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang) for Syntax Highlight!
84
84
 
85
- ## Example
85
+ ## Example 📜
86
86
  Familiar? There it is!
87
87
  <pre><span style="color:#549952"># get a number and operator with input()</span><span style="color:#D4D4D4"><br></span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a first number : &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"><br></span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a second number: &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"><br></span><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">input</span><span style="color:#FFD705">(</span><span style="color:#CE9178">&quot;Enter an operation (+, -, *, /): &quot;</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"><br><br></span><span style="color:#549952"># define a functions</span><span style="color:#D4D4D4"><br></span><span style="color:#307CD6">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">add</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">return</span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> + </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span><span style="color:#D4D4D4"><br><br></span><span style="color:#307CD6">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">sub</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">return</span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> - </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span><span style="color:#D4D4D4"><br><br></span><span style="color:#307CD6">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">mul</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">return</span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> * </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span><span style="color:#D4D4D4"><br><br></span><span style="color:#307CD6">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">floordiv</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#549952"># check b is zero</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">return</span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> != </span><span style="color:#B5CEA8">0</span><span style="color:#D4D4D4"> ? </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> / </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> : </span><span style="color:#CE9178">&quot;Cannot be divided by 0!&quot;</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span><span style="color:#D4D4D4"><br><br></span><span style="color:#549952"># operation matching</span><span style="color:#D4D4D4"><br></span><span style="color:#C586C0">switch</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">strip</span><span style="color:#D45DBA">()</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;+&#x27;</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">add</span><span style="color:#D45DBA">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} + {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><span style="color:#D4D4D4"><br><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;-&#x27;</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">sub</span><span style="color:#D45DBA">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} - {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><span style="color:#D4D4D4"><br><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;*&#x27;</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">mul</span><span style="color:#D45DBA">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} * {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><span style="color:#D4D4D4"><br><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;/&#x27;</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">floordiv</span><span style="color:#D45DBA">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} / {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><span style="color:#D4D4D4"><br><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">default</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Unknown operation&quot;</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span></pre>
88
88
 
89
- ## Library Requirements
89
+ ## Library Requirements 📓
90
90
  | No | Name | Status |
91
91
  |:--:|:------------------|:----------------------:|
92
92
  | 1 | `argparse` | **required** |
@@ -108,18 +108,20 @@ Familiar? There it is!
108
108
  | 17 | `types` | **required** |
109
109
  | 18 | `typing` | **required** |
110
110
  | 19 | `unicodedata` | **required** |
111
- | 1 | `msvcrt` | **required (library)** |
112
- | 2 | `pprint` | **required (library)** |
113
- | 3 | `shutil` | **required (library)** |
114
- | 4 | `stat` | **required (library)** |
115
- | 5 | `termios` | **required (library)** |
116
- | 6 | `time` | **required (library)** |
117
- | 7 | `tty` | **required (library)** |
111
+ | 1 | `ast` | **required (library)** |
112
+ | 2 | `msvcrt` | **required (library)** |
113
+ | 3 | `pprint` | **required (library)** |
114
+ | 4 | `shutil` | **required (library)** |
115
+ | 5 | `stat` | **required (library)** |
116
+ | 6 | `termios` | **required (library)** |
117
+ | 7 | `time` | **required (library)** |
118
+ | 8 | `tty` | **required (library)** |
118
119
  | 1 | `beartype` | **optional** |
119
120
  | 2 | `prompt_toolkit` | **optional** |
120
121
  | 3 | `pygments` | **optional** |
121
- | 4 | `tkinter` | **optional** |
122
- | 5 | `IPython` | **optional** |
122
+ | 4 | `readline` | **optional** |
123
+ | 5 | `tkinter` | **optional** |
124
+ | 6 | `IPython` | **optional** |
123
125
 
124
126
  ### Status Explanation
125
127
  - **required**: Required by PyScript entirely.
@@ -127,7 +129,7 @@ Familiar? There it is!
127
129
  import it.
128
130
  - **optional**: Not required, but if it is present, some features can be used without issue.
129
131
 
130
- ## Behind it
132
+ ## Behind it 🕰️
131
133
  This language created from based up on a
132
134
  [YouTube tutorial](https://www.youtube.com/playlist?list=PLZQftyCk7_SdoVexSmwy_tBgs7P0b97yD) (check more on GitHub
133
135
  [here](https://github.com/davidcallanan/py-myopl-code) by **@davidcallanan**). At least, it takes about 6 months to
@@ -1,4 +1,4 @@
1
- # PyScript
1
+ # PyScript 🐍🟨🟦⬛
2
2
 
3
3
  <div align="center">
4
4
  <img src="https://github.com/azzammuhyala/pyscript/blob/main/PyScript.png?raw=true" alt="PyScript Logo" width="200">
@@ -7,7 +7,7 @@
7
7
  PyScript is a simple programming language built on top of Python. It combines some syntax from Python and JavaScript,
8
8
  so if you're already familiar with Python, JavaScript or both, it should be quite easy to learn.
9
9
 
10
- ## Introduction
10
+ ## Introduction 📖
11
11
  PyScript may not be the language we'll be discussing, but the name PyScript already exists, a flexible and platform for
12
12
  running Python in a browser. Since it's inception, the language was inspired by Python and JavaScript, which are
13
13
  relatively easy for humans to read. This name was chosen because it wasn't immediately known whether this name was
@@ -22,7 +22,7 @@ low-level languages.
22
22
  To learn more about PyScript, you can see on [PyScript documentation](https://azzammuhyala.github.io/pyscript) or
23
23
  [PyScript repository](https://github.com/azzammuhyala/pyscript) for full source code.
24
24
 
25
- ## Installation
25
+ ## Installation ⬇️
26
26
  First, you'll need to download Python. Make sure you're using the latest version above `3.10`, to ensure the code runs
27
27
  correctly. Visit the official [Python website](https://python.org) to download it.
28
28
 
@@ -54,11 +54,11 @@ If successful, you can see the version, release date, and a `>>>` like Python sh
54
54
  > If you are using the VS Code editor, you can use the
55
55
  [PyScript extension](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang) for Syntax Highlight!
56
56
 
57
- ## Example
57
+ ## Example 📜
58
58
  Familiar? There it is!
59
59
  <pre><span style="color:#549952"># get a number and operator with input()</span><span style="color:#D4D4D4"><br></span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a first number : &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"><br></span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a second number: &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"><br></span><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">input</span><span style="color:#FFD705">(</span><span style="color:#CE9178">&quot;Enter an operation (+, -, *, /): &quot;</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"><br><br></span><span style="color:#549952"># define a functions</span><span style="color:#D4D4D4"><br></span><span style="color:#307CD6">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">add</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">return</span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> + </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span><span style="color:#D4D4D4"><br><br></span><span style="color:#307CD6">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">sub</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">return</span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> - </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span><span style="color:#D4D4D4"><br><br></span><span style="color:#307CD6">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">mul</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">return</span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> * </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span><span style="color:#D4D4D4"><br><br></span><span style="color:#307CD6">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">floordiv</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#549952"># check b is zero</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">return</span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> != </span><span style="color:#B5CEA8">0</span><span style="color:#D4D4D4"> ? </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> / </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> : </span><span style="color:#CE9178">&quot;Cannot be divided by 0!&quot;</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span><span style="color:#D4D4D4"><br><br></span><span style="color:#549952"># operation matching</span><span style="color:#D4D4D4"><br></span><span style="color:#C586C0">switch</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">strip</span><span style="color:#D45DBA">()</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">{</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;+&#x27;</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">add</span><span style="color:#D45DBA">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} + {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><span style="color:#D4D4D4"><br><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;-&#x27;</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">sub</span><span style="color:#D45DBA">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} - {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><span style="color:#D4D4D4"><br><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;*&#x27;</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">mul</span><span style="color:#D45DBA">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} * {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><span style="color:#D4D4D4"><br><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;/&#x27;</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">floordiv</span><span style="color:#D45DBA">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} / {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><span style="color:#D4D4D4"><br><br></span><span style="color:#D4D4D4"> </span><span style="color:#C586C0">default</span><span style="color:#D4D4D4">:</span><span style="color:#D4D4D4"><br></span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Unknown operation&quot;</span><span style="color:#D45DBA">)</span><span style="color:#D4D4D4"><br></span><span style="color:#FFD705">}</span></pre>
60
60
 
61
- ## Library Requirements
61
+ ## Library Requirements 📓
62
62
  | No | Name | Status |
63
63
  |:--:|:------------------|:----------------------:|
64
64
  | 1 | `argparse` | **required** |
@@ -80,18 +80,20 @@ Familiar? There it is!
80
80
  | 17 | `types` | **required** |
81
81
  | 18 | `typing` | **required** |
82
82
  | 19 | `unicodedata` | **required** |
83
- | 1 | `msvcrt` | **required (library)** |
84
- | 2 | `pprint` | **required (library)** |
85
- | 3 | `shutil` | **required (library)** |
86
- | 4 | `stat` | **required (library)** |
87
- | 5 | `termios` | **required (library)** |
88
- | 6 | `time` | **required (library)** |
89
- | 7 | `tty` | **required (library)** |
83
+ | 1 | `ast` | **required (library)** |
84
+ | 2 | `msvcrt` | **required (library)** |
85
+ | 3 | `pprint` | **required (library)** |
86
+ | 4 | `shutil` | **required (library)** |
87
+ | 5 | `stat` | **required (library)** |
88
+ | 6 | `termios` | **required (library)** |
89
+ | 7 | `time` | **required (library)** |
90
+ | 8 | `tty` | **required (library)** |
90
91
  | 1 | `beartype` | **optional** |
91
92
  | 2 | `prompt_toolkit` | **optional** |
92
93
  | 3 | `pygments` | **optional** |
93
- | 4 | `tkinter` | **optional** |
94
- | 5 | `IPython` | **optional** |
94
+ | 4 | `readline` | **optional** |
95
+ | 5 | `tkinter` | **optional** |
96
+ | 6 | `IPython` | **optional** |
95
97
 
96
98
  ### Status Explanation
97
99
  - **required**: Required by PyScript entirely.
@@ -99,7 +101,7 @@ Familiar? There it is!
99
101
  import it.
100
102
  - **optional**: Not required, but if it is present, some features can be used without issue.
101
103
 
102
- ## Behind it
104
+ ## Behind it 🕰️
103
105
  This language created from based up on a
104
106
  [YouTube tutorial](https://www.youtube.com/playlist?list=PLZQftyCk7_SdoVexSmwy_tBgs7P0b97yD) (check more on GitHub
105
107
  [here](https://github.com/davidcallanan/py-myopl-code) by **@davidcallanan**). At least, it takes about 6 months to
@@ -0,0 +1,12 @@
1
+ # Change Log
2
+
3
+ ## [1.12.7] - 18/03/2026
4
+
5
+ ### Added
6
+ - Updated history features in the advanced shell (_REPL_) with `pygments`.
7
+ - New node for the constant keyword `__debug__`.
8
+ - Wrap around pointer and garbage collection mechanism in the `brainfuck` module.
9
+
10
+ ### Fixed
11
+ - **Fixed some bugs**.
12
+ - _etc._
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyscript-programming-language"
7
- version = "1.12.6"
7
+ version = "1.12.7"
8
8
  description = "PyScript Programming Language"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.10"
@@ -45,7 +45,7 @@ FORMAT_HIGHLIGHT_MAP = {
45
45
  EDITOR_MAP = {}
46
46
 
47
47
  for supported, name, class_editor in [
48
- (GUI_SUPPORT, 'gui', PysGUIEditor),
48
+ (GUI_SUPPORT, 'gui', PysGUIEditor),
49
49
  (TERMINAL_SUPPORT, 'terminal', PysTerminalEditor)
50
50
  ]:
51
51
  if supported:
@@ -173,7 +173,7 @@ com_idx = argv.index('-c', 0, end_com) if '-c' in arg_com else \
173
173
  (argv.index('--command', 0, end_com) if '--command' in arg_com else -1)
174
174
 
175
175
  args = parser.parse_args(argv if com_idx == -1 else argv[:com_idx + 2])
176
- arg = args.arg if com_idx == -1 else argv[com_idx + 2:]
176
+ arg = args.arg if com_idx == -1 else argv[com_idx + 2:]
177
177
 
178
178
  if args.terminal:
179
179
 
@@ -1,13 +1,14 @@
1
- from os.path import sep, join
2
1
  from types import MappingProxyType
3
2
 
3
+ import os
4
+
4
5
  # paths
5
- PYSCRIPT_PATH = sep.join(__file__.split(sep)[:-2])
6
- CORE_PATH = join(PYSCRIPT_PATH, 'core')
7
- LIBRARIES_PATH = join(PYSCRIPT_PATH, 'lib')
8
- SITE_PACKAGES_PATH = join(PYSCRIPT_PATH, 'site-packages')
9
- OTHER_PATH = join(PYSCRIPT_PATH, 'other')
10
- ICON_PATH = join(OTHER_PATH, 'PyScript.ico')
6
+ PYSCRIPT_PATH = os.path.sep.join(__file__.split(os.path.sep)[:-2])
7
+ CORE_PATH = os.path.join(PYSCRIPT_PATH, 'core')
8
+ LIBRARIES_PATH = os.path.join(PYSCRIPT_PATH, 'lib')
9
+ OTHER_PATH = os.path.join(PYSCRIPT_PATH, 'other')
10
+ SITE_PACKAGES_PATH = os.path.join(PYSCRIPT_PATH, 'site-packages')
11
+ ICON_PATH = os.path.join(OTHER_PATH, 'PyScript.ico')
11
12
 
12
13
  # environment variables
13
14
  ENV_PYSCRIPT_NO_EXCEPTHOOK = 'PYSCRIPT_NO_EXCEPTHOOK'
@@ -17,6 +18,8 @@ ENV_PYSCRIPT_NO_TYPECHECK = 'PYSCRIPT_NO_TYPECHECK'
17
18
  ENV_PYSCRIPT_NO_COLOR_PROMPT = 'PYSCRIPT_NO_COLOR_PROMPT'
18
19
  ENV_PYSCRIPT_MAXIMUM_TRACEBACK_LINE = 'PYSCRIPT_MAXIMUM_TRACEBACK_LINE'
19
20
  ENV_PYSCRIPT_CLASSIC_LINE_SHELL = 'PYSCRIPT_CLASSIC_LINE_SHELL'
21
+ ENV_PYSCRIPT_HISTORY_PATH = 'PYSCRIPT_HISTORY_PATH'
22
+ ENV_PYSCRIPT_MAXIMUM_HISTORY_LINE = 'PYSCRIPT_MAXIMUM_HISTORY_LINE'
20
23
 
21
24
  # tokens offset
22
25
  DOUBLE = 2**8
@@ -4,7 +4,7 @@ from ..utils.decorators import typechecked, inheritable
4
4
  from ..utils.generic import setimuattr
5
5
  from ..utils.string import normstr
6
6
 
7
- from os.path import basename
7
+ import os
8
8
 
9
9
  class PysEditor(Pys):
10
10
 
@@ -14,7 +14,7 @@ class PysEditor(Pys):
14
14
  self.used = False
15
15
  self.modified = False
16
16
  self.wrapped = True
17
- self.basename = basename(self.file.name)
17
+ self.basename = os.path.basename(self.file.name)
18
18
 
19
19
  def __init_subclass__(cls, **kwargs) -> None:
20
20
  super().__init_subclass__(**kwargs)
@@ -12,10 +12,10 @@ wrapper_function = (MethodType, classmethod, staticmethod)
12
12
 
13
13
  if not is_environ(ENV_PYSCRIPT_NO_GIL):
14
14
  from threading import RLock
15
- lock = RLock()
15
+ gil_lock = RLock()
16
16
 
17
17
  def handle_call(object: Any, context: PysContext, position: PysPosition) -> None:
18
- with lock:
18
+ with gil_lock:
19
19
 
20
20
  if (ins := isinstance)(object, PysFunction):
21
21
  code = object.__code__
@@ -42,7 +42,7 @@ BUILTIN_TYPES = frozenset(
42
42
  BUILTIN_FUNCTIONS = frozenset(
43
43
  name
44
44
  for name, object in pys_builtins.__dict__.items()
45
- if is_public_attribute(name) and callable(object)
45
+ if is_public_attribute(name) and callable(object) and not isinstance(object, type)
46
46
  )
47
47
 
48
48
  try:
@@ -55,6 +55,7 @@ try:
55
55
  from pygments.unistring import xid_start, xid_continue
56
56
 
57
57
  _set_constant_keywords = frozenset(CONSTANT_KEYWORDS)
58
+ _keywords = '|'.join(KEYWORDS)
58
59
  _unicode_name = f'[{xid_start}][{xid_continue}]*'
59
60
  _newlines = r'\r\n|\r|\n'
60
61
  _integer = r'[0-9](?:_?[0-9])*'
@@ -218,13 +219,13 @@ try:
218
219
 
219
220
  # Class definition
220
221
  (
221
- rf'\b(class)\b(\s+)({_dollar}{_unicode_name})\b',
222
+ rf'\b(class)\b(\s+)(?!(?:{_keywords})\b)({_dollar}{_unicode_name})\b',
222
223
  bygroups(Keyword.Constant, Whitespace, Name.Class)
223
224
  ),
224
225
 
225
226
  # Function definition
226
227
  (
227
- rf'\b(def|define|func|function)\b(\s+)({_dollar}{_unicode_name})\b',
228
+ rf'\b(def|define|func|function)\b(\s+)(?!(?:{_keywords})\b)({_dollar}{_unicode_name})\b',
228
229
  bygroups(Keyword.Constant, Whitespace, Name.Function)
229
230
  ),
230
231
 
@@ -355,7 +356,7 @@ try:
355
356
  ] + tokens['root']
356
357
 
357
358
  del (
358
- _set_constant_keywords, _unicode_name, _newlines, _integer, _scientific, _imaginary, _dollar,
359
+ _set_constant_keywords, _keywords, _unicode_name, _newlines, _integer, _scientific, _imaginary, _dollar,
359
360
  _raw_string_prefixes, _string_or_bytes_prefixes
360
361
  )
361
362
 
@@ -49,11 +49,10 @@ def visit_StringNode(node: PysStringNode, context: PysContext) -> PysRunTimeResu
49
49
  return PysRunTimeResult().success(node.value.value)
50
50
 
51
51
  def visit_KeywordNode(node: PysKeywordNode, context: PysContext) -> PysRunTimeResult:
52
- return PysRunTimeResult().success(
53
- (True if context.flags & DEBUG else False)
54
- if (name := node.name.value) == '__debug__' else
55
- get_value_from_keyword(name)
56
- )
52
+ return PysRunTimeResult().success(get_value_from_keyword(node.name.value))
53
+
54
+ def visit_DebugNode(node: PysDebugNode, context: PysContext) -> PysRunTimeResult:
55
+ return PysRunTimeResult().success(True if context.flags & DEBUG else False)
57
56
 
58
57
  def visit_IdentifierNode(node: PysIdentifierNode, context: PysContext) -> PysRunTimeResult:
59
58
  result = PysRunTimeResult()
@@ -208,7 +207,6 @@ def visit_CallNode(node: PysCallNode, context: PysContext) -> PysRunTimeResult:
208
207
  should_return = result.should_return
209
208
  add_arg = args.append
210
209
  add_kwarg = kwargs.__setitem__
211
- nposition = node.position
212
210
  ntarget = node.target
213
211
 
214
212
  target = register(get_visitor(ntarget.__class__)(ntarget, context))
@@ -228,7 +226,7 @@ def visit_CallNode(node: PysCallNode, context: PysContext) -> PysRunTimeResult:
228
226
  if should_return():
229
227
  return result
230
228
 
231
- with result(context, nposition):
229
+ with result(context, nposition := node.position):
232
230
  handle_call(target, context, nposition)
233
231
  return result.success(target(*args, **kwargs))
234
232
 
@@ -316,15 +314,20 @@ def visit_BinaryOperatorNode(node: PysBinaryOperatorNode, context: PysContext) -
316
314
 
317
315
  toperand = node.operand
318
316
  otype = toperand.type
319
- ovalue = toperand.value
320
317
  nright = node.right
321
318
 
322
319
  with result(context, node.position):
323
320
  return_right = True
324
321
 
325
- if (otype == T_KEYWORD and ovalue == 'and') or otype == T_AND:
322
+ if otype == T_KEYWORD:
323
+ ovalue = toperand.value
324
+ if ovalue == 'and':
325
+ if not left: return result.success(left)
326
+ elif ovalue == 'or':
327
+ if left: return result.success(left)
328
+ elif otype == T_AND:
326
329
  if not left: return result.success(left)
327
- elif (otype == T_KEYWORD and ovalue == 'or') or otype == T_OR:
330
+ elif otype == T_OR:
328
331
  if left: return result.success(left)
329
332
  elif otype == T_NULLISH:
330
333
  if left is not None: return result.success(left)
@@ -350,13 +353,18 @@ def visit_UnaryOperatorNode(node: PysUnaryOperatorNode, context: PysContext) ->
350
353
 
351
354
  toperand = node.operand
352
355
  otype = toperand.type
353
- ovalue = toperand.value
354
356
 
355
357
  with result(context, node.position):
356
- if (otype == T_KEYWORD and ovalue == 'not') or otype == T_NOT:
358
+
359
+ if otype == T_KEYWORD:
360
+ ovalue = toperand.value
361
+ if ovalue == 'not':
362
+ return result.success(not value)
363
+ elif ovalue == 'typeof':
364
+ return result.success(type(value).__name__)
365
+ elif otype == T_NOT:
357
366
  return result.success(not value)
358
- elif otype == T_KEYWORD and ovalue == 'typeof':
359
- return result.success(type(value).__name__)
367
+
360
368
  return result.success(GET_UNARY_FUNCTIONS_MAP(otype)(value))
361
369
 
362
370
  return result
@@ -601,7 +601,7 @@ class PysLexer(Pys):
601
601
  try:
602
602
  string = string.encode('latin-1')
603
603
  except UnicodeEncodeError:
604
- self.throw(start, self.index, "invalid bytes literal", add_token=False)
604
+ self.throw(start, self.index, "bytes can only contain ASCII literal characters", add_token=False)
605
605
 
606
606
  self.add_token(TOKENS['STRING'], start, string)
607
607
 
@@ -59,6 +59,13 @@ class PysKeywordNode(PysNode):
59
59
  def __repr__(self) -> str:
60
60
  return f'Keyword(name={self.name!r})'
61
61
 
62
+ class PysDebugNode(PysNode):
63
+
64
+ __slots__ = ()
65
+
66
+ def __repr__(self) -> Literal['Debug()']:
67
+ return 'Debug()'
68
+
62
69
  class PysIdentifierNode(PysNode):
63
70
 
64
71
  __slots__ = ('name',)
@@ -177,7 +177,7 @@ class PysParser(Pys):
177
177
  return self.assert_statement()
178
178
 
179
179
  elif self.current_token.type == TOKENS['AT']:
180
- return self.decorator()
180
+ return self.decorator_statement()
181
181
 
182
182
  elif self.current_token.match(TOKENS['KEYWORD'], 'continue'):
183
183
  result = PysParserResult()
@@ -707,13 +707,20 @@ class PysParser(Pys):
707
707
  result = PysParserResult()
708
708
  token = self.current_token
709
709
 
710
- if token.match(TOKENS['KEYWORD'], '__debug__', 'True', 'False', 'None', 'true', 'false', 'nil', 'none', 'null'):
710
+ if token.match(TOKENS['KEYWORD'], 'True', 'False', 'None', 'true', 'false', 'nil', 'none', 'null'):
711
711
  result.register_advancement()
712
712
  self.advance()
713
713
  self.skip_expression(result)
714
714
 
715
715
  return result.success(PysKeywordNode(token))
716
716
 
717
+ elif token.match(TOKENS['KEYWORD'], '__debug__'):
718
+ result.register_advancement()
719
+ self.advance()
720
+ self.skip_expression(result)
721
+
722
+ return result.success(PysDebugNode(token.position))
723
+
717
724
  elif token.type == TOKENS['IDENTIFIER']:
718
725
  result.register_advancement()
719
726
  self.advance()
@@ -922,43 +929,6 @@ class PysParser(Pys):
922
929
 
923
930
  return result.success(node(elements, position))
924
931
 
925
- def assignment_statement(self, function: Optional[Callable[[], PysParserResult]] = None) -> PysParserResult:
926
- result = PysParserResult()
927
-
928
- node = result.register(self.expression(function))
929
- if result.error:
930
- return result
931
-
932
- if self.current_token.type in (
933
- TOKENS['EQUAL'],
934
- TOKENS['EQUAL_PLUS'],
935
- TOKENS['EQUAL_MINUS'],
936
- TOKENS['EQUAL_STAR'],
937
- TOKENS['EQUAL_SLASH'],
938
- TOKENS['EQUAL_DOUBLE_SLASH'],
939
- TOKENS['EQUAL_PERCENT'],
940
- TOKENS['EQUAL_AT'],
941
- TOKENS['EQUAL_DOUBLE_STAR'],
942
- TOKENS['EQUAL_AMPERSAND'],
943
- TOKENS['EQUAL_PIPE'],
944
- TOKENS['EQUAL_CIRCUMFLEX'],
945
- TOKENS['EQUAL_DOUBLE_LESS_THAN'],
946
- TOKENS['EQUAL_DOUBLE_GREATER_THAN']
947
- ):
948
- operand = self.current_token
949
-
950
- result.register_advancement()
951
- self.advance()
952
- self.skip_expression(result)
953
-
954
- value = result.register(self.assignment_statement(function), True)
955
- if result.error:
956
- return result
957
-
958
- node = PysAssignmentNode(node, operand, value)
959
-
960
- return result.success(node)
961
-
962
932
  def from_statement(self) -> PysParserResult:
963
933
  result = PysParserResult()
964
934
  position = self.current_token.position
@@ -2248,7 +2218,7 @@ class PysParser(Pys):
2248
2218
  )
2249
2219
  )
2250
2220
 
2251
- def decorator(self) -> PysParserResult:
2221
+ def decorator_statement(self) -> PysParserResult:
2252
2222
  result = PysParserResult()
2253
2223
 
2254
2224
  if self.current_token.type != TOKENS['AT']:
@@ -2282,6 +2252,43 @@ class PysParser(Pys):
2282
2252
 
2283
2253
  return result.failure(self.new_error("expected function or class declaration after decorator"))
2284
2254
 
2255
+ def assignment_statement(self, function: Optional[Callable[[], PysParserResult]] = None) -> PysParserResult:
2256
+ result = PysParserResult()
2257
+
2258
+ node = result.register(self.expression(function))
2259
+ if result.error:
2260
+ return result
2261
+
2262
+ if self.current_token.type in (
2263
+ TOKENS['EQUAL'],
2264
+ TOKENS['EQUAL_PLUS'],
2265
+ TOKENS['EQUAL_MINUS'],
2266
+ TOKENS['EQUAL_STAR'],
2267
+ TOKENS['EQUAL_SLASH'],
2268
+ TOKENS['EQUAL_DOUBLE_SLASH'],
2269
+ TOKENS['EQUAL_PERCENT'],
2270
+ TOKENS['EQUAL_AT'],
2271
+ TOKENS['EQUAL_DOUBLE_STAR'],
2272
+ TOKENS['EQUAL_AMPERSAND'],
2273
+ TOKENS['EQUAL_PIPE'],
2274
+ TOKENS['EQUAL_CIRCUMFLEX'],
2275
+ TOKENS['EQUAL_DOUBLE_LESS_THAN'],
2276
+ TOKENS['EQUAL_DOUBLE_GREATER_THAN']
2277
+ ):
2278
+ operand = self.current_token
2279
+
2280
+ result.register_advancement()
2281
+ self.advance()
2282
+ self.skip_expression(result)
2283
+
2284
+ value = result.register(self.assignment_statement(function), True)
2285
+ if result.error:
2286
+ return result
2287
+
2288
+ node = PysAssignmentNode(node, operand, value)
2289
+
2290
+ return result.success(node)
2291
+
2285
2292
  def block_statements(self) -> PysParserResult:
2286
2293
  result = PysParserResult()
2287
2294
 
@@ -5,9 +5,9 @@ from .mapping import GET_ACOLORS
5
5
  from .utils.decorators import typechecked, immutable
6
6
  from .utils.generic import setimuattr
7
7
 
8
- from os import environ
8
+ import os
9
9
 
10
- MAXIMUM_TRACEBACK_LINE = environ.get(ENV_PYSCRIPT_MAXIMUM_TRACEBACK_LINE)
10
+ MAXIMUM_TRACEBACK_LINE = os.environ.get(ENV_PYSCRIPT_MAXIMUM_TRACEBACK_LINE)
11
11
  if MAXIMUM_TRACEBACK_LINE is None:
12
12
  MAXIMUM_TRACEBACK_LINE = 5
13
13
  else: