Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
1

Сконструировать \lambda-вызов и вычислить его значение Lambda

06.11.2014, 22:12. Показов 1566. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание
Для выражения из таблицы согласно номеру варианта сконструировать \lambda - вызов и вычислить его значение. Присваивать полученное значение символу не нужно.



Lisp
1
2
3
((Lambda (x y) 
              (cond((< 1 (expt (+ y x) 2)) (exp (+ x y)) 
                                               ((and ( >=2)) (exp (expt (+ y x) 2))) (t 1))))  0.2 - 2)


(expt x y) - это х в степени у, т.е. xy
а вот (exp x) - это ex

сделал код лисп и вставляю comon lisp, нет результата=\ Как правильно сделать функцию? Заранее благодарю.
Миниатюры
Сконструировать \lambda-вызов и вычислить его значение Lambda  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2014, 22:12
Ответы с готовыми решениями:

Для выражения сконструировать λ-вызов и вычислить его значение
Для выражения сконструировать λ-вызов и вычислить его значение. Присваивать полученное значение...

Для выражения сконструировать λ –вызов и вычислить его значение
Вот такое задание

Для выражения сконструировать λ-вызов и вычислить его значение
Для выражения сконструировать λ-вызов и вычислить его значение. Присваивать полученное значение...

LAMBDA - выражение
Доброй ночи! Вопрос тупой, но я с Лиспом первый день:) LAMBDA - выражение может возвращать...

13
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
06.11.2014, 22:31 2
Лучший ответ Сообщение было отмечено Walimas как решение

Решение

Правильно - вот так:
Lisp
1
2
3
4
5
6
((lambda (x y) 
   (cond ((> 1 (expt (+ y x) 2)) (exp (+ x y)))
         ((>= (expt (+ y x) 2) 2) (exp (expt (+ y x) 2)))
         (t 1)))
 0.2
 -2)
Ваши ошибки:
1) У cond-а каждая ветка своей скобке:
Lisp
1
2
3
4
cond (cond1 form11 ... form1n1)
     (cond2 form21 ... form 2n2)
    ...
     (condk formk1 ... form knk)
А у вас всё залезло в первую скобку, так что получилась как бы одна ветка. Если б вы пользовались редактором, который правильно расставляет отступы (читай: Emacs), вы бы сразу поняли по отступам.

2) В первой ветке условие должно быть (> 1 ...): единица должна быть больше.

3) and во второй ветке не нужен (хотя ничего плохого от него нет, так что не ошибка).

4) ( >=2) - это какая-то жертва войны правок. Заметьте, что нужно разделить пробелом, а то >=2 - единый символ.

5) - 2 (через пробел) - это минус отдельно, 2 отдельно. Число -2 надо писать без пробела.

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

Добавлено через 2 минуты
Цитата Сообщение от Walimas Посмотреть сообщение
нет результата=\
Такого не бывает. Какой-то результат всегда будет. Обычно при наличии ошибок появляются полезные сообщения. Не мешало бы их почитывать, да и на форум можно постить.
2
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
07.11.2014, 04:12  [ТС] 3
2) В первой ветке условие должно быть (> 1 ...): единица должна быть больше.
4) ( >=2) - это какая-то жертва войны правок. Заметьте, что нужно разделить пробелом, а то >=2 - единый символ.
Мне трудно понимать. Почему именно > 1, а не < 1? там же написано задачи что (x+y)2<1, значит делаем так (< 1 (expt (+ y x) 2) посмотри на картинке примере (вы можете объясните?) P.S. Я понял, что ты вы написали, но я до конца не все понимаю.

5) - 2 (через пробел) - это минус отдельно, 2 отдельно. Число -2 надо писать без пробела.
я ошибся. не заметил.

нет результата=\
Такого не бывает. Какой-то результат всегда будет. Обычно при наличии ошибок появляются полезные сообщения. Не мешало бы их почитывать, да и на форум можно постить.
Я не знаю как правильно сказать.=) Думаю можно так сказать нет вывода результатов или аргумент. Хз...%)
Миниатюры
Сконструировать \lambda-вызов и вычислить его значение Lambda  
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
07.11.2014, 06:36 4
Лучший ответ Сообщение было отмечено Walimas как решение

Решение

Цитата Сообщение от Walimas Посмотреть сообщение
Мне трудно понимать. Почему именно > 1, а не < 1? там же написано задачи что (x+y)2<1, значит делаем так (< 1 (expt (+ y x) 2) посмотри на картинке примере (вы можете объясните?) P.S. Я понял, что ты вы написали, но я до конца не все понимаю.
(< a b) в обычной математической записи означает a < b. "Меньше a, чем b": лисп - язык с необычным порядком слов: глагол на первом месте.

Цитата Сообщение от Walimas Посмотреть сообщение
Я не знаю как правильно сказать.=) Думаю можно так сказать нет вывода результатов или аргумент. Хз...%)
Правильно сказать вот так: Ctrl+C, Ctrl+V. Например, я ввожу ваше выражение в репл (SBCL), получаю следующий результат:
Код
; in:
;      (LAMBDA (X Y) (COND ((< 1 (EXPT # 2)) (EXP (+ X Y)) ((AND #) (EXP #)) (T 1)))) 0.2
;     ((AND (>=2)) (EXP (EXPT (+ Y X) 2)))
; 
; caught ERROR:
;   illegal function call

;     ((LAMBDA (X Y) (COND ((< 1 #) (EXP #) (# #) (T 1)))) 0.2 - 2)
; --> SB-C::%FUNCALL 
; ==>
;   (#<SB-C::CLAMBDA
;      :%SOURCE-NAME SB-C::.ANONYMOUS.
;      :%DEBUG-NAME (LAMBDA (X Y))
;      :KIND NIL
;      :TYPE #<SB-KERNEL:BUILT-IN-CLASSOID FUNCTION (read-only)>
;      :WHERE-FROM :DEFINED
;      :VARS (X Y) {CB7F6E9}>
;    0.2 - 2)
; 
; caught WARNING:
;   function called with three arguments, but wants exactly two
;   See also:
;     The ANSI Standard, Section 3.2.2.3
; 
; caught WARNING:
;   The function T is undefined, and its name is reserved by ANSI CL so that even
;   if it were defined later, the code doing so would not be portable.
; 
; compilation unit finished
;   Undefined function:
;     T
;   caught 1 ERROR condition
;   caught 2 WARNING conditions
invalid number of arguments: 3
   [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]
Уже можно смекнуть, что лямда неправильная, что t почему-то воспринимается как функция, и куда-то суют 3 аргумента вместо 2. Попробую одну лямду щёлкнуть:
Код
; in: LAMBDA (X Y)
;     ((AND (>=2)) (EXP (EXPT (+ Y X) 2)))
; 
; caught ERROR:
;   illegal function call

; in: LAMBDA (X Y)
;     (T 1)
; 
; caught WARNING:
;   The function T is undefined, and its name is reserved by ANSI CL so that even
;   if it were defined later, the code doing so would not be portable.
; 
; compilation unit finished
;   Undefined function:
;     T
;   caught 1 ERROR condition
;   caught 1 WARNING condition
Вижу, что явно ни в дугу ни в Красную армию. Ладно, дошло, что всё в одну ветку записано, переделываю на
Lisp
1
2
3
(lambda (x y)
   (cond ((< 1 (expt (+ y x) 2)) (exp (+ x y)) )
         ((and ( >=2)) (exp (expt (+ y x) 2))) (t 1)))
В этот раз пишет:
Код
;     (>=2)
; 
; caught STYLE-WARNING:
;   undefined function: >=2
; 
; compilation unit finished
;   Undefined function:
;     >=2
;   caught 1 STYLE-WARNING condition
Думаю: что это за кракозябра, >=2? Посмотрели, осознали. И т. д. и т. п.

Ничего плохого нет, чтобы спросить на форуме. Но вы могли и сами это сделать. Если вы игнорируете то, что пишет интерпретатор или компилятор, вам очень тяжко будет дебажить.

PS В лиспе не пользуются большими буквами, lambda - не исключение.
3
Модератор
Эксперт функциональных языков программированияЭксперт Python
36595 / 20325 / 4218
Регистрация: 12.02.2012
Сообщений: 33,625
Записей в блоге: 13
07.11.2014, 12:55 5
А чтобы не перевычислять одно и то же, можно поступить так:

Lisp
1
2
3
4
5
6
7
8
((lambda (x y) 
  (let* ((x+y (+ x y)) ;; x+y - допустимое имя
         (tmp (expt x+y 2))) ;; (x+y)^2
     (cond ((> 1 tmp) (exp x+y))
           ((>= tmp 2) (exp (expt x+y 2)))
           (t 1))))
 0.2
 -2)
2
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
07.11.2014, 17:34 6
Lisp
1
2
3
4
5
6
7
;; racket-lang.org
(define foo
  (lambda (x y)
    (let ((condition (expt (+ x y) 2.)))
      (when (< condition 1) (exp (sqrt condition)))
      (when (>= condition 2) (exp condition))
      1)))

Не по теме:

helter, и не лень Вам иной раз такие простыни писать?

0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,589
07.11.2014, 17:59 7
castorsky, зачем ты неправильный код повторил?
1
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
07.11.2014, 18:17 8
ага, шлёма, так веселей
Lisp
1
2
3
4
5
6
7
8
9
;; racket-lang.org
(define foo
  (lambda (x y)
    (let ((condition (expt (+ x y) 2.)) (retval 1))
      (define (bar) (exp (sqrt condition)))
      (define (baz) (exp condition))
      (when (< condition 1) (set! retval (bar)))
      (when (>= condition 2) (set! retval (baz)))
      retval)))
0
helter
07.11.2014, 18:18
  #9

Не по теме:

Цитата Сообщение от castorsky Посмотреть сообщение
helter, и не лень Вам иной раз такие простыни писать?
Хочется попонятней...

0
castorsky
07.11.2014, 18:24
  #10

Не по теме:

Понятней в книгах, тут от лени или праздности. Впрочем, оставим.

0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,589
07.11.2014, 20:08 11
Цитата Сообщение от castorsky Посмотреть сообщение
так веселей
Lisp
1
2
3
4
5
6
(define (foo x y)
  (let/cc return
    (let ((c (expt (+ x y) 2)))
      (when (<  c 1) (return (exp (sqrt c))))
      (when (>= c 2) (return (exp c)))
      (return 1))))
=)
2
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
08.11.2014, 13:13 12
Неистовые продолжения
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
(define foo
  (case-lambda
    [(x)
     (let/cc return
       (when (null? x) (return null))
       (when (number? x)
         (return
          (let/cc ret
            (when (< x 1) (ret (exp (sqrt x))))
            (when (>= x 2) (ret (exp x)))
            (ret 1))))
       (when (list? x)
         (return 
          (let/cc ret
            (when (list? (first x))
              (ret (append `(,(foo (first x))) (foo (rest x)))))
            (when (and (= (length x) 2) (andmap number? x))
              (ret (foo (first x) (second x))))
            (ret null))))
       (return (void)))]
    [(x y)
     (let/cc return
       (when (and (number? x) (number? y))
         (return (foo (expt (+ x y) 2))))
       (return (void)))]
    [() (void)]))
1
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
09.11.2014, 09:57  [ТС] 13
Правильно сказать вот так: Ctrl+C, Ctrl+V. Например, я ввожу ваше выражение в репл (SBCL), получаю следующий результат:
Код Code
; in:
; (LAMBDA (X Y) (COND ((< 1 (EXPT # 2)) (EXP (+ X Y)) ((AND #) (EXP #)) (T 1)))) 0.2
; ((AND (>=2)) (EXP (EXPT (+ Y X) 2)))
;
; caught ERROR:
; illegal function call

; ((LAMBDA (X Y) (COND ((< 1 #) (EXP #) (# #) (T 1)))) 0.2 - 2)
; --> SB-C::%FUNCALL
; ==>
; (#<SB-C::CLAMBDA
; :%SOURCE-NAME SB-C::.ANONYMOUS.
; :%DEBUG-NAME (LAMBDA (X Y))
; :KIND NIL
; :TYPE #<SB-KERNEL:BUILT-IN-CLASSOID FUNCTION (read-only)>
; :WHERE-FROM EFINED
; :VARS (X Y) {CB7F6E9}>
; 0.2 - 2)
;
; caught WARNING:
; function called with three arguments, but wants exactly two
; See also:
; The ANSI Standard, Section 3.2.2.3
;
; caught WARNING:
; The function T is undefined, and its name is reserved by ANSI CL so that even
; if it were defined later, the code doing so would not be portable.
;
; compilation unit finished
; Undefined function:
; T
; caught 1 ERROR condition
; caught 2 WARNING conditions
invalid number of arguments: 3
[Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]
Уже можно смекнуть, что лямда неправильная, что t почему-то воспринимается как функция, и куда-то суют 3 аргумента вместо 2. Попробую одну лямду щёлкнуть:

Код Code

; in: LAMBDA (X Y)
; ((AND (>=2)) (EXP (EXPT (+ Y X) 2)))
;
; caught ERROR:
; illegal function call

; in: LAMBDA (X Y)
; (T 1)
;
; caught WARNING:
; The function T is undefined, and its name is reserved by ANSI CL so that even
; if it were defined later, the code doing so would not be portable.
;
; compilation unit finished
; Undefined function:
; T
; caught 1 ERROR condition
; caught 1 WARNING condition
Думаю: что это за кракозябра, >=2? Посмотрели, осознали. И т. д. и т. п.

Ничего плохого нет, чтобы спросить на форуме. Но вы могли и сами это сделать. Если вы игнорируете то, что пишет интерпретатор или компилятор, вам очень тяжко будет дебажить.

PS В лиспе не пользуются большими буквами, lambda - не исключение
helter, о как много ты написал свою функцию - это уже лишний) Мое мнение. Ладно я все понял спасибо большое!) осознал!)
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
09.11.2014, 15:29 14
Цитата Сообщение от Walimas Посмотреть сообщение
о как много ты написал свою функцию
Вообще-то я цитировал дебаггер. (Вздыхает.)
0
09.11.2014, 15:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2014, 15:29
Помогаю со студенческими работами здесь

Конструкции локальных определений LET і LAMBDA
Здравствуйте! Помогите написать программу с использованием конструкции локальных определений LET і...

В чем разница между let и lambda
Показать на примере.

Как работают lambda выражения?
Можете объяснить как работает функция lambda? у меня вот такая часть задачи: (lambda (car(L)...

%EXPAND-FORM: (EQL N 0) should be a lambda expression
http://ideone.com/PsVwBi подскажите: в чем пробдлема? Заранее благодарен.


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru