我刚刚开始学习球拍。
我有此代码:
#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))
。
如何解决此错误?
答案 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)