球拍可变变量

use*_*316 4 variables scheme mutable racket

我是新手,并且遇到了我需要一个可变数值变量的实例

下面是一个通过一串位(101011 ....)工作的函数,如果它遇到1改变一个名为"value"的数值变量,如果它遇到0则必须改变相同的变量"value".因此,当我们到达字符串的末尾时,我们应该得到总数为"值".

(define (implode bstr value)
        (for ([c (string-length bstr)])
           (display (string-ref bstr c))
      (if (eqv? (string-ref bstr c) #\1) (displayln (+ (/ value 3) 17))
          (displayln (/ value 3)))))
Run Code Online (Sandbox Code Playgroud)

如果没有mtauble变量,我可以通过prgram运行这个变量吗?

Ósc*_*pez 5

正如已经提出的,使用递归可以很容易地解决这个问题,而不使用可变变量.这是在Scheme中编写过程的首选方法:

(define (implode bstr value)
  (let loop ((value value)
             (lst (string->list bstr)))
    (cond ((null? lst)
           value)
          ((char=? (car lst) #\1)
           (loop (+ (/ value 3) 17) (cdr lst)))
          ((char=? (car lst) #\0)
           (loop (/ value 3) (cdr lst)))
          (else (error "unexpected char" (car lst))))))
Run Code Online (Sandbox Code Playgroud)


Eli*_*lay 5

我不确定该implode函数的目标是什么,但是是的,您绝对不需要使用突变。Racket 是一种高级语言,具有尾部调用消除功能,这意味着通过本地函数进行的循环(如 \xc3\x93scar\ 示例中所做的那样)是编译器稍后将转换为使用突变或所需的任何内容的高效代码的东西。

\n\n

但更重要的是,最好能够展示如何编写更简洁、或许更接近突变心理模型的 Racket 代码。这里的主要成分是for/fold,它正在执行“for 循环”,但在整个循环中使用“状态变量”。这里的“状态”被引用是因为它并不真正存在——它实际上是一个宏,可以扩展到与 \xc3\x93scar\ 的示例中类似的循环。我还通过一些次要但有用的方法改进了代码的其他部分:您可以直接迭代字符串,不需要索引;那里并不真正需要the in-string,但它使迭代类型更加明确,速度更快,并且如果bstr不是字符串,则会抛出错误;你可以用它case来检查你所在的角色;只要您使用它,如果字符既不是“0”也不是“1”,最好抛出错误。

\n\n

它是这样的:

\n\n
(define (implode bstr)\n  (for/fold ([value 0]) ([c (in-string bstr)])\n    (case c\n      [(#\\0) (+ (/ value 3) 17)]\n      [(#\\1) (/ value 3)]\n      [else (error \'implode "bad character: ~e" c)])))\n
Run Code Online (Sandbox Code Playgroud)\n\n

尽管如此,这还是会产生一些奇怪的结果,但我再次不确定这个函数应该做什么......

\n


dyo*_*yoo 5

球拍支持突变.例如:

#lang racket

;; count-whales: (listof string) -> number
;; Returns a count of the number of whales in lst.
(define (count-whales lst)
  (define c 0)
  (for ([thing lst])
    (when (equal? thing "shamu")
      (set! c (add1 c))))
  c)

;; Example:
(count-whales '("shamu" "donald duck" "shamu"))
Run Code Online (Sandbox Code Playgroud)

你可能习惯于以这种方式看循环,其中变异允许我们记录一些运行值.用突变写作没有障碍.但话虽如此,上述功能并不是惯用的Racket.相反,Racketeer会使用一个可以累积值的循环,而不是使用变异.

以下是使用累加器编写时上述函数的样子:

#lang racket

;; count-whales: (listof string) -> number
;; Returns a count of the number of whales in lst.
(define (count-whales lst)
  (for/fold ([c 0])
            ([thing lst])
    (if (equal? thing "shamu")
        (add1 c)
        c)))

;; Example:
(count-whales '("shamu" "donald duck" "shamu"))
Run Code Online (Sandbox Code Playgroud)