Actually you might want to use (list (let () body ...)) rather than (list (begin body ...)) so that you can use define inside when/splice, just like how you can do that in when.
On Sun, Mar 1, 2020 at 3:26 AM Sorawee Porncharoenwase < [email protected]> wrote: > Well, you can always use macro! > > (define-syntax-rule (when/splice test body ...) > (if test (list (begin body ...) '()))) > > `(body > (form ((action "") (method "post")) > (label ((for "username")) "Username:") > (input ((type "text") (name "username") (maxlength "64"))) > (label ((for "password")) "Password:") > (input ((type "password") (name "password") (maxlength "64"))) > (button ((type "submit") (value "Login")) "Login")) > ,@(when/splice (not (eq? login-error "")) > `(p ,login-error))) > > > > On Sun, Mar 1, 2020 at 12:50 AM liendolucas84 <[email protected]> > wrote: > >> Thank you very much for your reply Sorawee. I'll go with your proposed >> solution for the time being. However it feels like I'm adding unnecessary >> code to make the xexpr valid which can be really annoying if having nested >> cases or other more complex situations. Thanks again for your fast reply! >> >> On Sunday, March 1, 2020 at 7:43:20 PM UTC+11, Sorawee Porncharoenwase >> wrote: >>> >>> One possible way is to have the first case returns a list of one >>> element, and the else case returns an empty list. You then splice this list >>> into body via ,@. >>> >>> `(body >>> (form ((action "") (method "post")) >>> (label ((for "username")) "Username:") >>> (input ((type "text") (name "username") (maxlength "64"))) >>> (label ((for "password")) "Password:") >>> (input ((type "password") (name "password") (maxlength "64"))) >>> (button ((type "submit") (value "Login")) "Login")) >>> ,@(cond >>> [(not (eq? login-error "")) `((p ,login-error))] >>> [else '()])) >>> >>> If the then branch is taken, the value will be: >>> >>> `(body >>> (form ((action "") (method "post")) >>> (label ((for "username")) "Username:") >>> (input ((type "text") (name "username") (maxlength "64"))) >>> (label ((for "password")) "Password:") >>> (input ((type "password") (name "password") (maxlength "64"))) >>> (button ((type "submit") (value "Login")) "Login")) >>> (p ,login-error)) >>> >>> On the other hand, if the else branch is taken, the value will be: >>> >>> `(body >>> (form ((action "") (method "post")) >>> (label ((for "username")) "Username:") >>> (input ((type "text") (name "username") (maxlength "64"))) >>> (label ((for "password")) "Password:") >>> (input ((type "password") (name "password") (maxlength "64"))) >>> (button ((type "submit") (value "Login")) "Login"))) >>> >>> >>> On Sun, Mar 1, 2020 at 12:31 AM liendolucas84 <[email protected]> >>> wrote: >>> >>>> Hi everyone! Just joined the Racket User's group. I'm trying to >>>> conditionally render a paragraph element using a cond and an xexpr but I >>>> can't make the "xexpr?" function return a #t value and of course the >>>> response/xexpr function call fails as well. I've kind of fix this by always >>>> returning a paragraph element regardless is needed or not (of course this >>>> is not what I want). Here's the working code: >>>> >>>> (define (login-template (login-error "")) >>>> `(html >>>> (head >>>> (link ((rel "icon") (href "data:,"))) >>>> (title "Please login")) >>>> (body >>>> (form ((action "") (method "post")) >>>> (label ((for "username")) "Username:") >>>> (input ((type "text") (name "username") (maxlength "64"))) >>>> (label ((for "password")) "Password:") >>>> (input ((type "password") (name "password") (maxlength >>>> "64"))) >>>> (button ((type "submit") (value "Login")) "Login")) >>>> ,(cond >>>> ((not (eq? login-error "")) `(p, login-error)) >>>> (else '(p "Enter your username/password.")))))) >>>> >>>> However I don't want to display at all the "else" clause as is not >>>> needed at all, here's the failing code: >>>> >>>> (define (login-template (login-error "")) >>>> `(html >>>> (head >>>> (link ((rel "icon") (href "data:,"))) >>>> (title "Please login")) >>>> (body >>>> (form ((action "") (method "post")) >>>> (label ((for "username")) "Username:") >>>> (input ((type "text") (name "username") (maxlength "64"))) >>>> (label ((for "password")) "Password:") >>>> (input ((type "password") (name "password") (maxlength >>>> "64"))) >>>> (button ((type "submit") (value "Login")) "Login")) >>>> ,(cond >>>> ((not (eq? login-error "")) `(p, login-error)))))) >>>> >>>> The last example fails if the login-error is indeed "" (an empty >>>> string). Am I missing something like a "null xexpr" usage for the "else" >>>> clause or something different that needs to be used in these situations? Of >>>> the all examples out there that I could find and read none of them shows >>>> how to do something like this. Is there a doc page where can I read about >>>> caveats using xexprs (if any) or situations like the one I've described? >>>> >>>> Thanks for your time, >>>> Lucas. >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Racket Users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/racket-users/48f5b3c7-3ec2-43cc-8f01-60e36acb1e74%40googlegroups.com >>>> <https://groups.google.com/d/msgid/racket-users/48f5b3c7-3ec2-43cc-8f01-60e36acb1e74%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "Racket Users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/racket-users/1286c435-bbff-4b0a-8a3a-eb1ccf731b27%40googlegroups.com >> <https://groups.google.com/d/msgid/racket-users/1286c435-bbff-4b0a-8a3a-eb1ccf731b27%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CADcuegs4XBhWi-E6LkN-Xjg%2BQjENOO%2B%3D-zYZDcLttedcU7ZG7A%40mail.gmail.com.

