Вызов функции | MetodPro.ru

Реклама на сайте

Вызов функции


представляет собой список из n+1 элементов, на первом месте которого стоит имя вызываемой функции, а на последующих n местах аргументы или фактические параметры.

(dlin (quote (4 3 (7 8))))

Анализ синтаксических конструкции языка РЛИ всегда является ключевое слово или определенная пользователем функция, которые применяются к соответствующим аргументам.

Денотационная семантика – это формальная аппликативная модель для описания ЯП. Основной концепцией денотационной семантики является определение для каждой сущности языка некоторой функции и некоторого математического объекта. Эта функция отображает каждую сущность языка в экземпляры этого объекта. Денотационная семантики языка РЛИ описывает переходы, имеющие место при выполнении программного сегмента, содержащего некоторую синтаксическую конструкцию. Состояние выполняемой программы в каждый момент времени определяется вычислительной обстановкой или окружением. Обозначим окружение через σ. Тогда денотационная семантика языка РЛИ будет выглядеть следующим образом:

1)    Переменные E[[x]]σ =not is_member (x, σ)              error

| σ(x)

2)    Константы E[[quote s]]σ = s

3)    Бинарные операции:

  • E[[(add e1 e2)]]σ = not is_num(E[[e1]]σ)               error

|not is_num(E[[e2]]σ)            error

| E[[e1]]σ + E[[e2]]σ

Чтобы вычислить бинарную операцию в текущем окружении σ предварительно необходимо найти значения аргументом в том же самом окружении и к полученным результатам применить бинарную операцию

  • E[[(sub e1 e2)]]σ = not is_num(E[[e1]]σ)               error

|not is_num(E[[e2]]σ)            error

| E[[e1]]σ - E[[e2]]σ

  • E[[(mul e1 e2)]]σ = not is_num(E[[e1]]σ)               error

|not is_num(E[[e2]]σ)            error

| E[[e1]]σ * E[[e2]]σ

  • E[[(dive e1 e2)]]σ = not is_num(E[[e1]]σ)               error

|not is_num(E[[e2]]σ)            error

| E[[e1]]σ div E[[e2]]σ

  • E[[(rem e1 e2)]]σ = not is_num(E[[e1]]σ)               error

|not is_num(E[[e2]]σ)            error

| E[[e1]]σ mod E[[e2]]σ

  • E[[(leg e1 e2)]]σ = not is_num(E[[e1]]σ)               error

|not is_num(E[[e2]]σ)            error

| E[[e1]]σ <= E[[e2]]σ

  • E[[(equal e1 e2)]]σ = not is_atom (E[[e1]]σ) &

     Not is_atom(E[[e2]]σ)                 error

  | E[[e1]]σ = E[[e2]]σ

  • E[[(cons e1 e2)]]σ = not is_cons (E[[e2]]σ)             error

                               | cons(E[[e1]]σ, E[[e2]]σ)

4)    Унарные операции. Чтобы вычислит унарное выражение в окружении σ, сначала необходимо вычислит аргумент в том же самом окружении и к полученному результату применить унарную операцию

Атом: E[[(atom e)]]σ = is_atom(E[[e]]σ)             

Car: E[[(car e)]]σ = not is_cons(E[[e]]σ)             error

                             | hd(E[[e]]σ)

CDR : E[[(cdr e)]]σ = not is_cons(E[[e]]σ)         error

                             | tl(E[[e]]σ)

5)    Условные выражения

E[[(cond e1 e2 e3)]]σ = not is_bool (E[[e1]]σ)          error

                                      | not E[[e1]]σ                 error

                                     | E[[e2]]σ

Сначала вычисляется выражение e1, если оно не является булевской функцией, то возникает ошибка, если вычисленное условие не истинно, то вычисляется значение выражения e3  в текущем окружении σ и его значение возвращается в качестве результата всей операции cont. В противном случае вычисляется значение выражения e2  в текущем окружении σ.

E [[(e e1 e2 ek)]]σ = not arity(e) = k            error

                                                      | E[[e]]σ (E[[e1]]σ, E[[e2]]σ,…, E[[ek]]σ)

Тело функции e должно быть определено ранее в виде лямбда – выражения. Определение функции E определяется в текущем окружении.  Аргументы функции E также вычисляются в окружении σ. В дальнейшем значение функции e будет применяться к вычисленным значениям аргументов. Если количество фактических параметров не совпадает с количеством запрашиваемых, то возникает ошибка.

E [[(lambda (x1…xk)e)]]σ = λ(v1…vk) E[[e]](σ[v1/x1…vk/xk])

Лямбда определение применяется к определениям, которые вычислены путем текстуальной замены. Количество аргументов сохраняется и используется затем при вызове функции.

E[[(let e(x1 e1)…(xk ek))]]σ = E[[(lambda (x1…xk) e)]]σ (E[[e1]]σ…E[[ek]]σ)

Аргументы e1 – ek вычисляются в исходном окружении σ и до подстановки в тело функции E.Функция E вычисляется в окружении, расширенном за счет вычисленных значений параметров e1 – ek. Если список параметров e1 – ek обозначить через Z, то расширенное значение σ+ = Zσ.

E[[(letrec e(x1 e1)…(xk ek))]]σ = E[[let e (x1…xk) = Y(λx1.e1…λxk.ek)]] σ

Поскольку выражения e1- ek могут быт взаимно – рекурсивными, то для их вычисления необходимо окружение, расширенное за счет вычисленных выражений e1 – ek. Тело функции E также вычисляется в расширенном окружении.



Методические пособия

  • Системы автоматизированного проектирования
  • Социология молодёжи
  • Общая социология
  • Криптография
  • Проектирование трансляторов
  • Компьютерная графика
  • Моделирование систем
  • Информационная безопасность
  • Теория вычислительных процессов
  • Логические основы искусственного интелекта
  • Проектирование распределённых информационных систем