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

在if内部定义

  •  1
  • VansFannel  · 技术社区  · 5 年前

    我刚开始学球拍。

    我有这个代码:

    #lang racket
    
    (define t1 '(10 20))
    (define t2 '(20 30))
    
    (if (list? (first t1)) (define funcion1 >=) (define funcion1 >))
    (if (list? (last t1)) (define funcion2 <=) (define funcion2 <))
    
    (not (and (function1 (first t2) (first t1))
              (function2 (last t2) (last t1))))
    

    但它不起作用,因为球拍不允许这样做: (define funcion1 >=) . 我得到错误:

    在:(define funcion1>=)中的表达式上下文中不允许使用define:

    我没有做嵌套if,而是考虑使用通用id( 功能1 功能2 )为函数 > < .

    注释 :
    t1 也可以 (define t1 '((20) 35)) .

    如何修复此错误?

    2 回复  |  直到 5 年前
        1
  •  2
  •   Sylwester    5 年前

    define 不同的 一个函数的顶层和内部。当你不能 定义 在边A if 你可以放 如果 在表达式的内部 定义 :

    这完全可以:

    (define function1 (if (list? (first t1)) >= >))
    (define function2 (if (list? (last t1)) <= <))
    

    使用 let 也可以,但是只有在关闭时,您才能:

    (let ([function1 (if (list? (first t1)) >= >)]
          [function2 (if (list? (last t1)) <= <)])
      ;; use function1 and function2 here
      )
    ;; function1 and function2 no longer exists here
    

    与本地相同 定义 :

    (let () ;; this is a function called right away
      ;; these are local define
      (define function1 (if (list? (first t1)) >= >))
      (define function2 (if (list? (last t1)) <= <))
    
      ;; use function1 and function2 here
      )
    ;; function1 and function2 no longer exists here
    

    这只是一种奇特的写作方式:

    (let ()
      (letrec ([function1 (if (list? (first t1)) >= >)]
               [function2 (if (list? (last t1)) <= <)])
        ;; use function1 and function2 here
        )
      ;; use function1 and function2 here
      )
    

    这个 在上一个例子中是多余的,因为前一个例子有多余的。

        2
  •  0
  •   VansFannel    5 年前

    我想我已经找到了如何利用这个灵感来解决这个问题 SO answer 使用 let .

    #lang racket
    
    (define t1 '(10 20))
    (define t2 '(20 30))
    
    (let ([function1 (if (list? (first t1)) >=  >)])
    (let ([function2 (if (list? (last t1)) <= <)])
    
    (not (and (function1 (first t2) (first t1))
              (function2 (last t2) (last t1))))))
    

    但也许有更好的方法。