6 янв. 2011 г.

LISP Разное


LISP Разное

Используется:
Clisp, Debian GNU/Linux

На просторах интернета достаточно много статей и книг об основах языка LISP. Собственно пару несколько лабораторных работ было и у нас в университете. Вот по материалу этих пары работ и пишется эта статья, как то что было для меня некоторой небольшой шпаргалкой.


Создание массива стоило был производить с помощью оператора make-array, но так как мне было лень прочесть книгу и я думал что основ для работы с матрицами мне будет достаточно, я по глупости, наверное использовал vector. Это несколько усложняет задачу, но зато как легко демонстрирует что с помощью основ выводятся более сложные функции.

Создание двумерного массива v:
(setf v (vector (setf a (vector 'a 'b 'c)) (setf b (vector 1 2 3)) (setf c(vector 4 5 6))))

Извлечение элемента из двумерного массива 2 элемента 2-й строки:
(aref (setf a (aref v 1)) 1)
Изменение элемента в двумерном массиве в 1 строке, 2 элемент(меняем на 7):
(setf (aref (setf a (aref v 0)) 1 ) 7)

Сложение элементов первого столбца:
(+ (aref (setf a (aref v 0))0) (aref (setf a (aref v 1))0) (aref (setf a (aref v 2))0))
Сложение элементов второго столбца:
(+ (aref (setf a (aref v 0))1) (aref (setf a (aref v 1))1) (aref (setf a (aref v 2))1))
Третьего:
(+ (aref (setf a (aref v 0))2) (aref (setf a (aref v 1))2) (aref (setf a (aref v 2))2))

Выбор минимального из трех значений:
(min
(setf a (+ (abs (aref (setf a (aref v 0))0)) (abs (aref (setf a (aref v 1))0)) (abs (aref (setf a (aref v 2))0))))
(setf b (+ (abs (aref (setf a (aref v 0))1)) (abs (aref (setf a (aref v 1))1)) (abs (aref (setf a (aref v 2))1))))
(setf c (+ (abs (aref (setf a (aref v 0))2)) (abs (aref (setf a (aref v 1))2)) (abs (aref (setf a (aref v 2))2))))
)

Сумма по столбцу :
(defun sumst(v i)
(setf a (+ (abs (aref (setf a (aref v 0))i)) (abs (aref (setf a (aref v 1))i)) (abs (aref (setf a (aref v 2))i))))
)

Определение в каком столбце максимальное значение по сумме элементов матрицы 3х3 :
(defun sumst(v i)
(setf a (+ (abs (aref (setf a (aref v 0))i)) (abs (aref (setf a (aref v 1))i)) (abs (aref (setf a (aref v 2))i))))
)
(defun maxsum(v)
(AND
(AND (setf sta (sumst v 0)) (setf stb (sumst v 1)) (setf stc (sumst v 2)) )
(and (setf mx (max sta stb stc)) (print mx))
(or (and (eq sta mx) (print "1_stolbec"))
(and (eq stb mx) (print "2_stolbec"))
(and (eq stc mx) (print "3_stolbec")))
)
)

Цикл на подобии for:
(dotimes (i 10) (print i))

Вывод:
0
1
2
3
4
5
6
7
8
9
NIL
Инкрементируем q три раза (q должно быть предопределено как числовое значение предварительно) :
(dotimes (i 3)
(setf q (+ 1 q))
)

Загрузка данных с файла:
(setf vvod (open “input.dat” :direction :input))
Выгрузка данных в файл:
(setf vivod (open “output.dat” :direction :output))

Собственно такая маленькая статейка, которая возможно хоть немного даст понимания некоторой части и логики языка LISP. Если будет больше времени, постараюсь выложить более полноценную статью по этому языку. Если кому помогло — хорошо, нет — ищите более подробные статьи или учебники.

Комментариев нет:

Отправить комментарий