Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
4ulo4ek
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 19
1

Мне нужно всего лишь найти синтаксические ошибки, второй день ломаю голову, в условии есть ошибки

26.07.2012, 15:43. Просмотров 1877. Ответов 13
Метки нет (Все метки)

Мне нужно всего лишь найти синтаксические ошибки, второй день ломаю голову, в условии есть ошибки. А в каком именно условии не знаю
Lisp
1
2
3
4
5
6
(COND 
( (EQ x 'cat) (SETQ x 'dog) )
( (= x 5) (+ x 5) )
( (= x y) (SETQ x 5) (SETQ y 0) )
(T 5)
)
и еще никак не могу разобраться с этим заданием:
Lisp
1
2
3
4
5
(COND 
((= X 5) (SETQ X (+ X 10))) 
((SYMBOLP X) (SETQ X (ATOM X))) 
((EQ (LIST NIL) NIL) (SETQ X (LIST X))) 
)
Какие значения могут быть связаны с символом Х после завершения условной функции COND?
Преподаватель, говорит их несколько...и тут я вообще запуталась, помогите пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2012, 15:43
Ответы с готовыми решениями:

Написать программу по C++. Уже второй день голову ломаю...
Задание в общем понятное(вложенный файл C_PP.gif), но черт голову сломаешь как...

Я второй день как учу С++ (найти ошибки в коде)
Помогите, пожалуйста, я второй день как учу С++. Вот и в книге есть задания....

