Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 27.06.2021
Сообщений: 5
Common Lisp

от начинающего кодера

27.06.2021, 20:42. Показов 2965. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Начал изучать LISP, нужен для полного понимания "азов" но это не важно, прошу не осуждать)

вопрос в следующем(перешел сюда с C#) не могу усвоить одно из первых заданий СИКП, а точнее:

Упражнение 1.3.
Определите процедуру, которая принимает в качестве аргументов три числа и возвращает сумму
квадратов двух больших из них. прописал такой код в HomeLisp:

Lisp
1
2
3
4
5
(define (sum-squares x y) (+ (*x x) (* y y)))
(cond(if
  ((and (>= a c) (>= b c)) (sum-squares a b))
  ((and (>= a b) (>= c b)) (sum-squares a c))
  (else (sum-squares b c))))
подскажите пожалуйста что не так? ругается на то, что слишком много условий...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.06.2021, 20:42
Ответы с готовыми решениями:

Иллюзии начинающего кодера
Вопрос довольно общий, о программировании как профессии в целом. Немного вводных данных, чтобы была понятнее суть: сейчас только вхожу в...

Ищу кодера)
Подскажите пожалуйста, при установке апк файла на рабочем столе его не видно, а удалить можно через все приложения, необходимо сделать...

Таблица кодера
Построить таблицу кодера K для универсума U (алфавит кода - {0, 1}, длина кода - 5). Кто знает как решить или знает где есть материал про...

15
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
27.06.2021, 21:17
Цитата Сообщение от UniHeal Посмотреть сообщение
Common Lisp от начинающего кодера
Цитата Сообщение от UniHeal Посмотреть сообщение
одно из первых заданий СИКП
Цитата Сообщение от UniHeal Посмотреть сообщение
(define (sum-squares x y) (+ (*x x) (* y y)))
Только это не Common Lisp, а Scheme.

Цитата Сообщение от UniHeal Посмотреть сообщение
(cond(if
Что это?
0
1 / 1 / 0
Регистрация: 27.06.2021
Сообщений: 5
27.06.2021, 21:22  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Только это не Common Lisp, а Scheme.


Что это?
я говорю, вообще новичек в этой теме, перешел с C#, и понимаю это так.
cond - это условие
if - условие "если"
и дальше пошло что-то типа и это и это правда/ложь, то это... иначе...
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
27.06.2021, 21:46
Цитата Сообщение от UniHeal Посмотреть сообщение
я говорю, вообще новичек в этой теме, перешел с C#, и понимаю это так.
Ты книгу-то читал? Там примеры есть.

Добавлено через 8 минут
Например
Кликните здесь для просмотра всего текста

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
(define (exercise-1.3 a b c)
  (define (square x) (* x x))
  (let ((xs (if (< a b)
                (if (< a c)
                    (cons b c)
                    (cons a b))
                (if (< b c)
                    (cons a c)
                    (cons a b)))))
    (+ (square (car xs))
       (square (cdr xs)))))
 
(define (test-exercise-1.3-case expected a b c)
  (let ((result (exercise-1.3 a b c)))
    (unless (= result expected)
      (error 'FAILED "exercise-1.3 (~s ~s ~s): expected ~s, got ~s" a b c expected result))))
 
(define (test-exercise-1.3)
  (let ((t test-exercise-1.3-case))
    (t 8  2 2 2)
    (t 13 3 2 2)
    (t 13 2 3 2)
    (t 13 2 2 3)
    (t 18 2 3 3)
    (t 18 3 2 3)
    (t 18 3 3 2)
    (t 25 2 3 4)
    (t 25 2 4 3)
    (t 25 3 2 4)
    (t 25 3 4 2)
    (t 25 4 2 3)
    (t 25 4 3 2)
    'ok))
0
1 / 1 / 0
Регистрация: 27.06.2021
Сообщений: 5
27.06.2021, 22:21  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Ты книгу-то читал? Там примеры есть.

Добавлено через 8 минут
Например
Кликните здесь для просмотра всего текста

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
(define (exercise-1.3 a b c)
  (define (square x) (* x x))
  (let ((xs (if (< a b)
                (if (< a c)
                    (cons b c)
                    (cons a b))
                (if (< b c)
                    (cons a c)
                    (cons a b)))))
    (+ (square (car xs))
       (square (cdr xs)))))
 
(define (test-exercise-1.3-case expected a b c)
  (let ((result (exercise-1.3 a b c)))
    (unless (= result expected)
      (error 'FAILED "exercise-1.3 (~s ~s ~s): expected ~s, got ~s" a b c expected result))))
 
(define (test-exercise-1.3)
  (let ((t test-exercise-1.3-case))
    (t 8  2 2 2)
    (t 13 3 2 2)
    (t 13 2 3 2)
    (t 13 2 2 3)
    (t 18 2 3 3)
    (t 18 3 2 3)
    (t 18 3 3 2)
    (t 25 2 3 4)
    (t 25 2 4 3)
    (t 25 3 2 4)
    (t 25 3 4 2)
    (t 25 4 2 3)
    (t 25 4 3 2)
    'ok))
Забыл сказать, по книге пройдено только : if else, cond, square, and, or, not и define... то есть что такое let, test-exercise-1.3, case, error и возможно что-то еще пропустил, не подразумевается что я должен это знать...
0
27.06.2021, 22:23

Не по теме:

Цитата Сообщение от UniHeal Посмотреть сообщение
по книге пройдено только
Похоже, пройдено мимо.

0
1 / 1 / 0
Регистрация: 27.06.2021
Сообщений: 5
27.06.2021, 22:45  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение

Не по теме:


Похоже, пройдено мимо.

я сразу сказал, что только начал, для меня это вообще тяжело...

Добавлено через 12 минут
Цитата Сообщение от korvin_ Посмотреть сообщение

Не по теме:


Похоже, пройдено мимо.

C#
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace лисп
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b, c;
 
            a = 3;
 
            b = 4;
 
            c = 5;
 
            int result = 0;
 
            if (a > с & b > c)
            {
                result = (a * a) + (b * b);
            }
 
            else if (b > a & c > a)
            {
                result = (b * b) + (c * c);
            }
 
            else
            {
                result = (a * a) + (c * c);
            }
 
            Console.WriteLine(result);
            Console.Readline();
        }
    }
}
Ответ будет: 41 потому что b и с больше чем а... ( 4*4 + 5*5 = 41)
можно конечно было сделать красивый ввод и вывод, но это совcем другая история. и код можно было бы упроситить намного, но это ладно. интересует именно то, как кодить в LISP...
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
27.06.2021, 22:49
Лучший ответ Сообщение было отмечено UniHeal как решение

Решение

Цитата Сообщение от UniHeal Посмотреть сообщение
Определите процедуру, которая принимает в качестве аргументов три числа и возвращает сумму
квадратов двух больших из них. прописал такой код в HomeLisp:
Лиспов много. В SICPе используется один из диалектов Scheme. HomeLisp - самостоятельный диалект на основе LISP 1.5, это не Scheme и не Common Lisp. Код из SICP на нём работать не будет.
1
1 / 1 / 0
Регистрация: 27.06.2021
Сообщений: 5
27.06.2021, 22:59  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Лиспов много. В SICPе используется один из диалектов Scheme. HomeLisp - самостоятельный диалект на основе LISP 1.5, это не Scheme и не Common Lisp. Код из SICP на нём работать не будет.
можете, пожалуйста подсказать, что именно надо поставить? Спасибо
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
27.06.2021, 23:20
Лучший ответ Сообщение было отмечено UniHeal как решение

Решение

Для SICP можете поставить Racket - кажется, он поддерживает тот диалект, а совсем простой код может работать и на разных диалектах Scheme. Любители Racket-а подскажут.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
28.06.2021, 07:41
Цитата Сообщение от UniHeal Посмотреть сообщение
Определите процедуру, которая принимает в качестве аргументов три числа и возвращает сумму
квадратов двух больших из них. прописал такой код в HomeLisp:
Lisp
1
2
3
4
5
6
7
8
9
(defun task (a b c)
  (cond ((= a (min a b c)) (+ (* b b) (* c c)))
        ((= b (min a b c)) (+ (* a a) (* c c)))
        (t                 (+ (* a a) (* b b)))))
 
==> TASK
 
(task 1 2 3)
==> 13

Собираюсь переписать примеры из SICP на CL. Задавай вопросы - постараюсь помочь!
1
 Аватар для chessman2
163 / 143 / 10
Регистрация: 21.10.2012
Сообщений: 486
28.06.2021, 10:44
Полагаю лучше разделить.
Будут в "копилке" по запас три готовых функции.

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
#lang racket
 
(define (sqr x) (* x x))
 
(define (sum-squares a b) (+ (sqr a) (sqr b)))
 
(define (dmn a b c) ; delete-min-number
  (remove (min a b c) (list a b c)))
 
(define (test a b c)
  (sum-squares (car (dmn a b c)) (cadr (dmn a b c))))
 
(test 3 1 2)
==> 13
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
28.06.2021, 10:48
chessman2, В последней функции результат вычисления (dmn a b c) хорошо бы присвоить локальной переменной (чтобы избежать перевычисления).
1
 Аватар для chessman2
163 / 143 / 10
Регистрация: 21.10.2012
Сообщений: 486
28.06.2021, 12:07
Цитата Сообщение от UniHeal Посмотреть сообщение
cond - это условие
if - условие "если"
cond - более общая условная форма и мощнее чем if

Удобна когда нужно проверить более двух вариантов ветвления логики.

https://ru.code-basics.com/lan... ssons/cond

Добавлено через 4 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
хорошо бы присвоить локальной переменной
Ну я написал, что бы начинающему лисперу было понятнее.
Однако мне кажется современные системы могут такие случаи сами оптимизировать.

Сейчас попробую в цикле тест по времени выполнения сделать с локальной переменной и без нее.

Добавлено через 1 час 4 минуты
Цитата Сообщение от chessman2 Посмотреть сообщение
с локальной переменной и без нее
С локальной переменной примерно в два раза быстрее.
Цикл 1000000 раз.

Lisp
1
2
3
4
5
; вариант без локальной переменной
; 983 - миллисекунд
 
; используя let
; 501 - миллисекунд
1
 Аватар для chessman2
163 / 143 / 10
Регистрация: 21.10.2012
Сообщений: 486
28.06.2021, 20:05
Цитата Сообщение от chessman2 Посмотреть сообщение
(define (test a b c)
Lisp
1
2
3
(define (test a b c)
  (let ([p (dmn a b c)])
   (sum-squares (car p) (cadr p)))) ; этот вариант в два раза быстрее
1
 Аватар для zeroalef
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
04.07.2021, 13:38
>
Цитата Сообщение от UniHeal Посмотреть сообщение
можете, пожалуйста подсказать, что именно надо поставить? Спасибо
https://racket-lang.org/ там есть примитивная IDE, а сам язык почти в полной мере включает в себя scheme с мизерным отличием. Для примеров sicp в первой строке можете смело оставлять "директиву"
Lisp
1
#lang racket
>
эти мелкие функции по ходу книги вами будут еще перерабатываться и до более универсальных, поэтому сразу разделяйте задачи на подзадачи и сохраняйте файл, например функция square вам понадобится и дальше.
Цитата Сообщение от UniHeal Посмотреть сообщение
Забыл сказать, по книге пройдено только : if else, cond, square, and, or, not и define... то есть что такое let, test-exercise-1.3, case, error и возможно что-то еще пропустил, не подразумевается что я должен это знать..
тогда пройдитесь еще раз мимолетно по книге, но насколько я помню let-форма действительно описывается далее по книге. Считайте что это локальный define, а вот адаптированный под вас пример от korvin_,
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define (square n)
  (* n n))
 
(define (exercise-1.3 a b c)
  (define xs
    (if (< a b)
        (if (< a c)
            (cons b c)
            (cons a b))
        (if (< b c)
            (cons a c)
            (cons a b))))
  (+ (square (car xs))
     (square (cdr xs))))
Добавлено через 16 минут
Цитата Сообщение от UniHeal Посмотреть сообщение
и код можно было бы упроситить намного, но это ладно
Сам ход мысли не универсален. Взгляните на задачу математически:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i=1}^{i=k} f\(x_{i}\), \{x \in X : x_{i-1} \geq x_{i}\}, \left| X \right| = n, k \le n
и тогда поймете что надо отсортировать данные из n элементов и выбрать из них первые k, а это уже совсем другое решение получится.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.07.2021, 13:38
Помогаю со студенческими работами здесь

Ищем кодера С#
В команду срочно требуется специалист с хорошим знанием C# (знание других языков только плюс). -Достойная оплата -Возможность...

Ищем кодера в проект!
Доброго времени суток дорогие форумчане. Мы начинающий стартап в области Mедиа и PR. Наш проект на данный момент единственный на...

Ищу кодера php
Для модификации плагина fluxx. Мыло: yohoho@elude.in

Ищем кодера в команду
Молодая web-студия ищет в свою команду программиста! Обязанности: Написание сайтов разной сложности с нуля. (От визитки и интернет...

Ищу кодера С++ (конкретика внутри)
Доброе время суток. Нужен программист со знанием С++, ASM(необязательно). Вкратце суть работы, поддержка софта. Точнее все расскажу в...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru