Как преобразовать число в строку для веб-приложений в Racket - PullRequest
2 голосов
/ 27 апреля 2020

Я создал простое веб-приложение, в котором пользователь вводит число, и оно рассчитывается в разных валютах. Проблема, которую я обнаружил, состоит в том, что для того, чтобы число отображалось обратно, его сначала нужно преобразовать в строку. Обычно, если бы это не было веб-приложение, я бы просто сделал 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 Ответ

2 голосов
/ 28 апреля 2020

Не совсем отвечаю на ваш вопрос, но я вижу несколько ошибок:

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)))

Там нет использовать при создании процедуры в этом случае. Простое определение делает работу.

Используйте кавычки вместо кавычек, когда вы не используете кавычки.

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 (неточное число) является избыточным, потому что действительные числа без по умолчанию указатель точности является неточным ( подробности здесь ).

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 (то есть ` [ backtick]) вместо quote (то есть '), потому что вы используете unquote (то есть ,).

Используйте квазицитатуру вместо кавычки, когда вы используете кавычки.

...