( defmacro with-gensyms ( syms & body body)
`( let , ( loop for s in syms collect `( , s ( gensym ) ) )
, @body) )
( defmacro -> ( val f & rest fs)
( cond ( ( null fs)
( cond
( ( listp f) `( funcall ', ( car f) , val , @( cdr f) ) )
( t `( funcall ', f , val) ) ) )
( t `( -> ( -> , val , f) , @fs) ) ) )
( defmacro as-> ( val sym f & rest fs)
( cond ( ( null fs)
( cond ( ( listp f) `( funcall ', ( car f) , @( substitute val sym ( cdr f) ) ) )
( t `( funcall ', f , val) ) ) )
( t `( as-> ( as-> , val , sym , f) , sym , @fs) ) ) )
( defmacro < _ ( & rest args)
( with-gensyms ( new-args)
( let ( ( new-args ( nreverse args) ) )
`( as-> , ( car new-args) _ , @( cdr new-args) ) ) ) )
( print ( < _ sin ( * 2 _) asin 1 ) )
( print ( < _ ( - _ 1 ) ( / _ 2 ) 4 ) )
KGRlZm1hY3JvIHdpdGgtZ2Vuc3ltcyAoc3ltcyAmYm9keSBib2R5KQogIGAobGV0ICwobG9vcCBmb3IgcyBpbiBzeW1zIGNvbGxlY3QgYCgscyAoZ2Vuc3ltKSkpCiAgICAsQGJvZHkpKQoKKGRlZm1hY3JvIC0+ICh2YWwgZiAmcmVzdCBmcykKICAoY29uZCAoKG51bGwgZnMpCiAgICAgICAgIChjb25kCiAgICAgICAgICAgKChsaXN0cCBmKSBgKGZ1bmNhbGwgJywoY2FyIGYpICx2YWwgLEAoY2RyIGYpKSkKICAgICAgICAgICAodCBgKGZ1bmNhbGwgJyxmICx2YWwpKSkpCiAgICAgICAgKHQgYCgtPiAoLT4gLHZhbCAsZikgLEBmcykpKSkKCihkZWZtYWNybyBhcy0+ICh2YWwgc3ltIGYgJnJlc3QgZnMpCiAgKGNvbmQgKChudWxsIGZzKQogICAgICAgICAoY29uZCAoKGxpc3RwIGYpIGAoZnVuY2FsbCAnLChjYXIgZikgLEAoc3Vic3RpdHV0ZSB2YWwgc3ltIChjZHIgZikpKSkKICAgICAgICAgICAgICAgKHQgYChmdW5jYWxsICcsZiAsdmFsKSkpKQogICAgICAgICh0IGAoYXMtPiAoYXMtPiAsdmFsICxzeW0gLGYpICxzeW0gLEBmcykpKSkKCihkZWZtYWNybyA8XyAoJnJlc3QgYXJncykKICAod2l0aC1nZW5zeW1zIChuZXctYXJncykKICAgIChsZXQgKChuZXctYXJncyAobnJldmVyc2UgYXJncykpKQogICAgICBgKGFzLT4gLChjYXIgbmV3LWFyZ3MpIF8gLEAoY2RyIG5ldy1hcmdzKSkpKSkKCihwcmludCAoPF8gc2luICgqIDIgXykgYXNpbiAxKSkKKHByaW50ICg8XyAoLSBfIDEpICgvIF8gMikgNCkp