Задачи из этого списка даются в качестве индивидуальных заданий.
> (reachable '((1 2) (1 3) (4 1) (3 5)) 1)
(1 2 3 5)
> (diff 'x)
1
> (diff '(+ x (f x)))
(+ 1 (diff (f x)))
x
(например, (+ (sin x) (* 2 (sin x)) (* x x))
).
Приведите подобные члены.
> (evaluate '(1 * (2 + 3) - 4))
1
> (ticket '(1 2 5 7 2 1) 100)
(* (* (* 1 2) 5) (+ 7 (+ 2 1)))
eq
для двух равных целых чисел
начинает возвращать NIL
:> (eq 1 1)
T
> (eq (expt 10 20) (expt 10 20))
NIL
> (places '(vasya 1 50) '(petya 2 45) '(kolya 2 45) '(dima 2 30))
((dima 1) (kolya 2) (petya 2) (vasya 4))
socket-connect
,
socket-server
. Передавайте задания для вычисления и результаты в виде выражений LISP,
читайте при помощи read
. Пример клиента, отправляющего серверу S-выражение:
(let ((f (socket-connect PORT HOST))) (princ EXPR f) )Пример сервера, ожидающего подключение и читающего выражение от подключённого клиента:
(let ( (serv (socket-server PORT)) ) (let ( (f (socket-accept serv)) ) (read f) ) )На вход программе даётся список серверов для подключения (заранее запущенных) и S-выражение, которое рассматривается как вызов функции с N аргументами. На выходе — результат вычислений. Для проверки можно определить функцию
(defun slow (x) (sleep 5) x)
и попробовать замерить время вычисления
выражения (+ (slow 1) (slow 2) (slow 3))
в последовательном и параллельном вариантах. Время вычисления выражения expr
замеряется при помощи (time expr)
. (parallel '(("127.0.0.1" 12345) ("127.0.0.1" 12346)) '(+ (slow 1) (slow 2) (slow 3)))
*
и ?
(см. задачи по курсу ОС, задача 19).
1 2 3 4 5 6
3 5 1 2 4 6
Представьте данную подстановку в виде произведения независимых циклов. Для данного примера:
(1 3)(2 5 4)(6)
make-car-cdr
, которая вместо ввода дополнительной переменной Q
возвращает lambda
-выражение, извлекающее X
из S
:> (make-car-cdr '(1 (X) 2) 'X) ; возвращает (lambda (s) (car (car (cdr s))))
#<FUNCTION :LAMBDA (S) (CAR (CAR (CDR S)))>
Проверка:> (funcall (make-car-cdr '(1 (X) 2) 'X) '(1 (X) 2))
X
defun
.
Проблема здесь, очевидно, в том, что рекурсивная функция должна иметь возможность вызвать себя по имени, а имени у анонимной функции нет.funcall
. То есть, для вычисления факториала необходимо будет сделать
примерно такой вызов:> ((lambda (func n) ...) (lambda (func n) ...) 5) ; первый параметр — сама функция, второй параметр — аргумент факториала
120
reverse2
, используя только функции car
, cdr
, cons
,
рекурсивный вызов функции reverse2
и условные формы (if
или cond
). Не создавайте
вспомогательных функций, не добавляйте вспомогательных параметров к функции reverse2
.> (defun reverse2 (l) ...)
REVERSE2
> (reverse2 '(1 2 3))
(3 2 1)
Указание. Первым элементом развёрнутого списка будет являться последний элемент аргумента, который
можно вычислить выражением (car (reverse2 (cdr l)))
. Аналогичным образом
(но несколько более громоздким выражением) вычисляется хвост развёрнутого списка.make-increment
, принимающую параметром число x
и возвращающую анонимную
функцию (lambda-функцию), увеличивающую свой аргумент на число x
.
> (funcall (make-increment 5) 7)
12
AND
,
OR
и NOT
.> (check '(OR A (NOT A)))
T
> (check '(AND A B))
NIL