Какие интересные концепции есть в Лиспе? - Lisp

Узнай цену своей работы

Формулировка задачи:

В смысле, что бы еще попробовать реализовать. На Call-CC все засматриваюсь, но для начала надо понять что это вообще такое. F-expr (функции с ленивыми аргументами) - а нужны ли они? Если значения входящих аргументов можно заквотировать. Окружение, как объект первого класса? Но ведь можно его захватить замыканием и использовать когда надо.
Пока балуюсь подобными вещами, но это несложно:
Листинг программы
  1. defn f (i) (cond (< i 2) 1 (* i (f (- i 1))))
  2. OK
  3. defn g (i a) (cond (< i 2) a (g (- i 1) (* i a)))
  4. OK
  5. tray f 3
  6. 1 <- (f 3)
  7. 2 <- f
  8. 2 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1)))))
  9. 2 <- (cond (< i 2) 1 (* i (f (- i 1))))
  10. 3 <- (< i 2)
  11. 4 <- i
  12. 4 -> 3
  13. 3 -> false
  14. 3 <- (* i (f (- i 1)))
  15. 4 <- i
  16. 4 -> 3
  17. 4 <- (f (- i 1))
  18. 5 <- f
  19. 5 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1)))))
  20. 5 <- (- i 1)
  21. 6 <- i
  22. 6 -> 3
  23. 5 -> 2
  24. 5 <- (cond (< i 2) 1 (* i (f (- i 1))))
  25. 6 <- (< i 2)
  26. 7 <- i
  27. 7 -> 2
  28. 6 -> false
  29. 6 <- (* i (f (- i 1)))
  30. 7 <- i
  31. 7 -> 2
  32. 7 <- (f (- i 1))
  33. 8 <- f
  34. 8 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1)))))
  35. 8 <- (- i 1)
  36. 9 <- i
  37. 9 -> 2
  38. 8 -> 1
  39. 8 <- (cond (< i 2) 1 (* i (f (- i 1))))
  40. 9 <- (< i 2)
  41. 10 <- i
  42. 10 -> 1
  43. 9 -> true
  44. 8 -> 1
  45. 7 -> 1
  46. 6 -> 2
  47. 5 -> 2
  48. 4 -> 2
  49. 3 -> 6
  50. 2 -> 6
  51. 1 -> 6
  52. 6
  53. tray g 3 1
  54. 1 <- (g 3 1)
  55. 2 <- g
  56. 2 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a))))
  57. 2 <- (cond (< i 2) a (g (- i 1) (* i a)))
  58. 3 <- (< i 2)
  59. 4 <- i
  60. 4 -> 3
  61. 3 -> false
  62. 3 <- (g (- i 1) (* i a))
  63. 4 <- g
  64. 4 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a))))
  65. 4 <- (- i 1)
  66. 5 <- i
  67. 5 -> 3
  68. 4 -> 2
  69. 4 <- (* i a)
  70. 5 <- i
  71. 5 -> 3
  72. 5 <- a
  73. 5 -> 1
  74. 4 -> 3
  75. 3 -> FUNCALL: {a=3, i=2}
  76. 2 -> FUNCALL: {a=3, i=2}
  77. 2 <- (cond (< i 2) a (g (- i 1) (* i a)))
  78. 3 <- (< i 2)
  79. 4 <- i
  80. 4 -> 2
  81. 3 -> false
  82. 3 <- (g (- i 1) (* i a))
  83. 4 <- g
  84. 4 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a))))
  85. 4 <- (- i 1)
  86. 5 <- i
  87. 5 -> 2
  88. 4 -> 1
  89. 4 <- (* i a)
  90. 5 <- i
  91. 5 -> 2
  92. 5 <- a
  93. 5 -> 3
  94. 4 -> 6
  95. 3 -> FUNCALL: {a=6, i=1}
  96. 2 -> FUNCALL: {a=6, i=1}
  97. 2 <- (cond (< i 2) a (g (- i 1) (* i a)))
  98. 3 <- (< i 2)
  99. 4 <- i
  100. 4 -> 1
  101. 3 -> true
  102. 3 <- a
  103. 3 -> 6
  104. 2 -> 6
  105. 1 -> 6
  106. 6

Решение задачи: «Какие интересные концепции есть в Лиспе?»

textual
Листинг программы
  1. (loop for i upto 10 collecting i)
  2. (loop for i upto 10 collect i)

Объяснение кода листинга программы

  1. В данном коде используется цикл loop, который выполняет блок кода для каждого значения переменной i от 0 до 10.
  2. В первом примере цикла loop, переменная i будет собираться (collected) в результате выполнения цикла.
  3. Во втором примере цикла loop, переменная i также будет собираться в результате выполнения цикла, но на этот раз без присвоения значения.
  4. В обоих примерах цикл loop выполняется 10 раз, перебирая значения i от 0 до 9.
  5. В обоих примерах переменная i является неявной (implicit) переменной, которая автоматически создается и используется в цикле loop.
  6. В обоих примерах переменная i не является аккумулятором (accumulator), поскольку ее значение не сохраняется между итерациями цикла.
  7. В обоих примерах переменная i не является счетчиком (counter), поскольку она не инкрементируется или декрементируется внутри цикла.
  8. В обоих примерах переменная i не является индексом (index), поскольку она не используется для доступа к элементам массива или коллекции.
  9. В обоих примерах переменная i не является условием (condition), поскольку она не используется для проверки условия в цикле.
  10. В обоих примерах переменная i не является результатом (result), поскольку она не используется для возврата значения из цикла.
  11. В обоих примерах переменная i не является параметром (parameter), поскольку она не передается в функцию или метод.
  12. В обоих примерах переменная i не является локальной (local) переменной, поскольку она не объявлена внутри функции или метода.
  13. В обоих примерах переменная i не является глобальной (global) переменной, поскольку она не объявлена вне любой функции или метода.
  14. В обоих примерах переменная i не является переменной окружения (environment variable), поскольку она не используется для доступа к переменным операционной системы.
  15. В обоих примерах переменная i не является переменной контекста (context variable), поскольку она не используется для доступа к переменным, специфичным для определенного контекста.
  16. В обоих примерах переменная i не является переменной управления (control variable), поскольку она не используется для управления потоком выполнения программы.
  17. В обоих примерах переменная i не является переменной-счетчиком (counter variable), поскольку она не используется для подсчета или инкрементации.
  18. В обоих примерах переменная i не является переменной-массивом (array variable), поскольку она не используется для хранения или доступа к элементам массива.
  19. В обоих примерах переменная i не является переменной-список (list variable), поскольку она не используется для хранения или доступа к элементам списка.
  20. В обоих примерах переменная i не является переменной-строкой (string variable), поскольку она не используется для хранения или доступа к элементам строки.

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


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

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

8   голосов , оценка 3.625 из 5

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

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

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