В вашей процедуры вы вызываете определение ..
+ ; ==> <procedure: +> (how it's printed varies but it is the value that can be called)
(+) ; ==> 0
^- this calls the result for evaluation `+` which is `<procedure: +>`
((define something ...)) ; == (undefined-value) == Error!
^- this calls the result of `(define something ...)`.
define
будет возвращать некоторое значение зависит от реализации и в докладе, это просто говорит, что это не определено. Вы не можете предположить, что это же значение, что something
связан с (что было бы хорошее неопределенное значение)
Также формат вашего местного define
не использует стандартные расширения, которые могут быть нормально для некоторых реализаций Scheme, и это определено в SRFI-16 , но это не переносная функция.
(define (get-last (length array) array)
...)
Таким образом, на языке, который не позволяет этого, вы получите сообщение об ошибке, в то время как языки, поддерживающие расширение, не могут.
Разница между последней парой и парой до того, как это значение cdr
. (cdr '(1 . 2)) ; ==> 2
в то время как (cdr '(0 1 . 2)) ; ==> (1 . 2)
. Таким образом, вы можете просматривать список, пока не упретесь в нон pair?
значение для cdr
:
(define (last-pair lst)
(if (pair? (cdr lst))
(last-pair (cdr lst))
lst))
(last-pair '(1 2 3 4 . 5)) ; ==> (4 . 5)
Заметим, что это не сработает, если вы не даете ему пару, чтобы начать с, так же, как и car
cdr
.
Я бы отказался от использования 'length'. «длина» - неприятная привычка. – molbdnilo
Согласен. Я просто придерживался первоначального подхода. В этом случае, возможно, самым простым было бы что-то вроде '(car (reverse array))' –