2017-02-16 11 views
2

Выучил код C, давно; хотел попробовать что-то новое и другое с помощью Scheme. Я пытаюсь сделать процедуру, которая принимает два аргумента и возвращает большую из двух, например.Процедура схемы с двумя аргументами

(define (larger x y) 
    (if (> x y) 
    x 
    (y))) 

(larger 1 2) 

или

(define larger 
    (lambda (x y) 
    (if (> x y) 
     x (y)))) 

(larger 1 2) 

Я считаю, что оба из них являются эквивалентными, если т.е. х> у, х возврата; else, return y.

Когда я пытаюсь выполнить любое из этих действий, я получаю ошибки, например. -не является функция или ошибки: не может назвать: 2

Я провел несколько часов чтения над SICP и TSPL, но ничего не выпрыгивает (возможно, мне нужно использовать «список» и ссылки два элемента через автомобиля и корд?)

Любая помощь приветствуется. Если я ошибаюсь, пропустил предыдущий ответ на тот же вопрос или, в противном случае, неуместно, мои извинения.

ответ

1

Причина в том, что в отличие от C и многих других языков, в Scheme и всех языковых языках Lisp важная часть синтаксиса.

Например, они используются для вызова функции: (f a b c) средства применяют функцию f (вызов) аргументы a, b и c, в то время как (f) средство применяется (вызов) функции f (без аргументов).

Таким образом, в вашем коде (y) означает применить номер 2 (текущее значение y), но 2 не является функцией, а число (как в сообщении об ошибке).

Просто измените код:

(define (larger x y) 
    (if (> x y) 
     x 
     y)) 

(larger 1 2) 
+0

Brilliant! Спасибо! Я подтвердил, что это сработало. Я мог видеть, что 2 рассматривается как функция, но я не мог понять, почему и как. Определенное смещение, исходящее от C. Спасибо, снова. :-) – h34thf

Смежные вопросы