Помогите пожалуйста с UART, ломаю голову уже целый день((
Привет. Задача такая. Нужно послать по UART строку, хранящуюся во флеше(при...

Весь день ломаю голову над QProcess, не стартует скрипт
Всем привет. Весь день ломаю голову над такой проблемой... С Qt работаю совсем...

Найти синтаксические ошибки
Я с СИ раньше не работал, помогите найти синтаксические ошибки в коде. void...

13
Catstail
Модератор
23758 / 11838 / 2070
Регистрация: 12.02.2012
Сообщений: 19,240
26.07.2012, 17:06 2
Я бы знаки равенства заменил на EQ. Кроме того, нужно, чтобы переменные x и y имели значение. Этого можно добиться, создав глобальные переменные:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
(setq x 'cat)
 
==> cat
Создана глобальная переменная x
 
(setq y 100)
 
==> 100
 
Создана глобальная переменная y
 
;; а теперь вызываем COND:
 
(COND
( (EQ x 'cat) (SETQ x 'dog) )     ;; сейчас будет истинно это условие
( (EQ x 5) (+ x 5) )
( (EQ x y) (SETQ x 5) (SETQ y 0) )
(T 5)
) 
 
==> dog
 
x
 
==> dog
 
;; еще раз вызываем COND:
 
(COND
( (EQ x 'cat) (SETQ x 'dog) )
( (EQ x 5) (+ x 5) )
( (EQ x y) (SETQ x 5) (SETQ y 0) )
(T 5)                                           ;; сейчас будет истинно это условие
) 
 
==> 5
 
;; Если присвоить x 100 и и еще раз выполнить, то ч х получит значение 5, а y обнулится:
 
(setq x 100)
 
==> 100
 
(COND
( (EQ x 'cat) (SETQ x 'dog) )
( (EQ x 5) (+ x 5) )
( (EQ x y) (SETQ x 5) (SETQ y 0) )  ;; сейчас будет истинно это условие
(T 5)
) 
 
==> 0
 
x
 
==> 5
 
y
 
==> 0
Добавлено через 12 минут
Теперь займемся вторым условием. Во-первых, не хватает одной закрывающей скобки:

Lisp
1
2
3
4
(COND
    ((EQ X 5) (SETQ X (+ X 10)))
    ((SYMBOLP X) (SETQ X (ATOM X)))
    ((EQ (LIST NIL) NIL) (SETQ X (LIST X)))))
1) Если переменная x имеет значение 5, то выполнится первое условие и х получит значение 15
2) Если переменная х имеет значение, отличное от 5, но являющееся символом, то х получит значение T (поскольку значение (ATOM X) в этом случае будет T)
3) последнее условие никогда не будет истинным (т.к. (EQ (list nil) nil) есть nil

***

Почему знаки "=" я рекомендую заменить на EQ. Дело в том, что EQ проверяет эквивалентность любых объектов, а "=" позволяет сравнивать только числа. Поэтому, если a=(1 2 3), то:

Lisp
1
2
3
4
5
6
7
8
9
10
(= a 1)
 
(= a 1)
 
EQ_: Очередной аргумент - не атом
==> ERRSTATE
 
(EQ a 1)
 
==> Nil
Все это проверялось в HomeLisp-е. В Common Lisp - аналогично:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CL-USER 8 : 2 > (setq a '(1 2 3))
(1 2 3)
 
CL-USER 9 : 2 > (= a 1)
 
Error: Arithmetic error in = of ((1 2 3) 1): Arguments must be numbers.
  1 (continue) Return a value to use.
  2 (abort) Return to level 2.
  3 Return to debug level 2.
  4 Return to level 1.
  5 Return to debug level 1.
  6 Return to level 0.
  7 Return to top loop level 0.
 
Type :b for backtrace, :c <option number> to proceed,  or :? for other options
 
CL-USER 10 : 3 > (eq a 1)
NIL
0
4ulo4ek
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 19
27.07.2012, 14:04  [ТС] 3
Спасибо. Тоесть это -15, Т и NIL? а (15) (T) (NIL) результатами быть не могут?
Еще скажите пожалуйста ,что такое неправомерное использование предиката EQ? вообще не понимаю что это и с чем едят.
Вот к примеру:В каких случаях использование предиката eq неправомерно?
Lisp
1
2
3
4
(eq ‘red ‘green)
(eq ‘red ‘sport)
(eq(red ‘green))
(eq (list ‘red ‘green) (cons ‘red ‘green))
HomeLisp, в 1,2 и 4 случае NIL выдает, в 3-м Т. по ответам чтоли судить, или что вообще такое неправомерно по отношению к предикату? Спасибо.
0
Catstail
Модератор
23758 / 11838 / 2070
Регистрация: 12.02.2012
Сообщений: 19,240
27.07.2012, 14:37 4
Цитата Сообщение от 4ulo4ek Посмотреть сообщение
В каких случаях использование предиката eq неправомерно?
- отвечаю. Предикат EQ сравнивает символы (атомы). Он возвращает T только в случае, когда оба его аргумента - один и тот же атом. Если хотя бы один аргумент EQ - не атом (или атомы разные), возвращается Nil.

Для сравнения более сложных объектов следует использовать предикат EQUAL. Вот развернутый пример:

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
29
30
31
32
(EQ 1 2)
 
==> NIL  ;; это понятно
 
(EQ 1 1)
 
==> T    ;; и это понятно
 
(EQ 'a 'b)
 
==> NIL  ;; и это...
 
(EQ 'a 'a)
 
==> T    ;; и это
 
(setq b 'a)
 
==> a
Создана глобальная переменная b
 
(EQ 'a b)
 
==> T    ;; при вычислении b заменится на a. отсюда и результат
 
(eq '(1 2) '(1 2))
 
==> NIL  ;; Списки одинаковы, но EQ не работает со списками...
 
(equal '(1 2) '(1 2))
 
==> T    ;; EQUAL показывает, что списки равны
0
Nameless One
Эксперт С++
5787 / 3436 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
27.07.2012, 15:46 5
Цитата Сообщение от 4ulo4ek Посмотреть сообщение
В каких случаях использование предиката eq неправомерно?
Встречный вопрос: что в данном случае подразумевается под «правомерностью»? Для меня это неочевидно.

В третьем примере вообще будет синтаксическая ошибка.

Как уже заметил Catstail, для одинаковых атомов eq всегда вернет истину. Дополню: в Common Lisp eq возвращает истину, только если его аргументы представляет один и тот же объект. Для атомов это тривиально, но для списков eq может вернуть ложь, даже если их содержимое поэлементно идентично.

Lisp
1
2
3
4
5
6
7
8
> (eq '(1 2 3) '(1 2 3))
 
NIL
> (let ((list '(1 2 3)))
    (eq list list))
 
T
>
Другой пример:

Lisp
1
2
3
4
> (eq 3 3)
 
T
>
Результат вычисления этого выражения зависит от используемой реализации.

Другие примеры можно посмотреть на этой странице.
0
4ulo4ek
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 19
27.07.2012, 15:51  [ТС] 6
да, я знаю что он сравнивает. но мне конкретно непонятно было про "неправомерное" применение. Я сама просто не могу нигде найти эту информацию. Похоже для меня это так и останется загадкой
0
Nameless One
Эксперт С++
5787 / 3436 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
27.07.2012, 15:58 7
Цитата Сообщение от 4ulo4ek Посмотреть сообщение
но мне конкретно непонятно было про "неправомерное" применение
если отбросить заведомо нерабочий вариант, то, скорее всего, имелось в виду использование предиката для сравнения значений аргументов. Если это так, то правильный ответ уже подсказал
Catstail (т.к. сравнивать с такой целью списки нет смысла — для eq есть смысл только в проверке на то, что переданные ему аргументы представляют собой абсолютно один и тот же объект, а не просто два списка с одинаковым содержимым)
0
4ulo4ek
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 19
27.07.2012, 16:11  [ТС] 8
Цитата Сообщение от Nameless One Посмотреть сообщение
если отбросить заведомо нерабочий вариант, то, скорее всего, имелось в виду использование предиката для сравнения значений аргументов. Если это так, то правильный ответ уже подсказал
Catstail (т.к. сравнивать с такой целью списки нет смысла — для eq есть смысл только в проверке на то, что переданные ему аргументы представляют собой абсолютно один и тот же объект, а не просто два списка с одинаковым содержимым)
третий вариант? так он же возвращает T, или это уже не важно...хм. странно...несколько говорил вариантов там.

А вот посмотрите
В каких случаях результатом выражения будет NIL?
Lisp
1
2
3
4
 (EQ 2/4 0.5)
 (EQ 1/2 2/4)
 (EQL 100.0 1e2)
 (EQL 10e1 100.0)
опять же в хомлиспе все NIL. но это же опять у меня не верно было. Не могли бы Вы мне объяснить? Спасибо.
1
Nameless One
Эксперт С++
5787 / 3436 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
27.07.2012, 16:22 9
Цитата Сообщение от 4ulo4ek Посмотреть сообщение
третий вариант? так он же возвращает T, или это уже не важно
Третий вариант однозначно завершается с ошибкой

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
> (eq '(red 'green))
 
debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread
#<THREAD "main thread" RUNNING {1002980C63}>:
  invalid number of arguments: 1
 
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
 
restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
 
(EQ (RED 'GREEN))[:EXTERNAL]
0]
Цитата Сообщение от 4ulo4ek Посмотреть сообщение
В каких случаях результатом выражения будет NIL?
Под номером 1 и 2.

На случай, если ты не знаешь: код на Lisp'е нужно помещать в тег [LISP][/LISP], что мне приходится делать за тебя, правя твои сообщения.

UPD: поправил свой ответ
1
4ulo4ek
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 19
27.07.2012, 16:45  [ТС] 10
Вы уж извините, что я вас достаю. Просто учусь дистанционно, и спросить то не у кого. Проверьте пожалуйста.
Lisp
1
2
3
4
5
6
7
8
9
10
11
 (eq 10.0 20.0)=NIL
 (eq 2 (length(30 20)))=Т
 (eq 10.5 (+ 10 0.5))=Т
 (eq (car(30 20)) (+10 20))=NIL
 (eq ‘1.5e 2150)=T
 (= 5 5.0)=NIL
 (= (+ 3 2) 5)=Т
 (= (+ 4 4) (/ 32 4))=NIL
 (EQL 5 5.0)=NIL
 (EQL (+ 3 2) 5)=Т
 (EQL (+ 4 4) (/ 32 4))=NIL
Вот выражения, мне нужно их вычислить. И найти ответ с числом три.
Lisp
1
2
3
4
 (- 10 6 1)=3
 (OR 3 4 5)=3
 ( CAR ( CDR ( CAR(3 (3) 3) ) ) )=атом (3)
 ( CAR ( CAR ( CDR(3 (3) 3) ) ) )=3
Мне кажется 3-ий вариант уж не подходит, я права?
и насчет пустых списков.
Lisp
1
2
3
4
5
6
( CDR ( CDR(5) ) )
 ( CAR ( CDR(5) ) )
 ( CDR ( CAR(5) ) )
 ( CDAR(5) )
 ( CDDR(5) )
 ( CAAR(5) )
вот посмотрите, я выбирала 1,2 и 5 вариант. отсылала ему. И это не правильно. Я пыталась, думала думала и ничего нового не нашла. Разве тут еще какое то выражение дает пустой список?
0
Nameless One
Эксперт С++
5787 / 3436 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
27.07.2012, 16:58 11
Буду сразу говорить по номерам строк, с чем не согласен:
Цитата Сообщение от 4ulo4ek Посмотреть сообщение
Lisp
1
2
3
4
5
6
7
8
9
10
11
 (eq 10.0 20.0)=NIL
 (eq 2 (length(30 20)))=Т
 (eq 10.5 (+ 10 0.5))=Т
 (eq (car(30 20)) (+10 20))=NIL
 (eq ‘1.5e 2150)=T
 (= 5 5.0)=NIL
 (= (+ 3 2) 5)=Т
 (= (+ 4 4) (/ 32 4))=NIL
 (EQL 5 5.0)=NIL
 (EQL (+ 3 2) 5)=Т
 (EQL (+ 4 4) (/ 32 4))=NIL
2, 3, 4 — может быть как T, так и NIL (зависит от реализации). 5 — синтаксическая ошибка. 8, 11 — T.


Цитата Сообщение от 4ulo4ek Посмотреть сообщение
(- 10 6 1)
Lisp
1
2
3
4
 =3
 (OR 3 4 5)=3
 ( CAR ( CDR ( CAR(3 (3) 3) ) ) )=атом (3)
 ( CAR ( CAR ( CDR(3 (3) 3) ) ) )=3
3 — ошибка времени выполнения.

Цитата Сообщение от 4ulo4ek Посмотреть сообщение
и насчет пустых списков.
тут я с тобой согласен
0
Catstail
Модератор
23758 / 11838 / 2070
Регистрация: 12.02.2012
Сообщений: 19,240
27.07.2012, 17:05 12
Цитата Сообщение от 4ulo4ek Посмотреть сообщение
(EQ 2/4 0.5) (EQ 1/2 2/4)
- в HomeLisp-е нет дробей. Поэтому 1/2 и 2/4 - это просто символы.

Цитата Сообщение от 4ulo4ek Посмотреть сообщение
(EQL 100.0 1e2) (EQL 10e1 100.0)
- а вот это случай занятный (считайте это особенностью HomeLisp-а):

Lisp
1
2
3
4
5
6
7
(= 100.0 1E2)
 
==> T  ;; и то, и другое - число 100 типа FLOAT
 
(EQ 100.0 1E2)
 
==> NIL ;; но разные атомы! (надо решить эту проблему...)


Цитата Сообщение от 4ulo4ek Посмотреть сообщение
я выбирала 1,2 и 5 вариант. отсылала ему. И это не правильно.
- это ПРАВИЛЬНО. Именно эти выражения дадут Nil.

Цитата Сообщение от 4ulo4ek Посмотреть сообщение
Мне кажется 3-ий вариант уж не подходит, я права?
- правы!
0
4ulo4ek
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 19
30.07.2012, 19:55  [ТС] 13
Спасибо, но многие из ответов что я решила не верны оказались почему то...я не понимаю как он там их составляет и проверяет уж тем более.
Насчет списков преподаватель говорит только 1 и 5 вариант. я не понимаю как так? отправила ему код из HomeLisp, надеюсь докажу как то что и 2-ой вариант тоже верен.

Заданы функции f(x)=x2, g(x)=x+3, h(x)=10x и функциональная композиция s=f?h?g. Найдите значение s(x) при x=2.
(4, 20, 5)
(4, 5, 20)
(5, 20, 4)
2500
43
70

ответ ведь (4,20,5)? ведь тут очень просто все, но мне опять говорят что это не верный вариант. Или я опять что то не поняла? Скажите пожалуйста.
0
Catstail
Модератор
23758 / 11838 / 2070
Регистрация: 12.02.2012
Сообщений: 19,240
30.07.2012, 21:22 14
Разберемся. У нас есть функции:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun f (x) (* x x))
 
==> f
 
(defun g (x) (+ x 3))
 
==> g
 
(defun h (x) (* 10 x))
 
==> h
Что такое композиция s = f(h(g(x)) - так это записывается в математике? Это новая функция, которая берет аргумент x вычисляет значение g(x), потом, взяв x1=g(x) как новый аргумент, вычисляет x2=h(x1), и, наконец, вычисляет f(x2).

Берем x=2. -> x1=g(2)=5; далее x2=h( x1)=h(5)=50;
и, наконец f(x2)=50*50=2500 Это и есть ответ. Убедимся в этом:

Lisp
1
2
3
4
5
6
7
(defun s (x) (f (h (g x))))
 
==> s
 
(s 2)
 
==> 2500
Все ясно?

Добавлено через 1 час 9 минут
Теперь о S-выражениях, которые возвращают NIL. Вот протокол из системы LispWorks (соотв. стандарту Common Lisp):

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
29
30
31
32
33
34
35
36
37
38
CL-USER 1 > (cdr (cdr '(5)))  ;; 1
NIL
 
CL-USER 2 > (car (cdr '(5)))  ;; 2
NIL
 
CL-USER 3 > (cdr (car '(5)))  ;; 3 
 
Error: Cannot take CDR of 5.
  1 (abort) Return to level 0.
  2 Return to top loop level 0.
 
Type :b for backtrace, :c <option number> to proceed,  or :? for other options
 
CL-USER 4 : 1 > (cdar '(5))  ;; 4
 
Error: Cannot take CDR of 5.
  1 (abort) Return to level 1.
  2 Return to debug level 1.
  3 Return to level 0.
  4 Return to top loop level 0.
 
Type :b for backtrace, :c <option number> to proceed,  or :? for other options
 
CL-USER 5 : 2 > (cddr '(5))  ;; 5
NIL
 
CL-USER 6 : 2 > (caar '(5))  ;; 6
 
Error: Cannot take CAR of 5.
  1 (abort) Return to level 2.
  2 Return to debug level 2.
  3 Return to level 1.
  4 Return to debug level 1.
  5 Return to level 0.
  6 Return to top loop level 0.
 
Type :b for backtrace, :c <option number> to proceed,  or :? for other options
А вот протокол из HomeLisp:

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
(cdr (cdr '(5)))  ;; 1
 
==> NIL
 
(car (cdr '(5)))  ;; 2
 
==> NIL
 
(cdr (car '(5)))  ;; 3
 
Аргумент CDR - атом (5)
==> ERRSTATE
 
(caar '(5))   ;; 4
 
Аргумент CAR - атом (5)
==> ERRSTATE
 
(cddr '(5))   ;; 5
 
==> NIL
 
(caar '(5))   ;; 6
 
Аргумент CAR - атом (5)
==> ERRSTATE
Так что HomeLisp не виноват...
1
30.07.2012, 21:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 21:22

Найти ошибки в данной программе (известно что есть только 2 ошибки)
У меня в модуле с програмирования задание: Найти ошибки в данной программе...

Синтаксические ошибки
Всем привет !!! помогите пожалуста найти синтаксические ошибки в коде ...

Синтаксические ошибки
Ребят помогите не могу понять что в этом проекте не так, я не очень силён в c#,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru