我创建了一个简单的Web应用程序,用户在其中输入数字,然后将其计算为不同的货币。我发现的问题是,要显示该数字,首先需要将其转换为字符串。通常,如果它不是Web应用程序,则只执行number->string x
,但在这种情况下,它不希望工作,或者至少我做错了。
我的代码:
#lang racket
(require web-server/servlet
web-server/servlet-env)
(define (page request)
;; extract the key value if present
(define bindings (request-bindings request))
;; print entered currency when available
(cond ((exists-binding? `amount bindings)
(define (mynumber) (extract-binding/single `amount bindings))
(define usd (lambda (mynumber) (* mynumber #i1.25)))
(define eur (lambda (mynumber) (* mynumber #i1.14)))
(response/xexpr
'(html (head (title "Currency Exchange"))
(body
(h1 "Currency Exchange")
(div ((class "amount"))
(p "entered amount" ,mynumber)
(p "amount in USD: " ,usd)
(p "amount in EUR: " ,eur))
))))
;; If there is no currency entered
(else
(response/xexpr
'(html (head (title "Currency Exchange"))
(body
(h1 "Currency Exchange")
(p "enter currency in GBP:")
(form
(input ((name "amount")))
(input [(type "submit") (value "Calculate")]))
))))
)
)
(serve/servlet page
#:port 8080
#:listen-ip #f
#:servlet-path "/currency")
没有完全回答您的问题,但是我看到了一些错误:
1。
(define (mynumber) (extract-binding/single `amount bindings))
应该是:
(define mynumber (extract-binding/single 'amount bindings))
;; OR
;; (define mynumber (string->number (extract-binding/single 'amount bindings)))
在这种情况下,创建过程没有用。一个简单的定义就可以了。
当您不使用unquote时,请使用引号代替准引号。
2。
(define usd (lambda (mynumber) (* mynumber #i1.25)))
(define eur (lambda (mynumber) (* mynumber #i1.14)))
应该是:
(define usd (* mynumber 1.25))
(define eur (* mynumber 1.14))
同样,无需创建过程,因为您要做的就是将两个数字相乘。
#i
(不精确数字)前缀是多余的,因为默认情况下,没有精确性说明符的实数通常不精确(details here)。
3。
(response/xexpr
'(html (head (title "Currency Exchange"))
(body
(h1 "Currency Exchange")
(div ((class "amount"))
(p "entered amount" ,mynumber)
(p "amount in USD: " ,usd)
(p "amount in EUR: " ,eur)))))
您可以使用quasiquote
(即`
[反引号])而不是quote
(即'
)来解决此问题,因为您正在使用unquote
(即,
)。
使用unquote时使用准引用代替引用。