One thing I knew and has only been reinforced in early feedback about Andl: you can’t just talk about a new language, you have to show it.
So here is my version of a sample application I found on CPAN: http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Example.pod. They’re not strictly comparable, so just take this is as a sample of what Andl code looks like for creating some data and executing some simple queries.
// translation of sample application from http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Example.pod
// create the database relvars
artist := {{ artistid:0, name:'' }}
cd := {{ cdid:0, artistid:0, title:'', year:0 }}
track := {{ trackid:0, cdid:0, title:'' }}
// some data in temporary relvars, with auto-generated ordinals
$artist_data := {{name:''}
( 'Michael Jackson' ),
( 'Eminem' ),
} [{ *artistid := ord() }]
$cd_data := {{ title:'', name:'' }
( 'Thriller', 'Michael Jackson' ),
( 'Bad', 'Michael Jackson' ),
( 'The Marshall Mathers LP', 'Eminem' ),
} [{ *cdid := ord() }]
$track_data := {{ title:'', cd:'' }
( 'Beat It' , 'Thriller' ),
( 'Billie Jean' , 'Thriller' ),
( 'Dirty Diana' , 'Bad' ),
( 'Smooth Criminal' , 'Bad' ),
( 'Leave Me Alone' , 'Bad' ),
( 'Stan' , 'The Marshall Mathers LP' ),
( 'The Way I Am' , 'The Marshall Mathers LP' ),
} [{ *trackid := ord() }]
// update the database relvars
artist := union $artist_data
cd := union ($cd_data join artist) [{ title, cdid, artistid, year:=0}]
track := union ($track_data join cd [{ *cd := title }]) [{ trackid, title, cdid }]
// functions to answer various queries
get_tracks_by_cd(t) => cd[ ?(title = t) { *title } ] join track
get_tracks_by_artist(a) => (artist[ ?(name = a) { *name }] join cd) [{ cdid }] join track
get_cd_by_track(t) => track [ ?(title = t) { cdid } ] join cd
get_cds_by_artist(a) => artist [?(name = a) { artistid } ] join cd
get_artist_by_track(t) => (track [?(title = t) { cdid }] join cd) [{ artistid }] join artist
get_artist_by_cd(t) => (cd [?(title = t) { cdid }] join cd) [{ artistid }] join artist
// first show the raw data
crlf := h'd a'
output := crlf & "=== Sample data ===" & crlf
output := artist.pp
output := crlf.pp
output := cd.pp
output := crlf.pp
output := track.pp
// now do the queries
show(title, data:{{ str:'' }}) => do {
output := title & crlf & data[ {fold(&, " " & str & crlf)} ]
}
output := crlf & "=== Query results ===" & crlf
show("Track title:", get_tracks_by_cd('Bad') [ {str:=title} ])
show("Track title:", get_tracks_by_artist('Michael Jackson') [ {str:=title} ])
show("CD title:", get_cd_by_track('Stan') [ {str:=title} ])
show("CD title:", get_cds_by_artist('Michael Jackson') [ {str:=title} ])
show("Artist:", get_artist_by_track('Dirty Diana') [ {str:=name} ])
show("Artist:", get_artist_by_cd('The Marshall Mathers LP') [ {str:=name} ])
The output from compiling and running this script looks as follows.
=== Sample data === artistid | name -------------------------- 0 | Michael Jackson 1 | Eminem text: ' ' cdid | artistid | title | year ---------------------------------------------------- 0 | 0 | Thriller | 0 1 | 0 | Bad | 0 2 | 1 | The Marshall Mathers LP | 0 text: ' ' trackid | cdid | title ---------------------------------- 0 | 0 | Beat It 1 | 0 | Billie Jean 2 | 1 | Dirty Diana 3 | 1 | Smooth Criminal 4 | 1 | Leave Me Alone 5 | 2 | Stan 6 | 2 | The Way I Am === Query results === Track title: Dirty Diana Smooth Criminal Leave Me Alone Track title: Beat It Billie Jean Dirty Diana Smooth Criminal Leave Me Alone CD title: The Marshall Mathers LP CD title: Thriller Bad Artist: Michael Jackson Artist: Eminem