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).
----------------------------------------------------------------
Ууууууфффффффффффффффффф

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5