球拍:为特定产品添加新数量

Racket: add a new quantity to a specific product

代码的目标就是这样。添加新项目后,我需要为我想要的产品添加新数量,并通过使用 set!,我需要新数量真正改变。

(define-struct articulo (nombre cantidadDisponible))

(define  listaArticulos empty)

(define (productoNuevo nom can)
  (set! listaArticulos
        (cons (make-articulo nom can) listaArticulos)))

(define (agregarValor datoABuscar datoASumar)
(local
  ( 
   (define (agregar lista buscar valorSumar)
     (cond
       [(empty? lista)empty]
       [(string=? buscar (articulo-nombre (car listaArticulos)))
        (make-articulo (+ (articulo-cantidadDisponible(car lista)) valorSumar)
              (agregar (cdr lista)buscar valorSumar))]
       [else (make-articulo (car lista) (agregar (cdr lista) buscar valorSumar))]
       )
     )
   ) 
  (begin
    (set! listaArticulos (agregar listaArticulos datoABuscar datoASumar))
    )
  )
)

正在向项目列表添加新项目

(productoNuevo "tomatoes" 20)
(productoNuevo "oranges" 20)

然后我需要为我想要的产品添加一个新的数量

(agregarValor "tomatoes" 10)

那我要确认新的数量已经添加了

listaArticulos 

输出必须是

(list (make-articulo "oranges" 20) (make-articulo "tomatoes" 30))

而是

(make-articulo 30 (make-articulo 30 '()))

你能帮我解决这个问题吗?

恐怕程序的逻辑不对。这些是主要问题:

  • 您需要构建一个新的列表作为输出,然后才set!将结果输出到外部列表。
  • 第二个和第三个条件都需要重写,所以他们用cons构造输出列表。
  • 条件为string=?的行不正确,你取的是错误列表的car
  • 调用 make-articulo 时,您忘记传递项目的名称。

这应该可以解决问题:

(define (agregarValor datoABuscar datoASumar)
  (local
    ((define (agregar lista buscar valorSumar)
       (cond
         [(empty? lista) empty]
         [(string=? buscar (articulo-nombre (car lista)))
          (cons 
           (make-articulo (articulo-nombre (car lista))
                          (+ (articulo-cantidadDisponible (car lista)) valorSumar))
           (agregar (cdr lista) buscar valorSumar))]
         [else (cons (car lista) (agregar (cdr lista) buscar valorSumar))])))
    (begin 
      (set! listaArticulos (agregar listaArticulos datoABuscar datoASumar)))))

现在它按预期工作了:

(define (print lst)
  (for-each (λ (articulo)
              (printf "~s: ~s ~n"
                      (articulo-nombre articulo)
                      (articulo-cantidadDisponible articulo)))
            lst))

(productoNuevo "tomatoes" 20)
(productoNuevo "oranges" 20)
(print listaArticulos)
=> "oranges": 20 
   "tomatoes": 20

(agregarValor "tomatoes" 10)
(print listaArticulos)
=> "oranges": 20 
   "tomatoes": 30