1
0
mirror of https://github.com/alecthomas/chroma.git synced 2025-03-31 22:05:17 +02:00

add Janet lexer (#1045)

This commit is contained in:
Bob Tolbert 2025-01-30 12:34:09 -08:00 committed by GitHub
parent 81fecd5f2f
commit 4b0882a15f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 483 additions and 0 deletions

48
lexers/embedded/janet.xml Normal file

File diff suppressed because one or more lines are too long

43
lexers/testdata/janet.actual vendored Normal file
View File

@ -0,0 +1,43 @@
# A game of life implementation
(def- window
(seq [x :range [-1 2]
y :range [-1 2]
:when (not (and (zero? x) (zero? y)))]
[x y]))
(defn- neighbors
[[x y]]
(map (fn [[x1 y1]] [(+ x x1) (+ y y1)]) window))
(defn tick
"Get the next state in the Game Of Life."
[state]
(def cell-set (frequencies state))
(def neighbor-set (frequencies (mapcat neighbors state)))
(seq [coord :keys neighbor-set
:let [count (get neighbor-set coord)]
:when (or (= count 3) (and (get cell-set coord) (= count 2)))]
coord))
(defn draw
"Draw cells in the game of life from (x1, y1) to (x2, y2)"
[state x1 y1 x2 y2]
(def cellset @{})
(each cell state (put cellset cell true))
(loop [x :range [x1 (+ 1 x2)]
:after (print)
y :range [y1 (+ 1 y2)]]
(file/write stdout (if (get cellset [x y]) "X " ". ")))
(print))
#
# Run the example
#
(var *state* '[(0 0) (-1 0) (1 0) (1 1) (0 2)])
(for i 0 20
(print "generation " i)
(draw *state* -7 -7 7 7)
(set *state* (tick *state*)))

392
lexers/testdata/janet.expected vendored Normal file
View File

@ -0,0 +1,392 @@
[
{"type":"CommentSingle","value":"# A game of life implementation"},
{"type":"TextWhitespace","value":"\n\n"},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"def-"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"window"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"seq"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"x"},
{"type":"TextWhitespace","value":" "},
{"type":"NameConstant","value":":range"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"LiteralNumberFloat","value":"-1"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"2"},
{"type":"Punctuation","value":"]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"NameVariable","value":"y"},
{"type":"TextWhitespace","value":" "},
{"type":"NameConstant","value":":range"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"LiteralNumberFloat","value":"-1"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"2"},
{"type":"Punctuation","value":"]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"NameConstant","value":":when"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"not"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"and"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"zero?"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"x"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"zero?"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y"},
{"type":"Punctuation","value":")))]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"x"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y"},
{"type":"Punctuation","value":"]))"},
{"type":"TextWhitespace","value":"\n\n"},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"defn-"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"neighbors"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"[["},
{"type":"NameVariable","value":"x"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y"},
{"type":"Punctuation","value":"]]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"map"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"KeywordReserved","value":"fn"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"[["},
{"type":"NameVariable","value":"x1"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y1"},
{"type":"Punctuation","value":"]]"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"[("},
{"type":"NameFunction","value":"+"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"x"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"x1"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"+"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y1"},
{"type":"Punctuation","value":")])"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"window"},
{"type":"Punctuation","value":"))"},
{"type":"TextWhitespace","value":"\n\n"},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"defn"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"tick"},
{"type":"TextWhitespace","value":"\n "},
{"type":"LiteralString","value":"\"Get the next state in the Game Of Life.\""},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"state"},
{"type":"Punctuation","value":"]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"KeywordReserved","value":"def"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"cell-set"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"frequencies"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"state"},
{"type":"Punctuation","value":"))"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"KeywordReserved","value":"def"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"neighbor-set"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"frequencies"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"mapcat"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"neighbors"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"state"},
{"type":"Punctuation","value":")))"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"seq"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"coord"},
{"type":"TextWhitespace","value":" "},
{"type":"NameConstant","value":":keys"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"neighbor-set"},
{"type":"TextWhitespace","value":"\n "},
{"type":"NameConstant","value":":let"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"count"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"get"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"neighbor-set"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"coord"},
{"type":"Punctuation","value":")]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"NameConstant","value":":when"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"or"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"="},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"count"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"3"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"and"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"get"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"cell-set"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"coord"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"="},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"count"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"2"},
{"type":"Punctuation","value":")))]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"NameVariable","value":"coord"},
{"type":"Punctuation","value":"))"},
{"type":"TextWhitespace","value":"\n\n"},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"defn"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"draw"},
{"type":"TextWhitespace","value":"\n "},
{"type":"LiteralString","value":"\"Draw cells in the game of life from (x1, y1) to (x2, y2)\""},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"state"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"x1"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y1"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"x2"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y2"},
{"type":"Punctuation","value":"]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"KeywordReserved","value":"def"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"cellset"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"@{})"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"each"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"cell"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"state"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"put"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"cellset"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"cell"},
{"type":"TextWhitespace","value":" "},
{"type":"NameBuiltinPseudo","value":"true"},
{"type":"Punctuation","value":"))"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"loop"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"x"},
{"type":"TextWhitespace","value":" "},
{"type":"NameConstant","value":":range"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"x1"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"+"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"1"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"x2"},
{"type":"Punctuation","value":")]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"NameConstant","value":":after"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"print"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":"\n "},
{"type":"NameVariable","value":"y"},
{"type":"TextWhitespace","value":" "},
{"type":"NameConstant","value":":range"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"y1"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"+"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"1"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y2"},
{"type":"Punctuation","value":")]]"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"file/write"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariableGlobal","value":"stdout"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"KeywordReserved","value":"if"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"get"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"cellset"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"["},
{"type":"NameVariable","value":"x"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"y"},
{"type":"Punctuation","value":"])"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralString","value":"\"X \""},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralString","value":"\". \""},
{"type":"Punctuation","value":")))"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"print"},
{"type":"Punctuation","value":"))"},
{"type":"TextWhitespace","value":"\n\n"},
{"type":"CommentSingle","value":"#"},
{"type":"TextWhitespace","value":"\n"},
{"type":"CommentSingle","value":"# Run the example"},
{"type":"TextWhitespace","value":"\n"},
{"type":"CommentSingle","value":"#"},
{"type":"TextWhitespace","value":"\n\n"},
{"type":"Punctuation","value":"("},
{"type":"KeywordReserved","value":"var"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"*state*"},
{"type":"TextWhitespace","value":" "},
{"type":"Operator","value":"'"},
{"type":"Punctuation","value":"[("},
{"type":"LiteralNumberFloat","value":"0"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"0"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"LiteralNumberFloat","value":"-1"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"0"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"LiteralNumberFloat","value":"1"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"0"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"LiteralNumberFloat","value":"1"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"1"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"LiteralNumberFloat","value":"0"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"2"},
{"type":"Punctuation","value":")])"},
{"type":"TextWhitespace","value":"\n\n"},
{"type":"Punctuation","value":"("},
{"type":"NameBuiltin","value":"for"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"i"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"0"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"20"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameFunction","value":"print"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralString","value":"\"generation \""},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"i"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"NameVariable","value":"draw"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"*state*"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"-7"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"-7"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"7"},
{"type":"TextWhitespace","value":" "},
{"type":"LiteralNumberFloat","value":"7"},
{"type":"Punctuation","value":")"},
{"type":"TextWhitespace","value":"\n "},
{"type":"Punctuation","value":"("},
{"type":"KeywordReserved","value":"set"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"*state*"},
{"type":"TextWhitespace","value":" "},
{"type":"Punctuation","value":"("},
{"type":"NameVariable","value":"tick"},
{"type":"TextWhitespace","value":" "},
{"type":"NameVariable","value":"*state*"},
{"type":"Punctuation","value":")))"},
{"type":"TextWhitespace","value":"\n"}
]