Определите внутри, если - PullRequest
0 голосов
/ 25 января 2019

Я только начал изучать ракетку.

У меня есть этот код:

#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 >=).Я получаю сообщение об ошибке:

определить: не разрешено в контексте выражения в: (определить funcion1> =)

Вместо того, чтобы делать вложенные, если я подумал использоватьуниверсальный идентификатор ( function1 и function2 ) для функции > и <.

NOTE :t1 также может быть (define t1 '((20) 35)).

Как я могу исправить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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 в последнем примере является избыточным и существует только потому, что оно было в предыдущем примере.

0 голосов
/ 25 января 2019

Я думаю, что нашел решение этой проблемы с вдохновением SO ответа : используя 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))))))

Но, может быть, есть лучший способ сделать это.

...