Jump to content

Brace expansion: Difference between revisions

m (added a related task.)
Line 2,632:
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
</pre>
 
=={{header|Nim}}==
{{trans|Seed7}}
<lang Nim>proc expandBraces(str: string) =
 
var
escaped = false
depth = 0
bracePoints: seq[int]
bracesToParse: seq[int]
 
for idx, ch in str:
case ch
of '\\':
escaped = not escaped
of '{':
inc depth
if not escaped and depth == 1:
bracePoints = @[idx]
of ',':
if not escaped and depth == 1:
bracePoints &= idx
of '}':
if not escaped and depth == 1 and bracePoints.len >= 2:
bracesToParse = bracePoints & idx
dec depth
else:
discard
if ch != '\\':
escaped = false
 
if bracesToParse.len > 0:
let prefix = str[0..<bracesToParse[0]]
let suffix = str[(bracesToParse[^1] + 1)..^1]
for idx in 1..bracesToParse.high:
let option = str[(bracesToParse[idx - 1] + 1)..(bracesToParse[idx] - 1)]
expandBraces(prefix & option & suffix)
 
else:
echo " ", str
 
#———————————————————————————————————————————————————————————————————————————————————————————————————
 
when isMainModule:
 
for str in ["It{{em,alic}iz,erat}e{d,}, please.",
"~/{Downloads,Pictures}/*.{jpg,gif,png}",
"{,{,gotta have{ ,\\, again\\, }}more }cowbell!",
"{}} some }{,{\\\\{ edge, edge} \\,}{ cases, {here} \\\\\\\\\\}"]:
echo "\nExpansions of \"", str, "\":"
expandBraces(str)</lang>
 
{{out}}
<pre>
Expansions of "It{{em,alic}iz,erat}e{d,}, please.":
Itemized, please.
Italicized, please.
Iterated, please.
Itemize, please.
Italicize, please.
Iterate, please.
 
Expansions of "~/{Downloads,Pictures}/*.{jpg,gif,png}":
~/Downloads/*.jpg
~/Pictures/*.jpg
~/Downloads/*.gif
~/Pictures/*.gif
~/Downloads/*.png
~/Pictures/*.png
 
Expansions of "{,{,gotta have{ ,\, again\, }}more }cowbell!":
cowbell!
more cowbell!
gotta have more cowbell!
gotta have\, again\, more cowbell!
 
Expansions of "{}} some }{,{\\{ edge, edge} \,}{ cases, {here} \\\\\}":
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}</pre>
 
=={{header|Perl}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.