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. 1)----------------------------------------------------------------------------------------
  2. [3]> (step (apply 'cons '(a b)))
  3. шаг 1 --> (APPLY 'CONS '(A B))    ; Входим в функцию apply с аргументами 'cons и '(a b)
  4. Step 1 [4]> :s
  5. шаг 2 --> 'CONS                          ; Вычисление первого аргумента 'cons
  6. Step 2 [5]> :s
  7. шаг 2 ==> значение: CONS                 ; Результатом вычисления будет просто cons
  8. шаг 2 --> '(A B)                         ; Вычисление второго аргумента '(a b)
  9. Step 2 [6]> :s
  10. шаг 2 ==> значение: (A B)                ; Результатом вычисления будет (a b)        
  11. шаг 1 ==> значение: (A . B)       ; Функция apply применяет функцию cons к аргументам в списке (a b)
  12. (A . B)                           ; Результатом будет пара (a . b)
  13.  
  14. ; То же самое можно было написать проще:
  15. (cons 'a 'b)
  16. (A . B)
  17.  
  18. 2)--------------------------------------------------------------------------------------
  19. (step (funcall 'cons '(a b)))
  20. шаг 1 --> (FUNCALL 'CONS '(A B))    ; Входим в функцию funcall с аргументами 'cons и '(a b)
  21. Step 1 [12]> :s
  22. шаг 2 --> 'CONS                         ; Вычисление первого аргумента 'cons
  23. Step 2 [13]> :s
  24. шаг 2 ==> значение: CONS                ; Результатом вычисления будет просто cons
  25. шаг 2 --> '(A B)                        ; Вычисление второго аргумента '(a b)
  26. Step 2 [14]> :s
  27. шаг 2 ==> значение: (A B)               ; Результатом вычисления будет (a b)
  28. *** - APPLY: слишком мало аргументов для CONS    ; Неудачная попытка функции funcall
  29. Имеются следующие варианты продолжения:          ; применить функцию cons к аргументу (a b)
  30. ABORT          :R1      Прервать главный цикл    ; Дело в том, что в отличии от функции apply,
  31.                                                  ; которая "скармливает" аргументы для cons
  32.                                                  ; оптом, в списке (a b), см. выше,
  33.                                                  ; функция funcall "скармливает" аргументы для cons
  34.                                                  ; в розницу, "в рассыпуху". Нужно два аргумента,
  35.                                                  ; а по факту один - (a b).
  36. ; Чтобы выражение сработало, нужно аргументы для cons записать по отдельности:
  37. (funcall 'cons 'a 'b)
  38. (A . B)
  39.  
  40. 3)---------------------------------------------------------------------------------------
  41. (step (funcall 'apply 'cons '(a b)))
  42. шаг 1 --> (FUNCALL 'APPLY 'CONS '(A B))    ; Входим в функцию funcall с аргументами 'apply 'cons '(a b)
  43. Step 1 [18]> :s
  44. шаг 2 --> 'APPLY                                ; Вычисление первого аргумента 'apply
  45. Step 2 [19]> :s
  46. шаг 2 ==> значение: APPLY                       ; Результатом будет просто apply
  47. шаг 2 --> 'CONS                                 ; Вычисление второго аргумента 'cons
  48. Step 2 [20]> :s
  49. шаг 2 ==> значение: CONS                        ; Результатом будет просто cons
  50. шаг 2 --> '(A B)                                ; Вычисление третьего аргумента '(a b)
  51. Step 2 [21]> :s
  52. шаг 2 ==> значение: (A B)                       ; Результатом будет просто (a b)
  53. шаг 1 ==> значение: (A . B)                ; Функция funcall "скармливает" функции apply аргументы cons и (a b).
  54. (A . B)                                    ; В свою очередь функция apply "скармливает" функции cons
  55.                                            ; два аргумента в списке (a b).
  56.                                            ; Результатом будет пара (a . b)
  57.  
  58. 4)---------------------------------------------------------------------------------------
  59. (step (funcall 'cons 'apply '(a b)))
  60. шаг 1 --> (FUNCALL 'CONS 'APPLY '(A B))    ; Входим в функцию funcall с аргументами 'cons 'apply и '(a b)
  61. Step 1 [23]> :s
  62. шаг 2 --> 'CONS                        ; Вычисление первого аргумента 'cons
  63. Step 2 [24]> :s
  64. шаг 2 ==> значение: CONS               ; Результатом вычисления будет просто cons
  65. шаг 2 --> 'APPLY                       ; Вычисление второго аргумента 'apply
  66. Step 2 [25]> :s
  67. шаг 2 ==> значение: APPLY              ; Результатом вычисления будет просто apply
  68. шаг 2 --> '(A B)                       ; Вычисление третьего аргумента '(a b)
  69. Step 2 [26]> :s
  70. шаг 2 ==> значение: (A B)              ; Результатом вычисления будет просто (a b)
  71. шаг 1 ==> значение: (APPLY A B)             ; Функция funcall "скармливает" функции cons
  72. (APPLY A B)                                 ; аргументы apply и (a b).
  73.                                             ; Функция cons прицепляет символ apply к списку (a b).
  74.                                             ; Результатом будет список (apply a b).
  75. ----------------------------------------------------------------
  76. Ууууууфффффффффффффффффф

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут