(defmacro funcallq-or-lambda (f-or-lambda &rest args)
(if (and (listp f-or-lambda))
`(funcall ,f-or-lambda ,@args)
`(funcall ',f-or-lambda ,@args)))
(defmacro -> (val f &rest fs)
(if (null fs)
(if (listp f)
(if (not (eq (car f) 'lambda))
`(funcallq-or-lambda ,(car f) ,val ,@(cdr f))
`(funcall ,f ,val))
`(funcall ',f ,val))
`(-> (-> ,val ,f) ,@fs)))
(defmacro as-> (val sym f &rest fs)
(if (null fs)
(if (listp f)
(if (not (eq (car f) 'lambda))
`(funcall ',(car f) ,@(substitute val sym (cdr f)))
`(funcall ,f ,val))
`(funcall ',f ,val))
`(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)))))
; your code goes here
(print
(<_ (lambda (x) (* 2 x)) (- 3 _) sin pi))
KGRlZm1hY3JvIGZ1bmNhbGxxLW9yLWxhbWJkYSAoZi1vci1sYW1iZGEgJnJlc3QgYXJncykKICAoaWYgKGFuZCAobGlzdHAgZi1vci1sYW1iZGEpKQogICAgICBgKGZ1bmNhbGwgLGYtb3ItbGFtYmRhICxAYXJncykKICAgICAgYChmdW5jYWxsICcsZi1vci1sYW1iZGEgLEBhcmdzKSkpCgooZGVmbWFjcm8gLT4gKHZhbCBmICZyZXN0IGZzKQogIChpZiAobnVsbCBmcykKICAgICAgKGlmIChsaXN0cCBmKQogICAgICAgICAgKGlmIChub3QgKGVxIChjYXIgZikgJ2xhbWJkYSkpCiAgICAgICAgICAgICAgYChmdW5jYWxscS1vci1sYW1iZGEgLChjYXIgZikgLHZhbCAsQChjZHIgZikpCiAgICAgICAgICAgICAgYChmdW5jYWxsICxmICx2YWwpKQogICAgICAgICAgYChmdW5jYWxsICcsZiAsdmFsKSkKICAgICAgYCgtPiAoLT4gLHZhbCAsZikgLEBmcykpKQoKKGRlZm1hY3JvIGFzLT4gKHZhbCBzeW0gZiAmcmVzdCBmcykKICAoaWYgKG51bGwgZnMpCiAgICAgIChpZiAobGlzdHAgZikKICAgICAgICAgIChpZiAobm90IChlcSAoY2FyIGYpICdsYW1iZGEpKQogICAgICAgICAgICAgIGAoZnVuY2FsbCAnLChjYXIgZikgLEAoc3Vic3RpdHV0ZSB2YWwgc3ltIChjZHIgZikpKQogICAgICAgICAgICAgIGAoZnVuY2FsbCAsZiAsdmFsKSkKICAgICAgICAgIGAoZnVuY2FsbCAnLGYgLHZhbCkpCiAgICAgIGAoYXMtPiAoYXMtPiAsdmFsICxzeW0gLGYpICxzeW0gLEBmcykpKQoKKGRlZm1hY3JvIDxfICgmcmVzdCBhcmdzKQogICh3aXRoLWdlbnN5bXMgKG5ldy1hcmdzKQogICAgKGxldCAoKG5ldy1hcmdzIChucmV2ZXJzZSBhcmdzKSkpCiAgICAgIGAoYXMtPiAsKGNhciBuZXctYXJncykgXyAsQChjZHIgbmV3LWFyZ3MpKSkpKQo7IHlvdXIgY29kZSBnb2VzIGhlcmUKKHByaW50CiAgICAoPF8gKGxhbWJkYSAoeCkgKCogMiB4KSkgKC0gMyBfKSBzaW4gcGkpKQ==