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. Внутри функции создаются три вспомогательные переменные:

  1. f-l - для чтения данных из файла flist.
  2. f-d - для чтения данных из файла fdata.
  3. f-r - для записи результатов в файл fres. Далее, функция открывает файл flist для чтения, считывает первую строку и закрывает его. Аналогично, функция открывает файл fdata для чтения, считывает первую строку и закрывает его. Затем, функция открывает файл fres для записи и записывает в него результат применения функции mapcar к первой строке файла flist и первой строке файла fdata. Наконец, функция закрывает файл fres и возвращает T.

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


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

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

12   голосов , оценка 3.917 из 5