Multiplication tables: Difference between revisions

Line 332:
 
<lang AppleScript>on run
showTable(table(1, 12))
end run
 
-- Int -> Int -> [[String]]
on table(m, n)
script mf
property rng : range(m, n)
on lambdaX(x)
set mf to my closure's mf
{x & concatMap(mf's rng, mClosure(mf's lambdaY, {x:x}))}
end lambdaX
on lambdaY(y)
set x to my closure's x
if y < x then
{""}
else
{(x * y) as text}
end if
end lambdaY
end script
seton rng to mf's rnglambdaX(x)
set mf to my closure's mf
{x & concatMap(mf's rng, mClosure(mf's lambdaY, {x:x}))}
onend lambdaX(x)
on lambdaY(y)
{{"x"} & rng} & concatMap(rng, mClosure(mf's lambdaX, {mf:mf}))
set x to my closure's x
if y < x then
{""}
else
{(x * y) as {""text}
end lambdaXif
end lambdaY
end script
set rng to mf's rng
{{"x"} & rng} & concatMap(rng, mClosure(mf's lambdaX, {mf:mf}))
end table
 
-- [[String]] -> String
on showTable(lstTable)
script mf
on showLine(lstLine)
set mf to mf of my closure
intercalate(" ", map(lstLine, mClosure(mf's showCell, {mf:mf})))
end showLine
on showCell(cell)
(characters -4 thru -1 of (" " & cell)) as string
end showCell
end script
on showCell(cell)
intercalate(linefeed, map(lstTable, mClosure(mf's showLine, {mf:mf})))
(characters -4 thru -1 of (" " & cell)) as string
end showCell
end script
intercalate(linefeed, map(lstTable, mClosure(mf's showLine, {mf:mf})))
end showTable
 
Line 383:
-- [a] -> (a -> b) -> [b]
on concatMap(xs, f)
reduce(map(xs, f), my concat, {})
end concatMap
 
-- a -> a -> [a]
on concat(a, b)
a & b
end concat
 
-- [a] -> (a -> b) -> [b]
on map(xs, f)
set mf to mReturn(f)
set lng to length of xs
set lst to {}
repeat with i from 1 to lng
set end of lst to mf's lambda(item i of xs, i, xs)
end repeat
return lst
end map
 
-- [a] -> (a -> b) -> b -> [b]
on reduce(xs, f, startValue)
set mf to mReturn(f)
set v to startValue
set lng to length of xs
repeat with i from 1 to lng
set v to mf's lambda(v, item i of xs, i, xs)
end repeat
return v
end reduce
 
-- Text -> [Text] -> Text
on intercalate(strText, lstText)
set {dlm, my text item delimiters} to {my text item delimiters, strText}
set strJoined to lstText as text
set my text item delimiters to dlm
return strJoined
end intercalate
 
-- m..n
on range(m, n)
set lng to (n - m) + 1
set base to m - 1
set lst to {}
repeat with i from 1 to lng
set end of lst to i + base
end repeat
return lst
end range
 
Line 436:
-- Handler -> Script
on mReturn(f)
if class of f is script then return f
script
property lambda : f
end script
end mReturn
 
Line 445:
-- Handler -> Record -> Script
on mClosure(f, recBindings)
script
property closure : recBindings
property lambda : f
end script
end mClosure</lang>
 
9,659

edits