Часть 1. Введение в ООП

Тем: 3

Тема 1. Введение

Содержание

  1. Структура курса
    1. Лекции
    2. Языки
    3. Домашние задания
    4. Зачет
  2. Hello world
    1. Класс HelloWorld
    2. Метод класса main
    3. Минимальная версия
    4. Передача имени пользователя в командной строке
    5. Обработка нескольких имен пользователей
    6. Cоглашения об именовании
  3. Основные концепции Java
    1. Компилятор Java (javac)
    2. Байт-код и виртуальная машина Java (java)
    3. Java Runtime Environment
    4. JIT-компиляция
    5. Сборка мусора
    6. Редакции Java-платформы
      1. Micro Edition
      2. Standard Edition
      3. Enterprise Edition
    7. Cоглашения об именовании
  4. Соглашения о вызовах
    1. Вызов по значению
    2. Вызов по ссылке
    3. Вызов по имени
    4. Вызов по требованию
    5. Нормальный и аппликативный порядок вычислений

Домашнее задание 1. Хэширование

Хэширование
  1. Разработайте Java-программу CalcMD5, которая подсчитывает MD5-хэши файлов.
  2. Программа должна принимать один аргумент командной строки — имя файла, в котором содержатся имена файлов, для которых требуется подсчитать хэши. Файлы перечислены по одному на строке.
  3. Программа должна выдать на стандартный вывод MD5-хэши файлов в порядке их перечисления во входном файле. Хэши должны выдаваться в виде 32-значных шестнадцатеричных чисел.
  4. Например, если файл input.txt содержит только input.txt (9 символов), то при запуске java CalcMD5 input.txt, на консоль должно быть выведено A8546347050ADC932FBEC189DC9FD50D.
  5. Примечания.
    1. Стандартная библиотека Java содержит реализацию алгоритма MD5.
    2. Вы можете рассчитывать, что все файлы помещаются в память.
    3. Можно написать решение, состоящее из четырех содержательных строк.

Тесты к домашним заданиям

Слайды

HTML

Примеры

zip

Экзаменационные вопросы

  1. Редакции платформы Java. Версии платформы и языка Java. JDK и JRE.

Практические навыки

  1. Компиляция и запуск программ на Java.
  2. Реализация простых программ на Java.

Библиография

  1.  Основной сайт по Java
    Короткий адрес: java.sun.com
  2.  Загрузка JDK и JRE
  3.  Документация по Java Platform (версия 7)
  4.  Документация по стандартной библиотеке (версия 7)
  5.  Java Tutorial
  6.  The Java Language Specification, Third Edition
  7.  Code Conventions for the Java Programming Language
  8. Эккель Б. Философия Java
    Издание 4 переведено плохо (не хватает некоторых глав, есть ошибки). Издание 3 переведено хорошо, но оно устарело. Рекомендуется читать оригинал.
  9. Eckel B. Thinking in Java (4th edition)
  10. Шилдт Г. Полный справочник по Java SE 6
  11. Хорстманн К. С., Корнелл Г. Java 2. Библиотека профессионала, том 1. Основы

Тема 2. Программирование по контракту

Содержание

  1. Контракты кода
    1. Пред- и постусловия
    2. Операторы присваивания, композиции, ветвления, цикла
    3. Стратегии доказательств
  2. Контракты функций
    1. Чистые функции
    2. Хранимое состояние и инварианты

Слайды

HTML

Примеры

zip

Домашнее задание 2. Бинарный поиск

Бинарный поиск
  1. Реализуйте итеративный и рекурсивный варианты бинарного поиска в массиве.
  2. На вход подается целое число x и массив целых чисел a, отсортированный по невозрастанию. Требуется найти минимальное значение индекса i, при котором a[i] <= x.
  3. Для функций бинарного поиска и вспомогательных функций должны быть указаны, пред- и постусловия. Для реализаций методов должны быть приведены доказательства соблюдения контрактов в терминах троек Хоара.
  4. Интерфейс программы.
    • Имя основного класса — BinarySearch.
    • Первый аргумент командной строки — число x.
    • Последующие аргументы командной строки — элементы массива a.
  5. Пример запуска: java BinarySearch 3 5 4 3 2 1. Ожидаемый результат: 2.

Тема 3. Введение в ООП

Содержание

  1. Классы
    1. Инвариант класса
    2. Задачи инкапсуляции
  2. Интерфейсы
    1. Интерфейс как синтаксический контракт
    2. Интерфейс как семантический контракт
  3. Абстрактные базовые классы и наследование
    1. Устранение дублирования
    2. Вынос изменяемой логики в наследников

Слайды

HTML

Домашнее задание 3. Очередь на массиве

Очередь на массиве
  1. Найдите инвариант структуры данных «очередь». Определите функции, которые необходимы для реализации очереди. Найдите их пред- и постусловия.
  2. Реализуйте классы, представляющие циклическую очередь с применением массива.
    • Класс ArrayQueueModule должен реализовывать один экземпляр очереди с использованием переменных класса.
    • Класс ArrayQueueADT должен реализовывать очередь в виде абстрактного типа данных (с явной передачей ссылки на экземпляр очереди).
    • Класс ArrayQueue должен реализовывать очередь в виде класса (с неявной передачей ссылки на экземпляр очереди).
    • Должны быть реализованы следующие функции (процедуры) / методы:
      • enqueue – добавить элемент в очередь;
      • element – первый элемент в очереди;
      • dequeue – удалить и вернуть первый элемент в очереди;
      • size – текущий размер очереди;
      • isEmpty – является ли очередь пустой;
      • clear – удалить все элементы из очереди.
    • Инвариант, пред- и постусловия записываются в исходном коде в виде комментариев.
    • Обратите внимание на инкапсуляцию данных и кода во всех трех реализациях.
  3. Напишите тесты реализованным классам.

Домашнее задание 4. Очереди

Очереди
  1. Определите интерфейс очереди Queue и опишите его контракт.
  2. Реализуйте класс LinkedQueue — очередь на связном списке.
  3. Выделите общие части классов LinkedQueue и ArrayQueue в базовый класс AbstractQueue.

Домашнее задание 5. Вычисление выражений

