【问题标题】:How do you perform arithmetic calculations on symbols in Scheme/Lisp?你如何在 Scheme/Lisp 中对符号进行算术计算?
【发布时间】:2009-07-14 15:31:21
【问题描述】:

我需要使用符号执行计算。我需要将 hh:mm 形式的时间转换为经过的分钟数。

;; (get-minutes symbol)->number
;; convert the time in hh:mm to minutes
;; (get-minutes 6:19)-> 6* 60 + 19

(define (get-minutes time)
  (let* ((a-time (string->list (symbol->string time)))
         (hour (first a-time))
         (minutes (third a-time))) 
    (+ (* hour 60) minutes)))

这是一个不正确的代码,经过所有转换后我得到了一个字符,无法执行正确的计算。

大家有什么建议吗?我无法更改输入类型。
上下文:输入是航班时刻表,因此我无法更改数据结构。

;; -------------------------------------------------- --------------------

编辑: 想出了一个丑陋的解决方案。请提出更好的建议。

(define (get-minutes time)
  (let* ((a-time (symbol->string time))
         (hour (string->number (substring a-time 0 1)))
         (minutes (string->number (substring a-time 2 4)))) 
    (+ (* hour 60) minutes)))

【问题讨论】:

  • 你为什么称这个解决方案丑陋?使用这种输入格式,它几乎是最小的。
  • 我讨厌硬编码(substring X 0 1)之类的东西,这根本没有意义。顺便说一句,字符串拆分功能很棒。

标签: lisp scheme type-conversion racket


【解决方案1】:

您可以找到字符串拆分here 的定义。它将使您能够在您选择的分隔符处拆分字符串。然后你可以像这样定义 get-minutes:

(define (get-minutes time)
  (let* ((fields (string-split (symbol->string time) '(#\:)))
         (hour (string->number (first fields)))
         (minutes (string->number (second fields))))
    (+ (* hour 60) minutes)))

【讨论】:

  • 糟糕,忘记链接了。现已添加。
  • 由于问题被标记为“plt-scheme”,您可以使用 (regexp-split #rx":" time) -- 不需要字符串拆分代码。
【解决方案2】:

您需要转换为数值才能使您的计算有意义。 (hour (string->number (string (first a-time)))) 相同的分钟

【讨论】:

  • (first a-time) 将是一个字符。我卡住了。
  • 哦,那么 (char->integer ...) 怎么样
  • 好的,是的,对不起,不再偷懒了 ​​(string->number (string (first a-time))) 会给你你想要的
  • Felleisen 会嫌弃我(我是 NEU allum)
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2021-05-26
相关资源
最近更新 更多