如何在 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。