A templating language that looks like Lisp and compiles to HTML
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

env.js 1.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. }
  22. }
  23. }
  24. get(symbol) {
  25. if (this.data[symbol.name]) {
  26. return this.data[symbol.name]
  27. }
  28. return new OsloError({
  29. line: symbol.line,
  30. message: `Symbol '${symbol.name}' is not bound`,
  31. })
  32. }
  33. set(symbol, value) {
  34. this.data[symbol.name] = value
  35. }
  36. }