use framework "Foundation" -- positionalArgs :: [a] -> String on positionalArgs(xs) -- follow each argument with a line feed map(my putStrLn, xs) as string end positionalArgs -- namedArgs :: Record -> String on namedArgs(rec) script showKVpair on |λ|(k) my putStrLn(k & " -> " & keyValue(rec, k)) end |λ| end script -- follow each argument name and value with line feed map(showKVpair, allKeys(rec)) as string end namedArgs -- TEST on run intercalate(linefeed, ¬ {positionalArgs(["alpha", "beta", "gamma", "delta"]), ¬ namedArgs({epsilon:27, zeta:48, eta:81, theta:8, iota:1})}) --> "alpha -- beta -- gamma -- delta -- -- epsilon -> 27 -- eta -> 81 -- iota -> 1 -- zeta -> 48 -- theta -> 8 -- " end run -- GENERIC FUNCTIONS -- putStrLn :: a -> String on putStrLn(a) (a as string) & linefeed end putStrLn -- 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 -- intercalate :: 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 -- allKeys :: Record -> [String] on allKeys(rec) (current application's NSDictionary's dictionaryWithDictionary:rec)'s allKeys() as list end allKeys -- keyValue :: Record -> String -> Maybe String on keyValue(rec, strKey) set ca to current application set v to (ca's NSDictionary's dictionaryWithDictionary:rec)'s objectForKey:strKey if v is not missing value then item 1 of ((ca's NSArray's arrayWithObject:v) as list) else missing value end if end keyValue -- 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