Lisp ошибка лишняя закрывающая скобка на входе

The prompt is to define a procedure that returns the sum of the squares of the two largest of three numbers.

I know this isn’t exactly an elegant solution, but this is what I hacked together:

(define (largest-of-two-sum-of-squares x y z)
        (cond ((and (< x y) (< x z)) (sum-of-squares y z))
              ((and (< y z) (< y x)) (sum-of-squares x z))
              ((and (< z x) (< z y)) (sum-of-squares x y)))))

What I’m wondering is why I’m getting an error.

;The object 85 is not applicable

The number that follows the word object is always the correct answer, btw. I am a scheme beginner, it must be something in my syntax?

Thanks

asked Mar 10, 2012 at 17:10

Mike's user avatar

2

Here’s another possible solution, this one works even in the cases where all three numbers are equal or if two are equal and lower than the other:

(define (sum-max a b c)
  (define (sum x y)
    (+ (* x x) (* y y)))
  (if (>= a b)
      (if (>= b c)
          (sum a b)
          (sum a c))
      (if (>= a c)
          (sum b a)
          (sum b c))))

answered Mar 10, 2012 at 17:36

Óscar López's user avatar

Óscar LópezÓscar López

230k37 gold badges309 silver badges383 bronze badges

1

As sindikat pointed out, an excess closing bracket. Sorry about that.

answered Mar 10, 2012 at 17:18

Mike's user avatar

MikeMike

9534 gold badges15 silver badges38 bronze badges

1

What about

(define (largest-of-two-sum-of-squares x y z)
    (+ (square x) (square y) (square z)
       (- (square (min x y z)))))

?

answered Mar 11, 2012 at 22:17

6502's user avatar

65026502

111k15 gold badges159 silver badges263 bronze badges

1

The prompt is to define a procedure that returns the sum of the squares of the two largest of three numbers.

I know this isn’t exactly an elegant solution, but this is what I hacked together:

(define (largest-of-two-sum-of-squares x y z)
        (cond ((and (< x y) (< x z)) (sum-of-squares y z))
              ((and (< y z) (< y x)) (sum-of-squares x z))
              ((and (< z x) (< z y)) (sum-of-squares x y)))))

What I’m wondering is why I’m getting an error.

;The object 85 is not applicable

The number that follows the word object is always the correct answer, btw. I am a scheme beginner, it must be something in my syntax?

Thanks

asked Mar 10, 2012 at 17:10

Mike's user avatar

2

Here’s another possible solution, this one works even in the cases where all three numbers are equal or if two are equal and lower than the other:

(define (sum-max a b c)
  (define (sum x y)
    (+ (* x x) (* y y)))
  (if (>= a b)
      (if (>= b c)
          (sum a b)
          (sum a c))
      (if (>= a c)
          (sum b a)
          (sum b c))))

answered Mar 10, 2012 at 17:36

Óscar López's user avatar

Óscar LópezÓscar López

230k37 gold badges309 silver badges383 bronze badges

1

As sindikat pointed out, an excess closing bracket. Sorry about that.

answered Mar 10, 2012 at 17:18

Mike's user avatar

MikeMike

9534 gold badges15 silver badges38 bronze badges

1

What about

(define (largest-of-two-sum-of-squares x y z)
    (+ (square x) (square y) (square z)
       (- (square (min x y z)))))

?

answered Mar 11, 2012 at 22:17

6502's user avatar

65026502

111k15 gold badges159 silver badges263 bronze badges

1

Подсказка состоит в том, чтобы определить процедуру, которая возвращает сумму квадратов двух наибольших из трех чисел.

Я знаю, что это не совсем элегантное решение, но это то, что я взломал вместе:

(define (largest-of-two-sum-of-squares x y z)
        (cond ((and (< x y) (< x z)) (sum-of-squares y z))
              ((and (< y z) (< y x)) (sum-of-squares x z))
              ((and (< z x) (< z y)) (sum-of-squares x y)))))

Мне интересно, почему я получаю сообщение об ошибке.

;The object 85 is not applicable

