在if中定义

时间:2019-01-25 18:02:17

标签: functional-programming scheme racket

我刚刚开始学习球拍。

我有此代码:

#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))))

但是它不起作用,因为Racket不允许这样做:(define funcion1 >=)。我收到错误消息:

  

定义:在(define funcion1> =)

中的表达式上下文中不允许使用

我考虑使用通用ID( function1 function2 )来代替嵌套><

注意
t1也可能是(define t1 '((20) 35))

如何解决此错误?

2 个答案:

答案 0 :(得分:2)

define是顶层 且在函数内部。另外,虽然您不能将define放在if的旁边,但是可以将if放在define的表达式内:

这完全可以:

(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

与本地define相同:

(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
  )

最后一个示例中的let是多余的,因为前面的示例中有它。

答案 1 :(得分:0)

我想我已经找到了如何用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))))))

但是也许有更好的方法。