question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Wren Language

Wren is a small, fast, class-based concurrent scripting language

Think Smalltalk in a Lua-sized package with a dash of Erlang and wrapped up in a familiar, modern syntax.

System.print("Hello, world!")

class Wren {
  flyTo(city) {
    System.print("Flying to %(city)")
  }
}

var adjectives = Fiber.new {
  ["small", "clean", "fast"].each {|word| Fiber.yield(word) }
}

while (!adjectives.isDone) System.print(adjectives.call())

Additional resources

Possible Implementation

Butchered some available languages and came with something. But stills needs some testing 👍

// Prism.languages.wren
export default (function (Prism) {
  var multilineComment = /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source;
  for (var i = 0; i < 2; i++) {
    // support 4 levels of nested comments
    multilineComment = multilineComment.replace(/<self>/g, function () { return multilineComment; });
  }
  multilineComment = multilineComment.replace(/<self>/g, function () { return /[^\s\S]/.source; });

  Prism.languages.wren = {
    'hashbang': {
      pattern: /^#!.*/,
      greedy: true,
      alias: 'comment'
    },
    'comment': [
      {
        pattern: RegExp(/(^|[^\\])/.source + multilineComment),
        lookbehind: true,
        greedy: true
      },
      {
        pattern: /(^|[^\\:])\/\/.*/,
        lookbehind: true,
        greedy: true
      }
    ],
    'triple-quoted-string': {
      pattern: /(?:[])?(""")[\s\S]*?\1/i,
      greedy: true,
      alias: 'string'
    },
    'string': {
      pattern: /(?:[])?(")[\s\S]*?\1/i,
      greedy: true
    },
    'class-name': {
      pattern: /(\b(?:class|is|Num|System|Object|Sequence|List|Map|Bool|String|Range|Fn|Fiber)\s+|\bcatch\s+\()[\w.\\]+/i,
      lookbehind: true,
      inside: {
        'punctuation': /[.\\]/
      }
    },
    'keyword': /\b(?:if|else|while|for|return|in|is|as|null|break|continue|foreign|construct|static|var|class|this|super|#!|#)\b/,
    'boolean': /\b(?:true|false)\b/,
    'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
    'null': {
      pattern: /\bnull\b/,
      alias: 'keyword'
    },
    'function': /(?!\d)\w+(?=\s*(?:[({]))/,
    'operator': [
        /[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,
        {
          // Match ".." but don't break "..."
          pattern: /(^|[^.])\.\.(?!\.)/,
          lookbehind: true
        }
      ],
    'punctuation': /[\[\](){},;]|\.+|:+/
  };
});

Issue Analytics

  • State:closed
  • Created 2 years ago
  • Reactions:3
  • Comments:11 (3 by maintainers)

github_iconTop GitHub Comments

2reactions
RunDevelopmentcommented, Apr 24, 2021

@clsource Would you like to do a PR?

@joshgoebel I think it’s ok. It’s a little off-topic but you also contribute by responding to comments and sharing your experience, so I don’t mind.

0reactions
clsourcecommented, Apr 26, 2021

Ok implemented your suggestions and added hashbangs 👍

// https://wren.io/
// Prism.languages.wren
export default (function (Prism) {

  // Multiline based on prism-rust.js
  var multilineComment = /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source;
  for (var i = 0; i < 2; i++) {
      // Supports up to 4 levels of nested comments
      multilineComment = multilineComment.replace(/<self>/g, function () { return multilineComment; });
  }
  multilineComment = multilineComment.replace(/<self>/g, function () { return /[^\s\S]/.source; });

  var wren = {
      // Multiline comments in Wren can have nested multiline comments
      // Comments: // and /* */
      'comment': [
          {
              pattern: RegExp(/(^|[^\\])/.source + multilineComment),
              lookbehind: true,
              greedy: true
          },
          {
              pattern: /(^|[^\\:])\/\/.*/,
              lookbehind: true,
              greedy: true
          }
      ],

      // Triple quoted strings are multiline but cannot have interpolation (raw strings)
      // Based on prism-python.js
      'triple-quoted-string': {
          pattern: /(""")[\s\S]*?\1/iu,
          greedy: true,
          alias: 'string'
      },

      // A single quote string is multiline and can have interpolation (similar to JS backticks ``)
      'string': {
          pattern: /"(?:\\[\s\S]|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))+\)|(?!%\()[^\\"])*"/u,
          greedy: true,
          inside: {}
          // Interpolation defined at the end of this function
      },

      'boolean': /\b(?:true|false)\b/,
      'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
      'null': {
          pattern: /\bnull\b/,
          alias: 'keyword'
      },

      // Highlight predefined classes and wren_cli classes as builtin
      'builtin': /\b(?:Num|System|Object|Sequence|List|Map|Bool|String|Range|Fn|Fiber|Meta|Random|File|Directory|Stat|Stdin|Stdout|Platform|Process|Scheduler|Timer)\b/,

      // Attributes are special keywords to add meta data to classes
      'attribute': [
          // #! attributes are stored in class properties
          // #!myvar = true
          // #attributes are not stored and dismissed at compilation
          {
              pattern: /#!?[ \t\u3000]*[A-Za-z_\d]+\b/u,
              alias: 'keyword'
          },
      ],
      // #!/usr/bin/env wren on the first line
      'hashbang': [
        {
          pattern: /#!\/[\S \t\u3000]+/u,
          greedy:true,
          alias:'constant'
        }
      ],
      'class-name': [
          {
              // class definition
              // class Meta {}
              pattern: /(\b(?:class)\s+)[\w.\\]+/i,
              lookbehind: true,
              inside: {
                  'punctuation': /[.\\]/
              }
          },
          {
            // A class must always start with an uppercase.
            // File.read
            pattern: /\b[A-Z][a-z\d_]*\b/,
            lookbehind:true,
            inside: {
              'punctuation': /[.\\]/
            }
          }
      ],

      // A constant can be a variable, class, property or method. Just named in all uppercase letters
      'constant': /\b[A-Z][A-Z\d_]*\b/,

      'keyword': /\b(?:if|else|while|for|return|in|is|as|null|break|continue|foreign|construct|static|var|class|this|super|#!|#|import)\b/,

      // Functions can be Class.method()
      'function': /(?!\d)\w+(?=\s*(?:[({]))/,

      // Traditional operators but adding .. and ... for Ranges e.g.: 1..2
      // Based on prism-lua.js
      'operator': [
          /[-+*%^&|]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,
          {
              // Match ".." but don't break "..."
              pattern: /(^|[^.])\.\.(?!\.)/,
              lookbehind: true
          }
      ],
      // Traditional punctuation although ; is not used in Wren
      'punctuation': /[\[\](){},;]|\.+|:+/,
      'variable': /[a-zA-Z_\d]\w*\b/,
  };

  // Based on prism-javascript.js interpolation
  // "%(interpolation)"
  var stringInside = {
    'template-punctuation': {
      pattern: /^"|"$/,
      alias: 'string'
    },
    'interpolation': {
      pattern: /((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))+\)/,
      lookbehind: true,
      inside: {
        'interpolation-punctuation': {
          pattern: /^%(|)$/,
          alias: 'punctuation'
        },
        rest: wren
      }
    },
    'string': /[\s\S]+/iu
  };

  // Only single quote strings can have interpolation
  wren['string'].inside = stringInside;

  Prism.languages.wren = wren;
});
Read more comments on GitHub >

github_iconTop Results From Across the Web

Contact Us - Wren Kitchens
Need assistance with your Wren kitchen? Contact us today by e-mail or phone. We're here to help. ... Customer Support Contact Details ...
Read more >
Contact Us - Wren Solutions
Contact Us. 124 Wren Parkway Jefferson City, Missouri 65109. (800) 881-2249. info@wrensolutions.com. How Can We Help? First name*. Last name*. Company name*.
Read more >
Wren | Systemic change starts with you
Wren helps you calculate and offset your personal carbon emissions through a monthly subscription. ... Our projects wouldn't happen without your support.
Read more >
Technical Support – WrenSports
Installation, Service, and Owner's Manuals. Manuals and Guides. Wren Suspension Fork Manual · Revised Wren TwinAir System Setup Instructions.
Read more >
Women's Rights and Empowerment Network: Home
"I support WREN because I always wanted it to exist for me, for my daughter, for all women, girls and their families in...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found