[Ur] C type for Ur/Web list type

Adam Chlipala adamc at csail.mit.edu
Thu Apr 14 09:59:55 EDT 2016


If you rewrite [uri_encode] so that it doesn't use the accumulator [acc] 
anymore, but rather does the natural concatenations with recursive 
calls, then you should see very efficient imperative code come out of 
the Ur/Web compiler, when the result of [uri_encode] is dropped directly 
into page output.

On 04/14/2016 07:35 AM, Artyom Shalkhakov wrote:
> The code is as follows:
>> fun
>> uri_encode (s:string):string = let
>>    fun
>>    tohexstr i = let
>>      val low = i % 16
>>      val high = i / 16
>>      fun hexdigit i =
>>          case i of
>>            0 => "0" | 1 => "1" | 2 => "2" | 3 => "3" | 4 => "4" | 5 => "5" | 6 => "6" | 7 => "7" | 8 => "8" | 9 => "9"
>>          | 10 => "A" | 11 => "B" | 12 => "C" | 13 => "D" | 14 => "E" | 15 => "F"
>>          | _ => error <xml>tohexstr: invalid digit {[i]}</xml>
>>    in
>>      hexdigit high ^ hexdigit low
>>    end
>>
>>    fun
>>    aux i n s acc =
>>    if i < n then let
>>        val c = strsub s i
>>      in
>>        (* NOTE: strcat seems to be QUITE inefficient here *)
>>        if isalnum c || Option.isSome (String.index ";,/?:@&=+$#" c) then
>>          aux (i+1) n s (strcat acc (str1 c))
>>        else
>>          aux (i+1) n s (strcat acc (strcat "%" (tohexstr (ord c))))
>>      end
>>    else acc
>>    val res = aux 0 (strlen s) s ""
>> in
>>    res
>> end



More information about the Ur mailing list