Кстати, число, которое следует за словом «объект», всегда является правильным ответом. Я новичок в схеме, это должно быть что-то в моем синтаксисе?

Благодарность

3 ответа

Вот еще одно возможное решение, оно работает даже в тех случаях, когда все три числа равны или если два равны и меньше другого:

(define (sum-max a b c)
  (define (sum x y)
    (+ (* x x) (* y y)))
  (if (>= a b)
      (if (>= b c)
          (sum a b)
          (sum a c))
      (if (>= a c)
          (sum b a)
          (sum b c))))


3

Óscar López
11 Мар 2012 в 18:29

Как указал синдикат, лишняя закрывающая скобка. Извини за это.


1

Mike
10 Мар 2012 в 21:18

Что о

(define (largest-of-two-sum-of-squares x y z)
    (+ (square x) (square y) (square z)
       (- (square (min x y z)))))

?


1

6502
12 Мар 2012 в 02:17

As other answers pointed out, #( is the syntax to represent the ( character. See section 2.4.8 Sharpsign. First the reader sees #, then dispatches on the next character, (backslash) which is used to read character objects. Your error message is thus saying that ) was unexpected in your input.

Error message

I was expecting some error message like umatched parenthesis.

This is basically what the error is saying, and other implementations like SBCL produce the message you expect. I am working from Emacs:

CL-USER> )

… enters the debugger with unmatched close parenthesis and a backtrace.

Let’s see why. Using GET-MACRO-CHARACTER, we ask our Common Lisp implementation to return the function associated with the #) character:

