Paste: poor deduplication of EBNF

Author: Andy
Mode: factor
Date: Sat, 19 Apr 2025 19:30:37
Plain Text |
EBNF: parse-h-connection [=[
  letter = [a-zA-Z]
  dash = "-"
  num = [0-9]+ => [[ string>number ]]
  connection = letter (dash+)~ num (dash+)~ letter => [[ first3 swap [ 2array >hash-set ] dip <connection> ]]
]=]

EBNF: parse-h-connections [=[
  noise = (!(<foreign parse-h-connection>) .)*
  item = <foreign parse-h-connection>
  line = (noise~ item)* noise~
]=]

EBNF: parse-v-connection [=[
  letter = [a-zA-Z]
  pipe = "|"
  num = [0-9]+ => [[ string>number ]]
  connection = letter (pipe+)~ num (pipe+)~ letter => [[ first3 swap [ 2array >hash-set ] dip <connection> ]]
]=]

EBNF: parse-v-connections [=[
  noise = (!(<foreign parse-v-connection>) .)*
  item = <foreign parse-v-connection>
  line = (noise~ item)* noise~
]=]

! I tried to deduplicate the above, but it's just as long below:

[==[
  USING: hash-sets multiline kernel arrays sequences math.parser peg.ebnf ;
  IN: easters.good-friday

  EBNF: ${name} [=[
    letter = [a-zA-Z]
    tether = "${tether}"
    num = [0-9]+ => [[ string>number ]]
    connection = letter (tether+)~ num (tether+)~ letter => [[ first3 swap [ 2array >hash-set ] dip <connection> ]]
  ]=]

  EBNF: ${name}s [=[
    noise = (!(<foreign ${name}>) .)*
    item = <foreign ${name}>
    line = (noise~ item)* noise~
  ]=]

]==]

[ { { "name" "parse-h-connection" } { "tether" "-" } } [ interpolate>string ] with-variables ]
[ { { "name" "parse-v-connection" } { "tether" "|" } } [ interpolate>string ] with-variables ] bi

[ eval( -- ) ] bi@

New Annotation

Summary:
Author:
Mode:
Body: