Phrase reversals: Difference between revisions

→‎{{header|AppleScript}}: Updated primitives
(Added Common Lisp)
(→‎{{header|AppleScript}}: Updated primitives)
Line 193:
unlines({¬
_reverse(phrase), ¬
unwords(map(_reverse, _words(phrase), _reverse)), ¬
unwords(_reverse(_words(phrase))) ¬})
})
end run
 
-- Text -> Text
on _reverse(xs)
if class of xs is text then
return (reverse of characters of xs) as text
else
return reverse of xs
end if
end _reverse
 
-- Text -> Text
on _words(str)
return words of str
end _words
 
-- GENERIC FUNCTIONS
-- [a] -> (a -> b) -> [b]
 
on map(xs, f)
-- [a]map ->:: (a -> b) -> [a] -> [b]
on map(xsf, fxs)
set mf to mReturn(f)
set lst to {}
set lng to length of xs
set lst to {}
repeat with i from 1 to lng
set end of lst to mf's calllambda(item i of xs, i, xs)
end repeat
return lst
end map
 
-- intercalate :: Text -> [Text] -> Text
-- lift 2nd class function into 1st class wrapper
on intercalate(strText, lstText)
-- handler function --> first class script object
set {dlm, my text item delimiters} to {my text item delimiters, strText}
on mReturn(f)
set strJoined to lstText as text
script mf
set my text item propertydelimiters callto : fdlm
endreturn scriptstrJoined
end mReturnintercalate
 
-- _reverse :: [a] -> [a]
on _reverse(xs)
if class of xs is text then
return (reverse of characters of xs) as text
else
return reverse of xs
end if
end _reverse
 
-- _words :: String -> [String]
on _words(str)
return words of str
end _words
 
-- unlines :: [TextString] -> TextString
on unlines(lstLines)
intercalate(linefeed, lstLines)
end unlines
 
-- unwords :: :: [TextString] -> TextString
on unwords(lstWords)
intercalate(space, lstWords)
end unwords
 
-- liftLift 2nd class handler function into 1st class script wrapper
-- Text -> Text -> [Text]
-- mReturn :: Handler -> Script
on splitOn(strDelim, strMain)
on mReturn(f)
set {dlm, my text item delimiters} to {my text item delimiters, strDelim}
setif lstPartsclass toof textf itemsis ofscript strMainthen
set my text item delimiters to dlmf
return lstPartselse
})script
end splitOn
property lambda : f
end script
end if
end mReturn
</lang>
 
-- 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</lang>
{{out}}
<pre>"lasrever esarhp edoc attesor
9,659

edits