Вычисление выражений
  1. Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide для вычисления выражений с одной переменной.
  2. Классы должны позволять составлять выражения вида
                    new Subtract(
                        new Multiply(
                            new Const(2),
                            new Variable("x")
                        ),
                        new Const(3)
                    ).evaluate(5)
                
    При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра методу evaluate (на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7.
  3. Для тестирования программы должен быть создан класс Main, который вычисляет значение выражения x2−2x+1, для x, заданного в командной строке.
  4. При выполнение задания следует обратить внимание на:
    • Выделение общего интерфейса создаваемых классов.
    • Выделение абстрактного базового класса для бинарных операций.

Примеры

zip

Экзаменационные вопросы

  1. Пре- и постусловия, инварианты
  2. Интерфейсы
  3. Абстрактные базовые классы
  4. Принцип подстановки Лисков

Практические навыки

  1. Реализация программ на Java с применением интерфейсов и абстрактных базовых классов

Часть 2. Java

Тем: 5

Тема 4. Синтаксис Java

Содержание

  1. Типы данных
    1. Примитивные типы данных
      1. Целочисленные типы
      2. Символьный тип
      3. Числа с плавающей точкой
      4. Обертки примитивных типов
    2. Ссылочные типы
      1. Массивы
        1. Объявления
        2. Литералы
        3. Как объекты
        4. Ковариантность
        5. Reification
      2. Объекты
        1. Класс String
        2. Метод toString
        3. Класс StringBuilder
  2. Операции
    1. Приоритеты
    2. Ассоциативность
  3. Операторы
    1. Простые
    2. Ветвления
    3. Циклы
    4. Переходы
  4. Структура исходного кода
    1. Заголовок
    2. Классы
    3. Интерфейсы
    4. Поля
    5. Конструкторы
    6. Методы
    7. Инициализаторы

Слайды

HTML

Домашнее задание 6. Разбор выражений

Разбор выражений
  1. Доработайте предыдущее домашнее задание, так что бы выражение строилось по записи вида
                    x * (x - 2)*x + 1
                
  2. В записи выражения могут встречаться: умножение *, деление /, сложение +, вычитание -, унарный минус -, целочисленные константы (в десятичной системе счисления, которые помещаются в 32-битный знаковый целочисленный тип), круглые скобки, переменные (x) и произвольное число пробельных символов в любом месте (но не внутри констант).
  3. Приоритет операторов, начиная с наивысшего
    1. унарный минус;
    2. умножение и деление;
    3. сложение и вычитание.
  4. Разбор выражений рекомендуется производить методом рекурсивного спуска. Алгоритм должен работать за линейное время.

Экзаменационные вопросы

  1. Типы данных
  2. Операции
  3. Операторы
  4. Структура исходного кода

Практические навыки

  1. Реализация программ на Java с применением интерфейсов и абстрактных базовых классов

Тема 5. Обработка ошибок и исключения

Содержание

  1. Методы обработки ошибок
    1. Не обрабатывать
    2. Коды возврата
    3. Установка флага ошибки
    4. Метод обработки ошибки
    5. Завершение программы
  2. Исключения
    1. Пример исключения
    2. Классификация исключений
      1. Проверяемые исключения
      2. Непроверяемые исключения
      3. Ошибки
    3. try-catch-finally
  3. Применение исключений
    1. Управление ресурсами
    2. Управление на исключениях
    3. Игнорирование исключений
  4. Разработка исключений
    1. Проверяемое или не проверяемое?
    2. Техника обертывания
  5. Исключения в Java 7+
    1. Try с ресурсами
    2. Обработка нескольких исключений одновременно
  6. Гарантии безопасности
    1. Отсутствие гарантий
    2. Отсутствие утечек
    3. Слабые гарантии
    4. Сильные гарантии
    5. Гарантия отсутствия исключений

Слайды

HTML

Домашнее задание 7. Обработка ошибок

Обработка ошибок
  1. Добавьте в программу вычисляющую выражения обработку ошибок, в том числе:
    • ошибки разбора выражений;
    • ошибки вычисления выражений.
  2. Для выражения 1000000*x*x*x*x*x/(x-1) вывод программы должен иметь следующий вид:
                    x       f
                    0       0
                    1       division by zero
                    2       32000000
                    3       121500000
                    4       341333333
                    5       overflow
                    6       overflow
                    7       overflow
                    8       overflow
                    9       overflow
                    10      overflow
                
    Результат division by zero (overflow) означает, что в процессе вычисления произошло деление на ноль (переполнение).
  3. При выполнении задания следует обратить внимание на дизайн и обработку исключений.
  4. Человеко-читаемые сообщения об ошибках должны выводится на консоль.
  5. Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).

Тема 6. Generics

Содержание

  1. Введение в Generics
    1. Полиморфизм и его типы
    2. Generics и templates
    3. Применение Generics
  2. Реализация Generics
    1. Wildcards и ограниченные wildcards
    2. Параметры типов и ограниченные параметры типов
    3. Ограничения Generics и reifables
  3. Generics и вариантность
    1. Ко- и контрвариантность
    2. Источники и приемники
    3. Правило выбора extends и super
  4. Смешение Generic и не Generic кода
    1. Стирание информации о типе и сырые типы
    2. Добавление информации о типе и UncheckedWarning

Слайды

HTML

Домашнее задание 8. Вычисление в различных типах

Вычисление в различных типах
  1. Добавьте в программу вычисляющую выражения поддержку различных типов.
    • Первым аргументом командной строки программа должна принимать указание на тип, в котором будут производится вычисления:
      ОпцияТип
      -iint
      -ddouble
      -biBigInteger
    • Реализация не должна содержать непроверяемых преобразований типов.
    • Реализация не должна использовать аннотацию @SuppressWarnings.
  2. При выполнении задания следует обратить внимание на легкость добавления новых типов и операциий.

Тема 7. Новые возможности Java 5

Содержание

  1. Autoboxing
    1. Примитивные типы и обертки
    2. Особенности autoboxing
  2. Расширенный цикл for
    1. Синтаксис
    2. Интерфейс Iterable
  3. Varargs и format
    1. Методы с переменным числом параметров
    2. Форматированный вывод
  4. Static Import

Слайды

HTML

Тема 8. Перечисления

Содержание

  1. Классы перечислений
  2. Операции с перечислениями
  3. Коллекции для перечислений

Слайды

HTML

