[Ur] Ur/Web -> JavaScript objects

Artyom Shalkhakov artyom.shalkhakov at gmail.com
Wed Oct 16 04:17:59 EDT 2019


Hello Mark,

I think this is what you are looking for:

https://github.com/vizziv/UrLib/blob/master/UrLib/record.urs#L36
https://github.com/vizziv/UrLib/blob/master/UrLib/record.ur#L23

It would be very nice if we as a community were to come up with a
"batteries included" library for Ur/Web.

ср, 16 окт. 2019 г. в 10:55, Mark Clements <mark.clements at ki.se>:

> Adam: that is very cool -- thank you.
>
> All: as a noob question, I can update a record using:
> {A=1,B=2,C=3} --- [A=_,B=_] ++ {A=2,B=1}
> or
> {A=1,B=2,C=3} -- #A -- #B ++ {A=2,B=1}
> ==
> {A=2, B=1, C=3}
>
> How can I write a general record update function (assuming all fields in
> the update record are in the base record), such that
> let
>    val base = {A=1,B=2,C=3}
>    val update = {A=2,B=1}
> in
>    updater base update
> end
> ==
> {A=2, B=1, C=3}
>
> I got as far as:
>
> fun updater [tbase ::: {Type}] [tupdate ::: {Type}]
>             (fl : folder tupdate) (base : $tbase) (update : $tupdate) :
> $tbase =
>      @foldR (* ?? *)
>       (fn [nm ::_] [t ::_] [rest ::_] [[nm] ~ rest] t acc =>
>           acc -- nm ++ {nm = t})
>       base fl update
>
> Any guidance would be appreciated.
>
> Kindly, Mark.
>
> On 8/10/19 10:57 pm, Adam Chlipala wrote:
> > On 10/6/19 5:45 PM, Mark Clements wrote:
> >> In defining an FFI to a JavaScript library such as Chart.js, config
> >> options may be defined in terms of (nested) JavaScript objects with a
> >> range of potential keys/fields. Analogous to the xml tags, is there
> >> any way to define a record type in Ur/Web that potentially includes a
> >> subset of fields?
> >
> > In my own FFI wrapping so far, I have just given fields [option] types
> > when they are optional, dealing with writing in [None] values for
> > unused fields manually.  I don't think it's so bad!
> >
> > Since I never miss an opportunity to show off metaprogramming in
> > Ur/Web, here's a function you can use to cast a record to a wider type
> > where all the new fields have [option] types.
> >
> > fun expand [original ::: {Type}] [additional ::: {Type}] [original ~
> > additional]
> >            (fl : folder additional) (r : $original)
> >     : $(original ++ map option additional) =
> >     r ++ @map0 [option] (fn [t ::_] => None) fl
> >
> > fun foo (x : {A : int, B : option string, C : float, D : option bool,
> > E : string}) =
> >     42
> >
> > val example = foo (expand {A = 3, C = 1.234, D = Some True, E = "hi"})
> >
> >
> > _______________________________________________
> > Ur mailing list
> > Ur at impredicative.com
> >
> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.impredicative.com%2Fcgi-bin%2Fmailman%2Flistinfo%2Fur&data=02%7C01%7Cmark.clements%40ki.se%7Cc261896e2002436d168d08d74c3223c8%7Cbff7eef1cf4b4f32be3da1dda043c05d%7C0%7C0%7C637061651008402618&sdata=d0C41U6idMCbn%2F%2B8hSEdEj7fTNvzU2tdf8Jx4olkTT8%3D&reserved=0
> >
>
>
>
> När du skickar e-post till Karolinska Institutet (KI) innebär detta att KI
> kommer att behandla dina personuppgifter. Här finns information om hur KI
> behandlar personuppgifter<
> https://ki.se/medarbetare/integritetsskyddspolicy>.
>
>
> Sending email to Karolinska Institutet (KI) will result in KI processing
> your personal data. You can read more about KI’s processing of personal
> data here<https://ki.se/en/staff/data-protection-policy>.
> _______________________________________________
> Ur mailing list
> Ur at impredicative.com
> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>


-- 
Cheers,
Artyom Shalkhakov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20191016/4fe623d0/attachment.html>


More information about the Ur mailing list