@ianlangs/mathscript 1.1.2 → 1.2.0

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@ianlangs/mathscript",
4
- "version": "1.1.2",
4
+ "version": "1.2.0",
5
5
  "description": "superset de js",
6
6
  "main": "src/main.js",
7
7
  "scripts": {
package/src/node.js CHANGED
@@ -1,6 +1,15 @@
1
- #!/bin/env node
2
- import T from './transpile.js'
3
- import fs from 'fs'
4
- const __code__ = fs.readFileSync(process.argv[2], 'utf-8')
1
+ #!/usr/bin/env node
2
+ import fs from "fs"
3
+ import T from "./transpile.js"
5
4
 
6
- eval(T.transpile(__code__, ...(T.Consts)))
5
+ const file = process.argv[2]
6
+ if (!file) {
7
+ console.error("Usage: ms-node <file.ms>")
8
+ process.exit(1)
9
+ }
10
+
11
+
12
+ const source = fs.readFileSync(file, "utf-8")
13
+ const js = T.transpile(source, ...(T.Consts))
14
+ const run = new Function(js)
15
+ run()
package/src/transpile.js CHANGED
@@ -1,16 +1,83 @@
1
1
  const Consts = [
2
- [/::\s*[^\s\(\)]*/g, ""],
3
- [/mut\s+([a-zA-Z_]\w*)\s*=\s*(.+)/g, "let $1= (()=>{let v=$2; return {get:()=>v,set:n=>v=n}})()"],
4
- [/immut\s+([a-zA-Z_]\w*)/g, "delete $1.set"],
5
- ["using", "require"],
6
- [/fn/g, "function"],
2
+ [/::\s*[^\s\(\)]*/g, ""],
3
+ [/mut\s+([a-zA-Z_]\w*)\s*=\s*(.+)/g, "let $1 = (()=>{let v=$2; return {get:()=>v,set:n=>v=n}})()"],
4
+ [/immut\s+([a-zA-Z_]\w*)/g, "delete $1.set"],
5
+ [/using\(/g, "require("],
6
+ [/fn/g, "function"],
7
7
  ]
8
8
 
9
- function transpile(code, ...consts) {
10
- for (let [i, j] of consts) {
11
- code = code.replace(i, j)
9
+ function analyzeMS(code) {
10
+ const lines = code.split("\n")
11
+ const scopes = [new Map()] // nombre -> { mut: boolean, kind }
12
+
13
+ function findVar(name) {
14
+ for (let s of scopes) {
15
+ if (s.has(name)) return s.get(name)
16
+ }
17
+ return null
18
+ }
19
+
20
+ lines.forEach((line, i) => {
21
+ const ln = i + 1
22
+ const trimmed = line.trim()
23
+
24
+ if (trimmed.includes("{")) scopes.unshift(new Map())
25
+ if (trimmed.includes("}")) scopes.shift()
26
+
27
+ // mut x = ...
28
+ const mutMatch = line.match(/^\s*mut\s+([a-zA-Z_]\w*)/)
29
+ if (mutMatch) {
30
+ const name = mutMatch[1]
31
+ scopes[0].set(name, { mut: true, kind: "mut" })
32
+ return
33
+ }
34
+
35
+ // let x = ...
36
+ const letMatch = line.match(/^\s*let\s+([a-zA-Z_]\w*)/)
37
+ if (letMatch) {
38
+ const name = letMatch[1]
39
+ scopes[0].set(name, { mut: false, kind: "let" })
40
+ return
41
+ }
42
+
43
+ // const x = ...
44
+ const constMatch = line.match(/^\s*const\s+([a-zA-Z_]\w*)/)
45
+ if (constMatch) {
46
+ const name = constMatch[1]
47
+ scopes[0].set(name, { mut: false, kind: "const" })
48
+ return
12
49
  }
13
- return code
50
+
51
+ // immut x
52
+ const im = line.match(/^\s*immut\s+([a-zA-Z_]\w*)/)
53
+ if (im) {
54
+ const name = im[1]
55
+ const v = findVar(name)
56
+
57
+ if (!v) {
58
+ throw new Error(`MS Compile Error (line ${ln}): '${name}' is not declared`)
59
+ }
60
+
61
+ if (!v.mut) {
62
+ throw new Error(
63
+ `MS Compile Error (line ${ln}): '${name}' is not mutable (declared as ${v.kind})`
64
+ )
65
+ }
66
+
67
+ v.mut = false
68
+ return
69
+ }
70
+ })
71
+ }
72
+
73
+
74
+ function transpile(code, ...consts) {
75
+ analyzeMS(code)
76
+
77
+ for (let [i, j] of consts) {
78
+ code = code.replace(i, j)
79
+ }
80
+ return code
14
81
  }
15
82
 
16
- export default {transpile, Consts}
83
+ export default { transpile, Consts }
package/tests/using.js CHANGED
@@ -1,4 +1,3 @@
1
- //const fs = require('fs') inea borrada para poder subir all modulo
2
- import fs from 'fs' //linea parra que siga andando
1
+ const fs = require('fs')
3
2
  const files = fs.readdirSync('.')
4
3
  console.log(files.length) // número de archivos en la carpeta
package/tests/vars.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // Mutable
2
- let x= (()=>{let v=5; return {get:()=>v,set:n=>v=n}})()
2
+ let x = (()=>{let v=5; return {get:()=>v,set:n=>v=n}})()
3
3
  console.log(x.get()) // 5
4
4
  x.set(10)
5
5
  console.log(x.get()) // 10
@@ -15,7 +15,7 @@ try {
15
15
  // Variable
16
16
  let y = "hola"
17
17
  console.log(y) // "hola"
18
- delete y.set // no cambia nada
18
+ // delete y.set // error no es mutable
19
19
 
20
20
 
21
21
  // Const
package/tests/vars.ms CHANGED
@@ -15,7 +15,7 @@ try {
15
15
  // Variable
16
16
  let y = "hola"
17
17
  console.log(y) // "hola"
18
- immut y // no cambia nada
18
+ // immut y // error no es mutable
19
19
 
20
20
 
21
21
  // Const