Часть 3. Введение в JavaScript

Тем: 3

Тема 9. Функции

Содержание

  1. JavaScript и Java
    1. Появление и история JavaScript/ECMAScript
    2. Связь с Java
    3. Различия с Java
    4. Strict mode
  2. Переменные и типы
    1. Объявление переменных
    2. Типы значений
    3. Массивы
  3. Простые функции
    1. Синтаксис объвления
    2. Передача аргументов
    3. Способы вызова
  4. Функции высших порядков
    1. Примеры
      1. Сортировка
      2. Компараторы
      3. Составные компараторы
      4. Функциональные интерфейсы
    2. Комбинаторы
      1. foldLeft, foldRight
      2. map
      3. Композиция
      4. Карринг

Домашнее задание 9. Функциональные выражения на JavaScript

Функциональные выражения на JavaScript
  1. Разработайте функции cnst, variable, add, subtract, multiply, divide, negate для вычисления выражений с одной переменной.
  2. Функции должны позволять производить вычисления вида:
                    var expr = subtract(
                        multiply(
                            cnst(2),
                            variable("x")
                        ),
                        cnst(3)
                    );
                    println(expr(5));
                
    При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра функции expr (на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7.
  3. Тестовая программа должна вычислять выражение x2−2x+1, для x от 0 до 10.
  4. Усложненный вариант. Требуется написать функцию parse, осуществляющую разбор выражений, записанных в обратной польской записи. Например, результатом
    parse("x x 2 - * x * 1 +")(5)
    должно быть число 76.
  5. При выполнение задания следует обратить внимание на:
    • Применение функций высшего порядка.
    • Выделение общего кода для бинарных операций.

Библиография

  1.  ECMA-262 ECMAScript Language Specification 5.1 edition
  2.  Перевод ECMA-262 5.1 edition
  3.  Современный учебник JavaScript
  4. Д. Флэнаган JavaScript. Подробное руководство, 5 издание

Тема 10. Объекты и методы

Содержание

  1. Объекты
    1. Объекты как ассоциативные массивы
      1. Свойства
      2. Изменение свойств
      3. Неопределенные свойства
      4. Строки как индексы
      5. Сокращенная запись
      6. Проверка наличия свойства
      7. Перечисление свойств
    2. Наследование
      1. Создание объектов (Object.create)
      2. Получение прототипа (Object.getPrototypeOf)
      3. Наследование свойств
      4. Переопределение свойств
      5. Удаление свойств
    3. Методы
      1. Функции в свойствах
      2. Наследование функций
      3. Aliasing
      4. Неявная передача this
      5. Явная передача this
    4. Конструкторы
      1. Фабрики
      2. Конструкторы
      3. Прототипы в конструкторах
      4. Явное создание объекта и вызов конструктора
      5. Получение конструктора
  2. Замыкания
    1. Хранение состояния в замыкании
    2. Замыкание изменяемых переменных
    3. Трюк с объявлением промежуточной функции
    4. Общее состояние нескольких функций
  3. Модули
    1. Определение модуля
      1. Определение конструкторов
      2. Определение функций
    2. Использования модуля
      1. Прямое использование
      2. Импортирование
      3. Переменные класса

Домашнее задание 10. Объектные выражения на JavaScript

Объектные выражения на JavaScript
  1. Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide, Negate для представления выражений с одной переменной.
    1. Пример описания выражения 2x-3:
                              var expr = new Subtract(
                                  new Multiply(
                                      new Const(2),
                                      new Variable("x")
                                  ),
                                  new Const(3)
                              );
                          
    2. Метод evaluate(x) должен производить вычисления вида: При вычислении такого выражения вместо каждой переменной подставляется значение x, переданное в качестве параметра функции evaluate (на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7.
    3. Метод toString() должен выдавать запись выражения в обратной польской записи. Например, expr.toString() должен выдавать 2 x * 3 -.
  2. Усложненный вариант.
    Метод diff("x") должен возвращать выражение, представляющее производную исходного выражения по переменной x. Например, expr.diff("x") должен возвращать выражение, эквивалентное new Const(2) (выражения new Subtract(new Const(2), new Const(0)) и
                        new Subtract(
                            new Add(
                                new Multiply(new Const(0), new Variable("x")),
                                new Multiply(new Const(2), new Const(1))
                            )
                            new Const(0)
                        )
                     
    так же будут считаться правильным ответом).

    Функция parse должна выдавать разобранное объектное выражение.

  3. Бонусный вариант. Требуется написать метод simplify(), производящий вычисления константных выражений. Например,
    parse("x x 2 - * 1 *").diff("x").simplify().toString()
    должно возвращать «x x 2 - +».
  4. При выполнение задания следует обратить внимание на:
    • Применение инкапсуляции.
    • Выделение общего кода для операций.

Тема 11. Что еще есть в JavaScript

Содержание

  1. Обработка ошибок
    1. Стандартные ошибки
    2. Try-catch-finally
    3. Что можно бросить
    4. Пользовательские исключения
  2. Нет такой вещи как...
    1. Глобальные переменные
    2. Предопределенные значения
    3. Блочные переменные
    4. Реализация замыканий
  3. Стандартная библиотека
    1. Основные типы
    2. Основные функции
      1. eval
      2. parseInt/Float
      3. isNaN/Finite
    3. Составные типы
      1. Объекты
      2. Функции
      3. Массивы
      4. Строки
      5. Boolean
      6. Number
      7. Date
      8. RegExp
    4. Встроенные ошибки
      1. Error
      2. RangeError
      3. ReferenceError
      4. SyntaxError
      5. TypeError
      6. URIError
    5. Наборы функций
      1. Math
      2. JSON
  4. Свойства
    1. Определение свойств
    2. Атрибуты свойств: enumerable, writable, configurable
    3. Атрибуты свойств: value, get, set
    4. Атрибуты объектов: extensible, seal/isSealed, freeze/isFrozen

Домашнее задание 11. Обработка ошибок на JavaScript

Обработка ошибок на JavaScript
  1. Добавьте в предыдущее домашнее задание функцию parsePrefix(string), разбирающую выражения, задаваемые записью вида (- (* 2 x) 3). Если разбираемое выражение некорректно, метод parsePrefix должен бросать человеко-читаемое сообщение об ошибке.
  2. Добавьте в предыдущее домашнее задание метод prefix(), выдающий выражение в формате, ожидаемом функцией parsePrefix.
  3. При выполнение задания следует обратить внимание на:
    • Применение инкапсуляции.
    • Выделение общего кода для бинарных операций.
    • Обработку ошибок.
    • Минимизацию необходимой памяти.

Часть 4. Введение в Clojure

Тем: 3

Тема 12. Функции

Содержание

  1. Выражения и переменные
    1. Константы
    2. Функции
      1. Фиксированной арности
      2. Произвольной арности
    3. Переменные
      1. Определение
      2. Функции как значения
    4. Примитивные типы
    5. Приведение типов
  2. Функции
    1. Определение функции
    2. Рекурсивные функции
      1. Общая рекурсия
      2. Хвостовая рекурсия
      3. Оптимизация хвостовой рекурсии
    3. Контракты
  3. Списки
    1. Литералы
    2. Создание
    3. Операции
    4. Проверки
    5. Свертки
  4. Вектора
    1. Литералы
    2. Создание
    3. Операции
    4. Проверки
    5. Свертки
  5. Стандартные функции

Домашнее задание 12. Линейная алгебра на Clojure

Линейная алгебра на Clojure
  1. Разработайте функции для работы с объектами линейной алгебры, которые представляются следующим образом:
    • скаляры – числа
    • векторы – векторы чисел;
    • матрицы – векторы векторов чисел.
  2. Функции над векторами:
    • v+/v-/v* – покоординатное сложение/вычитание/умножение;
    • scalar/vect – скалярное/векторное произведение;
    • v*s – умножение на скаляр.
  3. Функции над матрицами:
    • m+/m-/m* – поэлементное сложение/вычитание/умножение;
    • m*s – умножение на скаляр;
    • m*v – умножение на вектор;
    • m*m – матричное умножение;
    • transpose – траспонирование;
  4. Усложненный вариант.
    1. Ко всем функциям должны быть указаны контракты. Например, нельзя складывать вектора разной длины.
    2. Все функции должны поддерживать произвольное число аргументов. Например (v+ [1 2] [3 4] [5 6]) должно быть равно [9 12].
  5. При выполнение задания следует обратить внимание на:
    • Применение функций высшего порядка.
    • Выделение общего кода для операций.

Тема 13. Внешний мир

Содержание

  1. Ввод-вывод
    1. Простейший ввод-вывод
    2. Работа с последовательностями событий
    3. Разбор ввода
  2. Разбор и гомоиконность
    1. Стандартный парсер
    2. Операции с кодом
    3. Исполнение сгенерированного кода
    4. Гомоиконность
  3. Подрядки вычисления
    1. Аппликативный
    2. Нормальный
    3. Ленивый
  4. Потоки
    1. Основные определения
    2. Операции с потоками
    3. Конечные потоки
    4. Бесконечные потоки
    5. Ленивые опследовательности
  5. Отображения и множества
    1. Литералы
    2. Создание
    3. Проверки
    4. Операции

Домашнее задание 13. Функциональные выражения на Clojure

Функциональные выражения на Clojure
  1. Разработайте функции constant, variable, add, subtract, multiply и divide для представления арифметических выражений.
    1. Пример описания выражения 2x-3:
                              (def expr 
                                (subtract
                                  (multiply 
                                    (constant 2) 
                                    (variable "x")) 
                                  (constant 3)))
    2. Выражение должно быть функцией, возвращающей значение выражение при подстановке элементов, заданных отображением. Например, (expr {"x" 2}) должно быть равно 1.
  2. Разработайте разборщик выражений, читающий выражения в стандартной для Clojure форме. Например,
    (parseFunction "(- (* 2 x) 3)")
    должно быть эквивалентно expr.
  3. Усложненный вариант. Функции add, subtract, multiply и должны принимать произвольное число аргументов. Разборщик так же должен допускать произвольное число аргументов для +, -, *.
  4. При выполнение задания следует обратить внимание на:
    • Выделение общего кода для операций.

Тема 14. Объекты

Содержание

  1. Объекты как структуры
    1. Поля и ассоциативные массивы
    2. Перебор полей
    3. Прототипы и наследование
    4. Object.create
    5. Массивы
  2. Методы и конструкторы
    1. Соглашения о вызове метода
    2. Использование методов
    3. Конструкторы
  3. Замыкания и икапсуляция
    1. Как работают замыкания
    2. Разделяемые замыкание
    3. Применение замыканий для инкапсуляции
  4. ООП
    1. Методы классов и экземпляров
    2. Наследование
    3. Иерархии классов
  5. Числа Чёрча

Домашнее задание 14. Объектные выражения на Clojure

Объектные выражения на Clojure
  1. Разработайте конструкторы Constant, Variable, Add, Subtract, Multiply и Divide для представления выражений с одной переменной.
    1. Пример описания выражения 2x-3:
                              (def expr 
                                (Subtract
                                  (Multiply
                                    (Constant 2)
                                    (Variable "x"))
                                  (Const 3)))
                          
    2. Функция (evaluate expression vars) должна производить вычисление выражения expression для значений переменных, заданных отображением vars. Например, (evaluate expr {"x" 2}) должно быть равно 1.
    3. Функция (toString expression) должна выдавать запись выражения в стандартной для Clojure форме.
    4. Функция (parseObject "expression") должна разбирать выражения, записанные в стандартной для Clojure форме. Например,
      (parseObject "(- (* 2 x) 3)")
      должно быть эквивалентно expr.
    5. Функция (diff expression "variable") должена возвращать выражение, представляющее производную исходного выражения по заданой пермененной. Например, (diff expression "x") должен возвращать выражение, эквивалентное (Constant 2), при этом выражения (Subtract (Const 2) (Const 0)) и
                              (Subtract
                                (Add
                                  (Multiply (Const 0) (Variable "x"))
                                  (Multiply (Const 2) (Const 1)))
                                (Const 0))
                          
      так же будут считаться правильным ответом.
  2. Усложненный вариант. Функция (parseObjectInfix "expression") должна разбирать выражения, записанные в инфиксной форме. Например,
    (parseObjectInfix "2 * x - 3")
    должно быть эквивалентно expr.
  3. При выполнение задания можно использовать любой способ преставления объектов.