On Sat, Jan 09, 2010 at 08:28:15PM +0100, Henrik Sarvell wrote:
> snag I had to solve. I couldn't find a global function so I made my own:
> (dm urlDecode> (Str)
>    (pack
>       (make
>          (in (list 'echo Str)
>             (while (char)
>                (let Char @
>                   (ifn (= Char "%")
>                      (unless (= "^J" Char) (link Char))
>                      (link (char (hex (pack (char) (char))))))))))))

Well, if I see this right, then there is indeed a function, 'ht:Pack':

   (dm urlDecode> (Str)
      (ht:Pack (chop Str)) )

I would be rather reluctant to start such a heavy machinery like a pipe
to the external 'echo' program above, just to parse a string. You could
instead do

   (dm urlDecode> (Str)
      (setq Str (chop Str))
            (while (pop 'Str)
               (let Char @
                     (if (= Char "%")
                        (char (hex (pack (cut 2 'Str))))
                        Char ) ) ) ) ) ) )

> (in (list 'echo Str)) is a trick I got from Armadillo (originally as a way
> to use (xml) with strings), however it seems like it's attaching a newline
> before end of input so maybe not the best solution here (when using (xml)
> it's a non issue).

The newline could be suppressed with the '-n' option to echo.

> Are there any suggestions on how the above could have been done in a better
> way? Apart from that final newline I like the idea of being able to stream a
> string internally to be able to utilize the input channel functions, in this
> case (char).

Yeah, this is really a deficit in PicoLisp, not being able to use the
standard 'in' function directly on symbols (strings) :-(

- Alex
UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe

Reply via email to