代码之家  ›  专栏  ›  技术社区  ›  Joe

如何修复“无法更改常量”错误

  •  1
  • Joe  · 技术社区  · 7 年前

    到目前为止我有这个代码

    (define (max f g) 
      (define (int-max x y)
        (if (> x y) x y))
      (lambda (x) (int-max (f x) (g x))))
    

    这给了我一个错误 define-values: assignment disallowed; cannot change constant constant: max

    我不知道如何解决这个问题,也不知道这意味着什么。

    3 回复  |  直到 7 年前
        1
  •  4
  •   Sylwester    7 年前

    在左下角的DrRacket中有一个下拉列表,您可以在其中选择Language。您可以从中选择“选择语言”,然后单击“显示详细信息”。对于R5R等遗留语言,您可以选择“不允许重新定义初始绑定”。

    现在,根据R5R,您的重新定义只能扩展功能,而对于原始绑定使用的数据类型,在新定义中也应该使用相同的功能。原因是能够不断折叠代码。因此,以下代码无效:

    (define + -)
    (+ 5 3)
    ; ==> 7
    

    这可能看起来很奇怪,但程序违反了报告,因此,就报告而言,结果也可能是字符串“香蕉”。在R5RS中,您需要使其与“未来计划”兼容:

    (define numeric-max max)
    (define max
      (lambda (v1 . vs)
        (if (number? v1)
            (apply numeric-max v1 vs)
            (lambda (x) (numeric-max (v1 x) ((car vs) x))))))
    

    使用R6RS,您可以通过根本不导入绑定来避免这种情况:

    #!r6rs
    (import (except (rnrs base) max))
    
    (define (max f g) 
      (define (int-max x y)
        (if (> x y) x y))
      (lambda (x) (int-max (f x) (g x))))
    

    如果你想 max 您可以使用命名导入执行与R5R中相同的操作:

    #!r6rs
    (import (except (rnrs base) max)
            (only (rnrs control) case-lambda)
            (rename (rnrs base) (max numeric-max)))
    
    (define max
        (case-lambda
          ((v1 v2)
           (if (number? v1)
               (numeric-max v1 v2)
               (lambda (x) (numeric-max (v1 x) (v2 x)))))
          (args
           (apply numeric-max args))))
    

    这是科鲁斯的作品 #lang racket 也:

    #lang racket
    (require (rename-in racket/base [max numeric-max]))      
    (define max
        (case-lambda
          ((v1 v2)
           (if (number? v1)
               (numeric-max v1 v2)
               (lambda (x) (numeric-max (v1 x) (v2 x)))))
          (args
           (apply numeric-max args))))
    
        2
  •  2
  •   R Sahu    7 年前

    你面临的问题是 max 已定义,您正在尝试重新定义它。

    更重要的是,名称 最大值 不适合您尝试使用它的目的。您正在呼叫 最大值 有几个参数是函数。它返回一个 lambda 可以使用变量调用的。

    您的设想用途,如

    ((max sin cos) 10)
    

    名称,如 max-proc-value 更合适,可以避免您遇到的问题。

        3
  •  1
  •   soegaard    7 年前

    如果你把它放在定义窗口(上面的一个)中,一切都正常。

    #lang racket
    (define (max f g) 
        (define (int-max x y)
          (if (> x y) x y))
     (lambda (x) (int-max (f x) (g x))))