Какие интересные концепции есть в Лиспе? - Lisp
Формулировка задачи:
В смысле, что бы еще попробовать реализовать. На Call-CC все засматриваюсь, но для начала надо понять что это вообще такое. F-expr (функции с ленивыми аргументами) - а нужны ли они? Если значения входящих аргументов можно заквотировать. Окружение, как объект первого класса? Но ведь можно его захватить замыканием и использовать когда надо.
Пока балуюсь подобными вещами, но это несложно:
defn f (i) (cond (< i 2) 1 (* i (f (- i 1)))) OK defn g (i a) (cond (< i 2) a (g (- i 1) (* i a))) OK tray f 3 1 <- (f 3) 2 <- f 2 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1))))) 2 <- (cond (< i 2) 1 (* i (f (- i 1)))) 3 <- (< i 2) 4 <- i 4 -> 3 3 -> false 3 <- (* i (f (- i 1))) 4 <- i 4 -> 3 4 <- (f (- i 1)) 5 <- f 5 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1))))) 5 <- (- i 1) 6 <- i 6 -> 3 5 -> 2 5 <- (cond (< i 2) 1 (* i (f (- i 1)))) 6 <- (< i 2) 7 <- i 7 -> 2 6 -> false 6 <- (* i (f (- i 1))) 7 <- i 7 -> 2 7 <- (f (- i 1)) 8 <- f 8 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1))))) 8 <- (- i 1) 9 <- i 9 -> 2 8 -> 1 8 <- (cond (< i 2) 1 (* i (f (- i 1)))) 9 <- (< i 2) 10 <- i 10 -> 1 9 -> true 8 -> 1 7 -> 1 6 -> 2 5 -> 2 4 -> 2 3 -> 6 2 -> 6 1 -> 6 6 tray g 3 1 1 <- (g 3 1) 2 <- g 2 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a)))) 2 <- (cond (< i 2) a (g (- i 1) (* i a))) 3 <- (< i 2) 4 <- i 4 -> 3 3 -> false 3 <- (g (- i 1) (* i a)) 4 <- g 4 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a)))) 4 <- (- i 1) 5 <- i 5 -> 3 4 -> 2 4 <- (* i a) 5 <- i 5 -> 3 5 <- a 5 -> 1 4 -> 3 3 -> FUNCALL: {a=3, i=2} 2 -> FUNCALL: {a=3, i=2} 2 <- (cond (< i 2) a (g (- i 1) (* i a))) 3 <- (< i 2) 4 <- i 4 -> 2 3 -> false 3 <- (g (- i 1) (* i a)) 4 <- g 4 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a)))) 4 <- (- i 1) 5 <- i 5 -> 2 4 -> 1 4 <- (* i a) 5 <- i 5 -> 2 5 <- a 5 -> 3 4 -> 6 3 -> FUNCALL: {a=6, i=1} 2 -> FUNCALL: {a=6, i=1} 2 <- (cond (< i 2) a (g (- i 1) (* i a))) 3 <- (< i 2) 4 <- i 4 -> 1 3 -> true 3 <- a 3 -> 6 2 -> 6 1 -> 6 6
Решение задачи: «Какие интересные концепции есть в Лиспе?»
textual
Листинг программы
(loop for i upto 10 collecting i) (loop for i upto 10 collect i)
Объяснение кода листинга программы
- В данном коде используется цикл loop, который выполняет блок кода для каждого значения переменной i от 0 до 10.
- В первом примере цикла loop, переменная i будет собираться (collected) в результате выполнения цикла.
- Во втором примере цикла loop, переменная i также будет собираться в результате выполнения цикла, но на этот раз без присвоения значения.
- В обоих примерах цикл loop выполняется 10 раз, перебирая значения i от 0 до 9.
- В обоих примерах переменная i является неявной (implicit) переменной, которая автоматически создается и используется в цикле loop.
- В обоих примерах переменная i не является аккумулятором (accumulator), поскольку ее значение не сохраняется между итерациями цикла.
- В обоих примерах переменная i не является счетчиком (counter), поскольку она не инкрементируется или декрементируется внутри цикла.
- В обоих примерах переменная i не является индексом (index), поскольку она не используется для доступа к элементам массива или коллекции.
- В обоих примерах переменная i не является условием (condition), поскольку она не используется для проверки условия в цикле.
- В обоих примерах переменная i не является результатом (result), поскольку она не используется для возврата значения из цикла.
- В обоих примерах переменная i не является параметром (parameter), поскольку она не передается в функцию или метод.
- В обоих примерах переменная i не является локальной (local) переменной, поскольку она не объявлена внутри функции или метода.
- В обоих примерах переменная i не является глобальной (global) переменной, поскольку она не объявлена вне любой функции или метода.
- В обоих примерах переменная i не является переменной окружения (environment variable), поскольку она не используется для доступа к переменным операционной системы.
- В обоих примерах переменная i не является переменной контекста (context variable), поскольку она не используется для доступа к переменным, специфичным для определенного контекста.
- В обоих примерах переменная i не является переменной управления (control variable), поскольку она не используется для управления потоком выполнения программы.
- В обоих примерах переменная i не является переменной-счетчиком (counter variable), поскольку она не используется для подсчета или инкрементации.
- В обоих примерах переменная i не является переменной-массивом (array variable), поскольку она не используется для хранения или доступа к элементам массива.
- В обоих примерах переменная i не является переменной-список (list variable), поскольку она не используется для хранения или доступа к элементам списка.
- В обоих примерах переменная i не является переменной-строкой (string variable), поскольку она не используется для хранения или доступа к элементам строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д