Mapcar функции из файла - Lisp
Формулировка задачи:
Написать программу ввода списка имен функций, ввода списка данных и получения списка результатов, используя функцию mapcar. Результат записать в текстовый файл и вывести на экран.Имена функций и данные вводить из файла. Функции следующие: rtos, setq, sqrt, strcat. Количество и последовательность вызываемых функций может быть различной.
Пишет ошибки с функциями rtos, setq, и др.
Вот пытался сделать и не работает = (
В тектсовом файле такая запись
Листинг программы
- (defun Lab5_11(inputFileName outputFileName)
- (setq inputFile (open inputFileName))
- (setq outputFile (open outputFileName :direction :output))
- (setq funcList (read inputFile))
- (dolist (funcName funcList)
- (setq argList (read inputFile))
- (cond
- ((or (eq funcName 'setq) (eq funcName 'strca))
- (setq args (list 'mapcar (list 'quote funcName) (list 'quote argList)))
- )
- ((or (eq funcName 'rtos) (eq funcName 'eq))
- (setq args (list 'mapcar (list 'quote funcName)))
- (dolist (arg argList)
- (setq quotedArg (list 'quote arg))
- (setq args (append args (list quotedArg)))
- )
- )
- )
- (princ args)(princ " => ")
- (princ args outputFile)(princ " => " outputFile)
- (setq result (eval args))
- (princ result)(terpri)
- (princ result outputFile)(terpri outputFile)
- )
- (close outputFile)
- (close inputFile)
- )
- ; (load "D:/C1/Lab5_11.lisp")
- ; (Lab5_11 "D:/C1/Lab5_11_Input.txt" "D:/C1/Lab5_11_Output.txt")
Листинг программы
- (rtos setq sqrt strcat)
- ((17.5 1 4) (17.5 2 3) (17.5 3 1))
- (x '(a b))
- ((sqrt 4)(sqrt 9)(sqrt 25))
- (("a" "bout") ("a" "b" "c") ("a" "" "c"))
Решение задачи: «Mapcar функции из файла»
textual
Листинг программы
- (defun f-mapcar (flist fdata fres)
- (let ((f-l (gensym 'f))
- (f-d (gensym 'f))
- (f-r (gensym 'f))
- (fl nil)
- (fd nil))
- (filOpen f-l flist _INPUT)
- (setq fl (input (filGetLine f-l)))
- (filClose f-l)
- (filOpen f-d fdata _INPUT)
- (setq fd (input (filGetLine f-d)))
- (filClose f-d)
- (filOpen f-r fres _OUTPUT)
- (filPutLine f-r (output (mapcar (lambda (f a) (if (listp a) (apply f a) (funcall f a))) fl fd)))
- (filClose f-r)))
- (f-mapcar "f-l.txt" "f-d.txt" "f-r.txt")
- ==> T
Объяснение кода листинга программы
Данный код представляет собой функцию f-mapcar
, которая принимает три аргумента: flist
, fdata
и fres
.
Внутри функции создаются три вспомогательные переменные:
f-l
- для чтения данных из файлаflist
.f-d
- для чтения данных из файлаfdata
.f-r
- для записи результатов в файлfres
. Далее, функция открывает файлflist
для чтения, считывает первую строку и закрывает его. Аналогично, функция открывает файлfdata
для чтения, считывает первую строку и закрывает его. Затем, функция открывает файлfres
для записи и записывает в него результат применения функцииmapcar
к первой строке файлаflist
и первой строке файлаfdata
. Наконец, функция закрывает файлfres
и возвращаетT
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д