如何在 Racket 中将数字转换为 Web 应用程序的字符串
How to convert number to string for Web Applications in Racket
我创建了一个简单的 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 时,使用 quote 而不是 quasiquote。
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 时,使用 quasiquote 而不是 quote。
我创建了一个简单的 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 时,使用 quote 而不是 quasiquote。
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 时,使用 quasiquote 而不是 quote。