--------------------- IDENTITY MATRIX ---------------------- -- identityMatrix :: Int -> [(0|1)] on identityMatrix(n) set xs to enumFromTo(1, n) script row on |λ|(x) script col on |λ|(i) if i = x then 1 else 0 end if end |λ| end script map(col, xs) end |λ| end script map(row, xs) end identityMatrix --------------------------- TEST --------------------------- on run unlines(map(showList, ¬ identityMatrix(5))) end run -------------------- GENERIC FUNCTIONS --------------------- -- enumFromTo :: Int -> Int -> [Int] on enumFromTo(m, n) if m ≤ n then set lst to {} repeat with i from m to n set end of lst to i end repeat lst else {} end if end enumFromTo -- intercalate :: String -> [String] -> String on intercalate(delim, xs) set {dlm, my text item delimiters} to ¬ {my text item delimiters, delim} set s to xs as text set my text item delimiters to dlm s end intercalate -- map :: (a -> b) -> [a] -> [b] on map(f, xs) tell mReturn(f) set lng to length of xs set lst to {} repeat with i from 1 to lng set end of lst to |λ|(item i of xs, i, xs) end repeat return lst end tell end map -- Lift 2nd class handler function into 1st class script wrapper -- mReturn :: Handler -> Script on mReturn(f) if class of f is script then f else script property |λ| : f end script end if end mReturn -- showList :: [a] -> String on showList(xs) "[" & intercalate(", ", map(my str, xs)) & "]" end showList -- str :: a -> String on str(x) x as string end str -- unlines :: [String] -> String on unlines(xs) -- A single string formed by the intercalation -- of a list of strings with the newline character. set {dlm, my text item delimiters} to ¬ {my text item delimiters, linefeed} set s to xs as text set my text item delimiters to dlm s end unlines