Ruby has a special syntac in String literal which name is String Interpolation that you can write the result of a expression in a string easily.
"hello, #{name}!"
The notation is equivalent to the following notation.
"hello, " + name + "!"
That's not only available in Ruby but also in CoffeeScript.
I wrote this for Haskell in Haskell.
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
import qualified Data.Text.IO as T
import qualified Data.Attoparsec.Text as P
import Control.Applicative
main = T.putStrLn $ stringInterpolate "as{df \"jkl#{x}jkw\"jl}kf"
(<<) = T.append
stringInterpolate :: T.Text -> T.Text
stringInterpolate x = case P.parseOnly stringInterpolate' x of
Left x -> T.pack x
Right x -> x
stringInterpolate' :: P.Parser T.Text
stringInterpolate' = P.try $
T.concat <$> P.many (block <|> string <|> T.singleton `fmap` P.notChar '}')
block :: P.Parser T.Text
block = P.try $ do
x <- (P.char '{') *> stringInterpolate' <* (P.char '}')
return $ "{" << x << "}"
-- "jklsfj#{...}sdjfkl"
string :: P.Parser T.Text
string = P.try $ do
x <- (P.char '"') *> stringContent <* (P.char '"')
return $ "(\"" << x << "\")"
-- jklsfj#{...}sdjfkl
stringContent :: P.Parser T.Text
stringContent = P.try $
T.concat <$> P.many (interpolate <|> T.singleton `fmap` P.notChar '"')
-- #{...}
interpolate :: P.Parser T.Text
interpolate = P.try $ do
x <- P.string "#{" *> stringInterpolate' <* P.char '}'
return $ "\" ++ " << x << " ++ \""
String concatination in Haskell is ++
. The program above converts string literals like the below.
"hello, #{name}!"
("hello, " ++ name ++ "!")
You can write arbitrary expression in the placeholder.
"hello, #{[ toUpper c | c <- ['a'..'z'] ]}!"
("hello, " ++ [ toUpper c | c <- ['a'..'z'] ] ++ "!")
No comments:
Post a Comment