Lisp Функции
Формулировка задачи:
Здравствуйте, помогите пожалуйста решить задание
Вычислить значения следующих вызовов с пошаговым объяснением:
1. (apply ’cons ’(a b));
2. (funcall ’cons ’(a b));
3. (funcall ’apply ’cons ’(a b));
4. (funcall ’cons ’apply ’(a b)
Решение задачи: «Lisp Функции»
textual
Листинг программы
1)---------------------------------------------------------------------------------------- [3]> (step (apply 'cons '(a b))) шаг 1 --> (APPLY 'CONS '(A B)) ; Входим в функцию apply с аргументами 'cons и '(a b) Step 1 [4]> :s шаг 2 --> 'CONS ; Вычисление первого аргумента 'cons Step 2 [5]> :s шаг 2 ==> значение: CONS ; Результатом вычисления будет просто cons шаг 2 --> '(A B) ; Вычисление второго аргумента '(a b) Step 2 [6]> :s шаг 2 ==> значение: (A B) ; Результатом вычисления будет (a b) шаг 1 ==> значение: (A . B) ; Функция apply применяет функцию cons к аргументам в списке (a b) (A . B) ; Результатом будет пара (a . b) ; То же самое можно было написать проще: (cons 'a 'b) (A . B) 2)-------------------------------------------------------------------------------------- (step (funcall 'cons '(a b))) шаг 1 --> (FUNCALL 'CONS '(A B)) ; Входим в функцию funcall с аргументами 'cons и '(a b) Step 1 [12]> :s шаг 2 --> 'CONS ; Вычисление первого аргумента 'cons Step 2 [13]> :s шаг 2 ==> значение: CONS ; Результатом вычисления будет просто cons шаг 2 --> '(A B) ; Вычисление второго аргумента '(a b) Step 2 [14]> :s шаг 2 ==> значение: (A B) ; Результатом вычисления будет (a b) *** - APPLY: слишком мало аргументов для CONS ; Неудачная попытка функции funcall Имеются следующие варианты продолжения: ; применить функцию cons к аргументу (a b) ABORT :R1 Прервать главный цикл ; Дело в том, что в отличии от функции apply, ; которая "скармливает" аргументы для cons ; оптом, в списке (a b), см. выше, ; функция funcall "скармливает" аргументы для cons ; в розницу, "в рассыпуху". Нужно два аргумента, ; а по факту один - (a b). ; Чтобы выражение сработало, нужно аргументы для cons записать по отдельности: (funcall 'cons 'a 'b) (A . B) 3)--------------------------------------------------------------------------------------- (step (funcall 'apply 'cons '(a b))) шаг 1 --> (FUNCALL 'APPLY 'CONS '(A B)) ; Входим в функцию funcall с аргументами 'apply 'cons '(a b) Step 1 [18]> :s шаг 2 --> 'APPLY ; Вычисление первого аргумента 'apply Step 2 [19]> :s шаг 2 ==> значение: APPLY ; Результатом будет просто apply шаг 2 --> 'CONS ; Вычисление второго аргумента 'cons Step 2 [20]> :s шаг 2 ==> значение: CONS ; Результатом будет просто cons шаг 2 --> '(A B) ; Вычисление третьего аргумента '(a b) Step 2 [21]> :s шаг 2 ==> значение: (A B) ; Результатом будет просто (a b) шаг 1 ==> значение: (A . B) ; Функция funcall "скармливает" функции apply аргументы cons и (a b). (A . B) ; В свою очередь функция apply "скармливает" функции cons ; два аргумента в списке (a b). ; Результатом будет пара (a . b) 4)--------------------------------------------------------------------------------------- (step (funcall 'cons 'apply '(a b))) шаг 1 --> (FUNCALL 'CONS 'APPLY '(A B)) ; Входим в функцию funcall с аргументами 'cons 'apply и '(a b) Step 1 [23]> :s шаг 2 --> 'CONS ; Вычисление первого аргумента 'cons Step 2 [24]> :s шаг 2 ==> значение: CONS ; Результатом вычисления будет просто cons шаг 2 --> 'APPLY ; Вычисление второго аргумента 'apply Step 2 [25]> :s шаг 2 ==> значение: APPLY ; Результатом вычисления будет просто apply шаг 2 --> '(A B) ; Вычисление третьего аргумента '(a b) Step 2 [26]> :s шаг 2 ==> значение: (A B) ; Результатом вычисления будет просто (a b) шаг 1 ==> значение: (APPLY A B) ; Функция funcall "скармливает" функции cons (APPLY A B) ; аргументы apply и (a b). ; Функция cons прицепляет символ apply к списку (a b). ; Результатом будет список (apply a b). ---------------------------------------------------------------- Ууууууфффффффффффффффффф
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д