CL-USER> (get-macro-character #))
SB-IMPL::READ-RIGHT-PAREN
NIL

In Emacs, the resulting value is a shown as a presentation, which allows us to inspect it. You can also point the name of the function, and if your installation of SBCL allows it (e.g. you installed from source), you can go to the definition with M-.:

(defun read-right-paren (stream ignore)
  (declare (ignore ignore))
  (simple-reader-error stream "unmatched close parenthesis"))

The same with CLISP produces the error you see. We can also do:

CL-USER> (get-macro-character #))
#<SYSTEM-FUNCTION SYSTEM::RPAR-READER>
NIL

However the source definition for that system function is not so clear (if you are curious see the non-official mirror), but it is not surprising that another error message is displayed.

The read-table and how Lisp reads lists of expressions

The behavior depends on which functions is bound in the current readtable to the character being read.
All implementations signal an error in that case, because when you reach a point where you have to lookup into the readtable for a closing parenthesis, the input is necessarily badly formed. It is the job of a function like READ-DELIMITED-LIST, called from the function associated with the opening parenthesis, a.k.a. #(, to read until it find the corresponding closing parenthesis. Note that if you look-up the reader for #( in SBCL, it does not use read-delimited-list, but a different, specialized version. It is a little bit too long to post it here.

Quote and recursive reading

In your case, you also have quote. How does quote behave?

(defun read-quote (stream ignore)
  (declare (ignore ignore))
  (list 'quote (read stream t nil t)))

It builds a list starting with quote and containing a sub-expression obtained by calling READ recursively. This is just as above, when I entered a closing parenthesis at the REPL prompt. Since we are not currently in the context of an open parenthesis, we encounter the #) character, look it up in the readtable and signal an error.

As other answers pointed out, #( is the syntax to represent the ( character. See section 2.4.8 Sharpsign. First the reader sees #, then dispatches on the next character, (backslash) which is used to read character objects. Your error message is thus saying that ) was unexpected in your input.

Error message

I was expecting some error message like umatched parenthesis.

This is basically what the error is saying, and other implementations like SBCL produce the message you expect. I am working from Emacs:

CL-USER> )

… enters the debugger with unmatched close parenthesis and a backtrace.

Let’s see why. Using GET-MACRO-CHARACTER, we ask our Common Lisp implementation to return the function associated with the #) character:

CL-USER> (get-macro-character #))
SB-IMPL::READ-RIGHT-PAREN
NIL

In Emacs, the resulting value is a shown as a presentation, which allows us to inspect it. You can also point the name of the function, and if your installation of SBCL allows it (e.g. you installed from source), you can go to the definition with M-.:

(defun read-right-paren (stream ignore)
  (declare (ignore ignore))
  (simple-reader-error stream "unmatched close parenthesis"))

The same with CLISP produces the error you see. We can also do:

CL-USER> (get-macro-character #))
#<SYSTEM-FUNCTION SYSTEM::RPAR-READER>
NIL

However the source definition for that system function is not so clear (if you are curious see the non-official mirror), but it is not surprising that another error message is displayed.

The read-table and how Lisp reads lists of expressions

The behavior depends on which functions is bound in the current readtable to the character being read.
All implementations signal an error in that case, because when you reach a point where you have to lookup into the readtable for a closing parenthesis, the input is necessarily badly formed. It is the job of a function like READ-DELIMITED-LIST, called from the function associated with the opening parenthesis, a.k.a. #(, to read until it find the corresponding closing parenthesis. Note that if you look-up the reader for #( in SBCL, it does not use read-delimited-list, but a different, specialized version. It is a little bit too long to post it here.

Quote and recursive reading

In your case, you also have quote. How does quote behave?

(defun read-quote (stream ignore)
  (declare (ignore ignore))
  (list 'quote (read stream t nil t)))

It builds a list starting with quote and containing a sub-expression obtained by calling READ recursively. This is just as above, when I entered a closing parenthesis at the REPL prompt. Since we are not currently in the context of an open parenthesis, we encounter the #) character, look it up in the readtable and signal an error.

The prompt is to define a procedure that returns the sum of the squares of the two largest of three numbers.

I know this isn’t exactly an elegant solution, but this is what I hacked together:

(define (largest-of-two-sum-of-squares x y z)
        (cond ((and (< x y) (< x z)) (sum-of-squares y z))
              ((and (< y z) (< y x)) (sum-of-squares x z))
              ((and (< z x) (< z y)) (sum-of-squares x y)))))

What I’m wondering is why I’m getting an error.

;The object 85 is not applicable

The number that follows the word object is always the correct answer, btw. I am a scheme beginner, it must be something in my syntax?

Thanks

asked Mar 10, 2012 at 17:10

Mike's user avatar

2

Here’s another possible solution, this one works even in the cases where all three numbers are equal or if two are equal and lower than the other:

(define (sum-max a b c)
  (define (sum x y)
    (+ (* x x) (* y y)))
  (if (>= a b)
      (if (>= b c)
          (sum a b)
          (sum a c))
      (if (>= a c)
          (sum b a)
          (sum b c))))

answered Mar 10, 2012 at 17:36

Óscar López's user avatar

Óscar LópezÓscar López

233k37 gold badges313 silver badges386 bronze badges

1

As sindikat pointed out, an excess closing bracket. Sorry about that.

answered Mar 10, 2012 at 17:18

Mike's user avatar

MikeMike

9634 gold badges16 silver badges38 bronze badges

1

What about

(define (largest-of-two-sum-of-squares x y z)
    (+ (square x) (square y) (square z)
       (- (square (min x y z)))))

?

answered Mar 11, 2012 at 22:17

6502's user avatar

65026502

112k15 gold badges166 silver badges265 bronze badges

1

pavel481516

0 / 0 / 0

Регистрация: 12.02.2015

Сообщений: 16

1

Неверно сформированный список на входе

23.04.2017, 00:16. Показов 5417. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Функция «lp» строит оси координат (строки 6-9),
запрашивает положение конечных точек отрезка (строки 12, 13), строит
отрезок (строка 15) и его зеркальное отражение относительно начала
координат (строки 17-25).

Ошибка:Неверно сформированный список на входе
Подскажите, как решить данную проблему. Заранее благодарен.

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(defun lp() ;1
(setvar "blipmode" 0) ;2
(setvar "cmdecho" 0) ;3
(command "ZOOM" "w" '(-100 -100) '(100 100)) ;4
(command "COLOR" 5) ;5
(command "LINE" (0 -100) '(0 100) ;6
(command) ;7
(command "LINE" (-100 0) '(100 0) ;8
(command) ;9
(setq st "Y") ;10
(while (= st "Y") ;11
(setq p1 (getpoint "\nPoint_1: ")) ;12
(setq p2 (getpoint "\nPoint_2: ")) ;13
(command "COLOR" 7) ;14
(command "LINE" p1 p2) ;15
(command) ;16
(setq x1 (- (nth 0 p1))) ;17
(setq x2 (- (nth 0 p2))) ;18
(setq y1 (- (nth 1 p1))) ;19
(setq y2 (- (nth 1 p2))) ;20
(setq pt1 (list(x1 y1)) ;21
(setq pt2 (list(x2 y2)) ;22
(command "COLOR" 1) ;23
(command "LINE" pt1 pt2) ;24
(command) ;25
(setq st (getstring "\nNext ? (Y/N):")) ;26
(setq st (strcase st)) ;27
))



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

23.04.2017, 00:16

4

602 / 922 / 149

Регистрация: 10.08.2015

Сообщений: 4,855

23.04.2017, 15:36

2

В строках 6,8,21,22 не хватает закрывающей скобки



1



0 / 0 / 0

Регистрация: 12.02.2015

Сообщений: 16

23.04.2017, 15:56

 [ТС]

3

Спасибо, но теперь другая ошибка
ошибка:неверная функция в выражении: (0 -100))



0



602 / 922 / 149

Регистрация: 10.08.2015

Сообщений: 4,855

23.04.2017, 16:29

4

Лучший ответ Сообщение было отмечено pavel481516 как решение

Решение

в строке 6, 8 не хватает апострофа
в строке 21, 22 лишние скобки



2



0 / 0 / 0

Регистрация: 12.02.2015

Сообщений: 16

23.04.2017, 16:36

 [ТС]

5

Спасибо.



0



Подсказка состоит в том, чтобы определить процедуру, которая возвращает сумму квадратов двух наибольших из трех чисел.

Я знаю, что это не совсем элегантное решение, но это то, что я взломал вместе:

(define (largest-of-two-sum-of-squares x y z)
        (cond ((and (< x y) (< x z)) (sum-of-squares y z))
              ((and (< y z) (< y x)) (sum-of-squares x z))
              ((and (< z x) (< z y)) (sum-of-squares x y)))))

Мне интересно, почему я получаю сообщение об ошибке.

;The object 85 is not applicable

Кстати, число, которое следует за словом «объект», всегда является правильным ответом. Я новичок в схеме, это должно быть что-то в моем синтаксисе?

Благодарность

3 ответа

Вот еще одно возможное решение, оно работает даже в тех случаях, когда все три числа равны или если два равны и меньше другого:

(define (sum-max a b c)
  (define (sum x y)
    (+ (* x x) (* y y)))
  (if (>= a b)
      (if (>= b c)
          (sum a b)
          (sum a c))
      (if (>= a c)
          (sum b a)
          (sum b c))))


3

Óscar López
11 Мар 2012 в 18:29

Как указал синдикат, лишняя закрывающая скобка. Извини за это.


1

Mike
10 Мар 2012 в 21:18

Что о

(define (largest-of-two-sum-of-squares x y z)
    (+ (square x) (square y) (square z)
       (- (square (min x y z)))))

?


1

6502
12 Мар 2012 в 02:17

МИНИСТЕРСТВО
НАУКИ, ВЫСШЕЙ ШКОЛЫ И ТЕХНИЧЕСКОЙ

ПОЛИТИКИ
РОССИЙСКОЙ ФЕДЕРАЦИИ

─────────────

МОСКОВСКИЙ
ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ

───────────────────────────────────────────────────────

ЛАБОРАТОРНЫЙ
ПРАКТИКУМ

по
курсу

Программирование
и алгоритмические языки

ПРОГРАММИРОВАНИЕ
НА ЯЗЫКЕ ЛИСП В СИСТЕМЕ muLISP-90

───────────────────────────────────────────────────────

Москва
1993

МИНИСТЕРСТВО
НАУКИ, ВЫСШЕЙ ШКОЛЫ И ТЕХНИЧЕСКОЙ

ПОЛИТИКИ
РОССИЙСКОЙ ФЕДЕРАЦИИ

─────────────

МОСКОВСКИЙ
ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ

───────────────────────────────────────────────────────

Утверждено

учебным
управлением МЭИ

ЛАБОРАТОРНЫЙ
ПРАКТИКУМ

по
курсу

Программирование
и алгоритмические языки

ПРОГРАММИРОВАНИЕ
НА ЯЗЫКЕ ЛИСП В СИСТЕМЕ muLISP-90

───────────────────────────────────────────────────────

Москва
1993

.

 _Программирование
на языке ЛИСП в системе muLISP-90 .. Бай-

дун
В.В., Кружилов С.И., Сергиевский А.Е,
Чернов П.Л. — М.:

Моск.
энеpг. ин-т, 1993. ─ 40 с.

Лабораторный
практикум содержит описание основных
принци-

пов
программирования и работы в системе
muLISP-90., а так же

список
базовых функций, используемых в этой
системе. Приведены

рекомендации
по отладке программ.

Лабораторный
практикум предназначен для слушателей
ФПКП и

студентов
специальности «Прикладная математика»,
выполняющих

практические
задания и типовой расчет на языке ЛИСП
с примене-

нием
персональных ЭВМ.

─────────────────────

С
Московский энергетический институт,
1993 г.


3 —

ВВЕДЕНИЕ

Использование
языка ЛИСП для исследования и разработки
прог-

раммного
обеспечения в области решения задач
искусственного интел-

лекта
определяется комплексом его отличительных
черт:


Теоретическая стройность и строгость
языка, простая семан-

тика
обеспечивают ясность понимания принципов
его работы;


Аппликативность ЛИСПа обеспечивает
естественность функцио-

нального
подхода при разработке в его среде
сложных программных

систем
с использованием методик как
«сверху-вниз»,так и «сни-

зу-вверх»;


Рекурсивность языка позволяет в ряде
случаев существенно

упростить
реализацию алгоритмов решения задач;


Универсальность структурирования
данных в ЛИСПе, возмож-

ность
строить структуры данных в динамике,
наряду с автоматическим

распределением
памяти, делает его незаменимым инструментом
решения

задач
со сложной структурой данных;


Расширяемость языка позволяет
пользователю добавлять собс-

твенные
функции и структуры данных;


Интерактивность реализации ЛИСП-систем,
удобство и быстрота

отладки
программ делают ЛИСП мощным инструментом
для программиро-

вания
и программного моделирования большого
класса задач.

В
данном пособии приводятся основные
сведения для работы в

системе
muLISP, одной из наиболее известных
ЛИСП-систем для персо-

нальных
ЭВМ. К основным достоинствам этой
системы можно отнести

структурность
реализованной версии языка, большой
набор базовых

функций,
компактность реализации системы наряду
с высокой эффек-

тивностью
интерпретации программ. Приведенные
далее сведения соот-

ветствуют
версии системы muLISP-90.

Если
система muLISP установлена на вашей ПЭВМ,
то для ее вы-

зова
в среде операционной системы MS-DOS
нужно ввести команду

MULISP.
Вслед за эти на экране появляется
сообщение идентифицирую-

щее
версию системы muLISP. Знак «$» в
начале следующей строки и


4 —

мигающий
курсор за ним показывают, что система
готова к вводу и

интерпретации
команд.

В
качестве команды можно ввести либо имя
атома, либо точечное

выражение,
либо список со сбалансированным набором
скобок. Завер-

шение
ввода определяется нажатием клавиши
Enter. muLISP считывает

введенное
выражение, вычисляет его и печатает на
экране полученный

результат.
После чего в новой строке опять появляется
символ «$» —

приглашение
к вводу новой команды. Обратим внимание,
что если

скобки
в команде не сбалансированы, то система
либо выдаст сообще-

ние
об ошибке (закрывающих скобок больше
открывающих), либо будет

ждать
ввода нужного числа закрывающих скобок,
если их не хватает,

даже
после нажатия клавиши Enter. Так продолжается
до тех пор, по-

ка
не будет введена команда (SYSTEM) после
выполнения которой уп-

равление
возвращается операционной системе.

Команда
вычисляется следующим образом. Если
введен список

первым
элементом которого является имя функции,
как стандартной,

так
и определенной программистом с помощью
оператора DEFUN, то ос-

тальные
элементы списка будут считаться
фактическими параметрами

этой
функции. После чего функция вычисляется
для заданных значений

параметров.
Во всех остальных случаях (атом,точечная
пара, список-

данное)
вычисляется значение введенного
выражения.

Ниже
приведен пример сеанса работы в системе
muLISP:

>MULISP
; вызов системы muLISP из MS-DOS

muLISP
IBM/PC MS-DOS version 7.20 (10/15/92)

Copyright
1983,1987,1990 Soft Warenhouse, Inc.

$(DEFUN
PROC (X Y) (* (/ Y 100) X) ;определение функции X%
от Y

PROC
;вывод значения функции
DEFUN

$(PROC
5 100) ;обращение к функции
PROC

20
;вывод значения функции
PROC

$(SETQ
A 7) ;выполнение функции А:=7

7
;вывод значения функции
А:=7

$A
;команда-атом

7
;вывод значения атома

$(A
B C) ;команда-список данных

(A
B C) ;вывод значения списка


5 —

$(CDR
‘(A B C) ) ;иллюстрация записи

(B
C) ;оператора QUOTE

$(CAR
A) ) ;ввод ошибочной команды

;(лишняя
закрывающая скобка)

Syntax
error: ;сообщение об ошибке

Continue,Break,Abort,Top-level,Restart,System?
Т

$(SYSTEM)
;команда выхода из ЛИСПА в
MS-DOS

>

Из
приведенного примера понятен способ
комментирования прог-

рамм
в системе muLISP: комментарием считается
текст следующий

после
символа «;» до конца строки.

В
обычных условиях при вводе команд
строчные буквы автомати-

чески
преобразуются в заглавные. Для того,
чтобы избежать такого

преобразования
нужно присвоить специальной управляющей
переменной

*READ-UPCASE*
значение NIL. Это можно сделать например
командой

(SETQ
*READ-UPCASE* NIL). Любое
другое значение присвоенное этой

переменной
опять повлечет за собой преобразование
символов.

В
процессе ввода команды обеспечивается
стандартная для систе-

мы
MS-DOS возможность редактирования текста
вводимых команд. Крат-

кий
список комбинаций клавиш управления
редакторскими функциями

приведен
ниже:

->
— сдвиг курсора на 1 символ вправо;

<-
— сдвиг курсора на 1 символ влево;

Ctrl
+ -> — сдвиг курсора вправо на слово;

Ctrl
+ <- — сдвиг курсора влево на слово;

End
— сдвиг курсора в конец строки;

Home
— сдвиг курсора в начало строки;

Del
— удалить символ в позиции курсора;

Baskspace
— удалить символ слева от курсора;

Ctrl
+ T — удалить слово под курсором;

Ctrl
+ Y — удалить текущую строку;

Ctrl
+ Q + Y — удалить часть строки справа от
курсора;

Ctrl
+ Q + H — удалить часть строки слева от
курсора;

F3
— вставить удаленную или предыдущую
команду;

Ins
— переключение редактора из режима
вставки в


6 —

режим
замещения и обратно;

Enter
— выход из редактора и ввод текста;

Esc
— выход из редактора без ввода
текста.

Символом
+ здесь обозначается сочетание клавиш
используемых

для
редактирования.

Этих
средств достаточно для ввода отдельных
команд. Набор

текстов
программ и структур данных лучше
осуществлять с помощью

более
мощного редактора ( см. раздел
«Редактирование текста прог-

раммы»
).

2.
ОСОБЕННОСТИ ПРОГРАММИРОВАНИЯ В СИСТЕМЕ
muLISP

Особенности
программирования в системе muLISP
определяются на-

бором
средств расширения стандартного языка
ЛИСП:


Для записи оператора QUOTE допускается
следующее сокращение:

(QUOTE
S) может записываться как ‘S (см. в
приведенном выше приме-

ре);


Автоквотирование атомов. При создании
нового символьного

атома,
система устанавливает значение этого
атома равным его име-

ни.
Так атом SLON, появившийся в системе,
будет иметь значение

SLON
до тех пор пока не произойдет присваивания
нового значения.

Это
позволяет в ряде случаев не пользоваться
оператором QUOTE.

Например,
можно вместо выражения (SETQ X ‘SLON) писать
просто

(SETQ
X SLON);


При построении тела функций подразумевается
неявное исполь-

зование
оператора PROGN, т.е. тело функции может
представлять со-

бой
последовательность операторов:

(DEFUN
F (X Y) (S1 …)(S2 …)…(Sn …) ).

Результирующим
значением функции F будет значение
последнего

из
них Sn. В соответствии с этим принципом
расширено использование

многих
функций ЛИСПа, и ,в частности, оператора
COND, где вместо

одного
действия, выполняемого после определения
истинного условия,

допускается
последовательность действий, выполняемых
по принципу

неявного
оператора PROGN:

(COND
(P1 S11 S12…)…(Pn (SN1 SN2…) ).


7 —


Для упрощения структуры программы в
систему введен неявный

оператор
COND, имеющий вид ( (P…) S1
S2 … SN ). Этот
оператор

является
аналогом оператора IF P THEN (S1…SN).


В системе отсутствует оператор GO.


Для записи итерационных алгоритмов
введен структурный опера-

тор
цикла LOOP, имеющий вид (LOOP S1 S2 … SN) и
позволяющий бес-

конечно
повторять последовательность операторов
(S1 S2 … SN).

Выход
из цикла может быть осуществлен с
помощью одного или нес-

кольких
неявных операторов COND. Например
итерационное определение

функции
ФАКТОРИАЛ с использованием оператора
цикла может иметь

следующий
вид:

(DEFUN
FACTORIAL (N M)

(SETQ
M 1) ;М:=1

(LOOP
;оператор цикла

(
(ZEROP N) M) ;неявный COND для выхода из
цикла

(SETQ
M (* M N)) ;M:=M*N

(SETQ
N (SUB1 N)) ;N:=N-1

)

).


В muLISPе избыточные аргументы в списке
формальных парамет-

ров
функции могут быть использованы в
качестве локальных перемен-

ных
внутри функции. При входе в функцию всем
избыточным аргументам

присваивается
значение NIL. Примером может служить
переменная М в

приведенном
выше определении факториала. Это
позволяет, наряду с

неявным
использованием аппарата PROGN, отказаться
от использования

в
программах операторов PROG, что упрощает
структуру программы.


muLISP обеспечивает применимость операторов
CAR и CDR к ар-

гументам
любых типов, а не только к спискам. Так
(CAR A) выдает

значение
атома А, а (CDR A) — список его свойств.
Аналогичные сог-

лашения
имеются и для числовых атомов. Потому
при работе необходи-

мо
соблюдать определенную осторожность.


В языке расширена трактовка многих
операторов ЛИСПа таких

как
+, -, *, SETQ и т.д. Они определены не только
для двух аргу-

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

на
описания функций приведенных в следующих
разделах, обращайте,

пожалуйста,
на это внимание! К тому же, интерактивность
при работе


8 —

с
системой дает возможность посмотреть,
как выполняется любая ко-

манда.
Пользуйтесь этой возможностью, чтобы
проверить правильность

понимания
вами принципов работы функций системы!

Понравилась статья? Поделить с друзьями:
  • Lirika saeco кофемашина выдает ошибку
  • Lms api ошибка
  • Lh100 ошибка е10
  • Lirica saeco ошибки
  • Livesuit выдает ошибку