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).
- ----------------------------------------------------------------
- Ууууууфффффффффффффффффф
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д