A templating language that looks like Lisp and compiles to HTML
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

env.js 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. const AST = require('./ast')
  2. const OsloError = require('./osloError')
  3. module.exports = class Env {
  4. constructor(parent = null) {
  5. this.data = {}
  6. if (parent) {
  7. Object.keys(parent.data).forEach(key => {
  8. this.data[key] = parent.data[key]
  9. })
  10. } else {
  11. this.data = {
  12. '+': (a, b) => new AST.Number({ value: a.value + b.value }),
  13. '-': (a, b) => new AST.Number({ value: a.value - b.value }),
  14. '*': (a, b) => new AST.Number({ value: a.value * b.value }),
  15. '/': (a, b) => new AST.Number({ value: a.value / b.value }),
  16. '=': (a, b) => new AST.Boolean({ value: a.value === b.value }),
  17. '>': (a, b) => new AST.Boolean({ value: a.value > b.value }),
  18. '<': (a, b) => new AST.Boolean({ value: a.value < b.value }),
  19. '>=': (a, b) => new AST.Boolean({ value: a.value >= b.value }),
  20. '<=': (a, b) => new AST.Boolean({ value: a.value <= b.value }),
  21. 'list': function () {
  22. return new AST.List({
  23. elements: Object.keys(arguments).map(arg => arguments[arg])
  24. })
  25. }
  26. }
  27. }
  28. }
  29. get(symbol) {
  30. if (this.data[symbol.name]) {
  31. return this.data[symbol.name]
  32. }
  33. return new OsloError({
  34. line: symbol.line,
  35. message: `Symbol '${symbol.name}' is not bound`,
  36. })
  37. }
  38. set(symbol, value) {
  39. this.data[symbol.name] = value
  40. }
  41. }