Brace expansion: Difference between revisions

m (Delete redundant AND)
Line 1,872:
{a,b{1e}f
{a,b{2e}f</pre>
 
=={{header|Phix}}==
Fairly straightforward recursive solution
<lang Phix>--
-- demo\rosetta\Brace_expansion.exw
-- ================================
--
function pair(sequence stems, sequence brest)
sequence res = {}
for i=1 to length(stems) do
for j=1 to length(brest) do
res = append(res,stems[i]&brest[j])
end for
end for
return res
end function
 
function brarse(string s)
integer idx = 1
while idx<=length(s) do
integer ch = s[idx]
if ch='{' then
sequence alts = {idx}
idx += 1
integer l0 = idx
bool nest = false
integer level = 1
while idx<=length(s) do
switch s[idx] do
case '{': level += 1
nest = true
case '}': level -= 1
if level=0 then exit end if
case ',': if level=1 then
alts = append(alts,idx)
end if
case '\\': idx += 1
end switch
idx += 1
end while
if length(alts)>1 and level=0 then
alts &= idx
sequence stems = {}
string stem = s[1..alts[1]-1]
for i=2 to length(alts) do
string rest = s[alts[i-1]+1..alts[i]-1]
if nest then
sequence inners = brarse(rest)
for j=1 to length(inners) do
stems = append(stems,stem&inners[j])
end for
else
stems = append(stems,stem&rest)
end if
end for
return pair(stems,brarse(s[idx+1..$]))
elsif nest then
return pair({s[1..l0-1]},brarse(s[l0..$]))
end if
end if
idx += 1
end while
return {s}
end function
 
-- (since ? and pp() add their own backslash escapes:)
procedure edump(sequence x)
for i=1 to length(x) do
printf(1,"%s\n",{x[i]})
end for
end procedure
 
edump(brarse("~/{Downloads,Pictures}/*.{jpg,gif,png}"))
edump(brarse("It{{em,alic}iz,erat}e{d,}, please."))
edump(brarse(`{,{,gotta have{ ,\, again\, }}more }cowbell!`))
edump(brarse(`{}} some }{,{\\{ edge, edge} \,}{ cases, {here} \\\\\}`))</lang>
{{Out}}
<pre>
~/Downloads/*.jpg
~/Downloads/*.gif
~/Downloads/*.png
~/Pictures/*.jpg
~/Pictures/*.gif
~/Pictures/*.png
Itemized, please.
Itemize, please.
Italicized, please.
Italicize, please.
Iterated, please.
Iterate, please.
cowbell!
more cowbell!
gotta have more cowbell!
gotta have\, again\, more cowbell!
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
</pre>
 
=={{header|PicoLisp}}==
7,820

edits