Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886

Lisp без скобок

10.01.2020, 12:33. Показов 4801. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему бы не заменить скобки отступами? Всё-равно код приходится форматировать отступами, так как неотформатированный код нечитабелен.

Достаточно простого, однопроходного препроцессора. Наверное, можно даже макрос на Lisp написать.

Чтобы код:
Lisp
1
2
3
4
5
6
7
8
9
10
(define (sqrt x)
  (define (good-enough? guess)
    (< (abs (- (square guess) x)) 0.001))
  (define (improve guess)
    (average guess (/ x guess)))
  (define (sqrt-iter guess)
    (if (good-enough? guess)
        guess
        (sqrt-iter (improve guess))))
  (sqrt-iter 1.0))
Выглядел так:
Lisp
1
2
3
4
5
6
7
8
9
10
define (sqrt x)
  define (good-enough? guess)
    < (abs (- (square guess) x)) 0.001
  define (improve guess)
    average guess (/ x guess)
  define (sqrt-iter guess)
    if (good-enough? guess)
       guess
       sqrt-iter (improve guess)
  sqrt-iter 1.0
Для того, чтобы превратить второй код в первый, достаточно в начале каждой строки поставить открывающую скобку, а закрывающую поставить после последней "смещённой вправо" (позиция первого символа больше) строки.
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2020, 12:33
Ответы с готовыми решениями:

Операторный стиль Lisp-а, без использования рекурсии
Здравствуйте, помогите пожалуйста решить задачу: Есть список вида: ((1(2 3)4)(5 6 (7 8 9))(10 (11 12 13)(14 15 16))) необходимо его...

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и Common Lisp.Только не всякие...

Организация циклов в Lisp (bee lisp demo)
разбираюсь с простыми задачами, эти пока не знаю, как решать... помогите пожалуйста. 1. Слова в предложении разделены пробелами....

15
331 / 199 / 9
Регистрация: 12.05.2015
Сообщений: 334
12.01.2020, 16:00
Цитата Сообщение от Shamil1 Посмотреть сообщение
Почему бы не заменить скобки отступами? Всё-равно код приходится форматировать отступами, так как неотформатированный код нечитабелен.
Если вспомнить про Code<=>Data в макросах то удобство сомнительное.
А так вроде никто не мешает. приниципиальная Возможность в стандарт заложена и это дело время от времени переизобретают что бы вновь уйти в забвение
https://cliki.net/readable
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
12.01.2020, 16:24
А потом окажется, что лямбды можно только однострочные.
1
Заблокирован
13.01.2020, 09:14
А зачем? Если говорить о блочной структуре scheme, то будет не понятно где начинается внутреннее определение, и где оно заканчивается
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
13.01.2020, 12:28  [ТС]
Цитата Сообщение от sodda Посмотреть сообщение
Если говорить о блочной структуре scheme, то будет не понятно где начинается внутреннее определение, и где оно заканчивается
По отступам понятно. (аналогично можно убрать фигурные скобки и точки с запятой из Си).
И при желании можно записать всё в одну строку, используя скобки (как и раньше).

Цитата Сообщение от helter Посмотреть сообщение
А потом окажется, что лямбды можно только однострочные.
Lisp
1
2
3
4
5
6
7
8
9
10
11
define (sqrt x)
  define (good-enough? guess)
    < (abs (- (square guess) x)) 0.001
  define (sqrt-iter guess)
    if (good-enough? guess)
       guess
       sqrt-iter 
          lambda (g) 
             average g (/ x g)
          guess
  sqrt-iter 1.0
Теоретически, можно усложнить правила, чтобы можно было писать
Lisp
1
2
sqrt-iter (lambda (g) 
              average g (/ x g)) guess
но не думаю, что это оправдано.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
14.01.2020, 01:50
А как понять, что в восьмой строке guess, а не (guess)?
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
14.01.2020, 22:58  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
А как понять, что в восьмой строке guess, а не (guess)?
Если в строке одно слово, то скобки не добавляются.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
15.01.2020, 00:21
А в другом примере, где lambda после sqrt-iter, это последнее слово без скобок. Наверно, надо к этой поправке добавить поправку об индентации следующей строки, особенно на случай форм типа begin/progn.

Добавлено через 1 минуту
А вот пустую begin, наверно, либо со скобками записывать, либо вводить слово pass.

Добавлено через 11 минут
Ещё для тех лиспов, где есть ключевые слова, нужно и для них внести поправки, чтобы можно было писать
Lisp
1
2
(connect :host "localhost"
         :port 4005)
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 14
15.01.2020, 09:37
Цитата Сообщение от Shamil1 Посмотреть сообщение
Почему бы не заменить скобки отступами?
- идея занятная. Но такой текст будет легко "испортить". см. двумерный синтаксис в Питоне или Хаскелле. Я не против двумерного синтаксиса (наоборот!) - но проблемы "табуляция - пробелы" - это нечто!

И, главное, зачем убирать скобки из Лиспа? Популярности Лиспу это вряд ли прибавит. А тем, кто Лисп "принял душой", скобки не мешают.

Своего мнения не навязываю.
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
15.01.2020, 10:09  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
проблемы "табуляция - пробелы" - это нечто!
Нужен редактор, который автоматически заменяет табуляцию на пробелы. В правильных редакторах для Haskell, F# и т.п. такой проблемы нет.

Цитата Сообщение от Catstail Посмотреть сообщение
А тем, кто Лисп "принял душой", скобки не мешают.
При правильном форматировании проблем нет. Но код из первого сообщения можно отформатировать так:
Lisp
1
2
3
4
5
6
7
(define (sqrt x) (define (good-enough? 
    guess) (< (abs (- (square guess) x)) 
    0.001)) (define (improve guess) 
    (average guess (/ x guess))) (define 
    (sqrt-iter guess) (if (good-enough? 
    guess) guess (sqrt-iter (improve 
    guess)))) (sqrt-iter 1.0))
И тогда сложно разобраться, что же он делает.
На практике вряд ли кто-нибудь считает скобки - скорее полагаются на то, что количество скобок соответствует форматированию.

Мне даже в C# скобки (фигурные) мешают (и точки с запятой тоже). Занимают место на экране. А при рефакторинге делают весь код ниже невалидным на время, что сильно замедляет работу интеллисенс и прочих анализаторов кода. ИМХО "позиционный" синтаксис лучше "скобочного".
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
15.01.2020, 10:13  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Ещё для тех лиспов, где есть ключевые слова, нужно и для них внести поправки, чтобы можно было писать
Изначально идея была чуть сложнее: смысл кода зависел от позиции начала следующей строки по отношению к началу слов предыдущей (а не только началу предыдущей строки). Но потом я решил, что это уже излишнее усложнение. Проще добавить символ "продолжение строки":
Lisp
1
2
connect :host "localhost" \\
        :port 4005
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
15.01.2020, 13:04
Лучший ответ Сообщение было отмечено transformator.t как решение

Решение

Цитата Сообщение от Shamil1 Посмотреть сообщение
смысл кода зависел от позиции начала следующей строки по отношению к началу слов предыдущей (а не только началу предыдущей строки)
Сейчас тоже так, или же
Lisp
1
2
3
sqrt-iter 
  lambda (g) 
    average g (/ x g)
тоже надо продолжение строки указывать (так как sqrt-iter стоит сам по себе, он не станет заворачиваться в скобки).

Цитата Сообщение от Catstail Посмотреть сообщение
И, главное, зачем убирать скобки из Лиспа?
Не, из лиспа категорически нельзя убирать скобки. Уже сейчас, без попытки что-то реализовать, видно, насколько лисповая идея "пробелы разделяют, скобки группируют" проще. Это случай гениальной простоты. Мы все свидетели, что совокупность разделения и группировки, опирающаяся на идею неоднородного списка, имеет достаточно выразительной способности, чтобы на ней программировать. Поэтому с помощью двух этих операций можно выразить что угодно. Другими словами, с помощью S-выражений можно формализовать что угодно (что можно формализовать). Мне нравятся примеры из начала PAIP, где Норвиг загоняет грамматические правила в S-выражения, и делает замечание, что при работе со сложной областью имеет смысл изначально использовать как можно более естественную нотацию. Вообще, создание формализаций - дело непростое, поэтому хорошо, если инструмент не создаёт лишнего шума. Мы не считаем скобки, но, вероятно, нам не очень сложно мыслить ими, то есть через группировку. Лично я бы предпочёл про создании DSL не отвлекаться на отступы, продолжения строки, и питоновское двоеточие. Мы группируем скобками, а редактор делает красиво.

Запись S-выражениями - вид формализации, не обязательно подразумевающий лисп. Однако лисп имеет преимущество при работе с ними, потому что их можно трактовать хоть как данные, хоть как код.

Кроме прочего, что показывается практика программирования на отступах? "Код на питоне читается как псевдокод!" - больше ничего не приходит на ум. Всё вполне заурядно, включая тенденцию к уменьшению уровня вложенности. S-выражения - киллер-фича, а отступы не киллер-фича.
3
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
15.01.2020, 14:04  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
sqrt-iter стоит сам по себе, он не станет заворачиваться в скобки
Так как следующая строка имеет больший отступ, то в начале этой строки будет поставлена открывающая скобка, а закрывающая будет поставлена в конце группы строк, имеющих больший отступ (то есть, после guess в строке 10).
Lisp
1
2
3
4
5
       (sqrt-iter 
          lambda (g) 
             average g (/ x g)
          guess)
  sqrt-iter 1.0
Добавлено через 48 минут
Цитата Сообщение от helter Посмотреть сообщение
Это случай гениальной простоты.
Я согласен.

Цитата Сообщение от helter Посмотреть сообщение
Другими словами, с помощью S-выражений можно формализовать что угодно (что можно формализовать).
Это основное достоинство Лиспа и его преимущество над другими языками. Но читать не совсем удобно, так как некоторые вещи записываются длиннее, чем могли бы. Более длинный код дольше читать. Кроме того, меньше кода уменьшается на один экран и чаще встречаются ситуации, когда для того, чтобы понять код, приходится скролить. И из-за этого код ещё дольше читать. Говоря "дольше", я сравниваю не с каким-то конкретным языком, а с неким несуществующим идеальным языком.
ИМХО было бы удобно использовать некоторые дополнительные соглашения по синтаксису S-выражений - запись без скобок, операторы, частичное применение, генераторы коллекций, явное задание стратегии вычислений и т.п.
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,378
17.01.2020, 13:43
Цитата Сообщение от Shamil1 Посмотреть сообщение
Почему бы не заменить скобки отступами?
получится питон
0
Заблокирован
21.01.2020, 23:21
Оставлю тут..
Язык Shen. Выглядит как какая-то смесь Sheme, CL, CLojure, ML и Prolog.
Подробнее тут

вот пример qsort на языке


JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
(define filter
  {(A --> boolean) --> (list A) --> (list A)}
  _   []      -> []
  T?  [A | B]  -> (append [A] (filter T? B)) where (T? A)
  T?  [_|B]    -> (filter T? B)
)
  
(define q-sort
  {(list number) --> (list number)}
  [] -> []
  [A | B] -> (append (q-sort (filter (> A) [A|B]))
                     [A]
                     (q-sort (filter (< A) [A|B]))))
1
Заблокирован
22.01.2020, 15:56
Почитал вчера немного мануал - прикольная штука. Можно сопоставить с Clojure. Реализован, кстати, на Common Lisp.

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

Lisp
1
2
3
4
5
6
(define total
        [] -> 0
        [X | Y] -> (+ X (total Y)))
 
(total [10 20 4])
=> 34
Тут используется сопоставление и деструктуризация, так если бы использовали в Clojure cond и механизм деструктуризации.
В коде выше - X соответствует первому элементу (first coll), a Y хвосту (rest coll)


Lisp
1
2
3
4
5
6
(defn total [[x & xs]]
     (cond (empty? (rest xs)) (last xs)
               :else (+ x (total xs))))
 
(total [10 20 4])
=> 34
Lisp
1
2
3
4
5
6
(define triples
        [] -> []
        [W X Y | Z] -> [[W X Y] | (triples Z)])
 
(triples [1 2 3 4 5 6])
=> [[1 2 3] [4 5 6]]
Lisp
1
2
3
4
5
6
(defn three-prts [[x y z & xs]] 
     (cond (empty? (rest xs)) (cons [x y z] []) 
               :else (cons [x y z] (three-prts xs))))
 
three-prts [1 2 3 4 5 6 7])
=> ([1 2 3] [4 5 6])
Добавлено через 58 минут
Подумал, как можно избавится от лишнего когда типа (empty? (rest xs)) и вспомнил про безусловное выполнение в CL.
Так будет лучше.



Lisp
1
2
3
(defn three-prts [[x y z & xs]] 
     (cond (empty? xs)  [] 
               true (cons [x y z] (three-prts xs))))
Добавлено через 6 минут
Lisp
1
2
3
(defn total [[x & xs]]
     (cond (empty? xs) x 
               true (+ x (total xs))))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2020, 15:56
Помогаю со студенческими работами здесь

Парсер lisp на lisp
Здравствуйте! Решил написать компилятор racket (диалект lisp) на racket, для того, чтобы легко можно было проверить его полноценность...

Последовательные импликации без скобок
Ребят, подскажите, пожалуйста, попалась задача на построение таблицы истинности с выражением a\rightarrow b\rightarrow c. Можно ли разбить...

Вывести ответ без скобок
Можно ли сделать так чтобы ответ был без скобок? (не меняя суть программы).

Делегаты и метода со скобками и без скобок
В учебнике Шилдта ссылка делегата присваивается методу без скобок и со скобками. Например, со скобками Countlt count = Counter (); и...

Макрос вызова функции без скобок
Вообщем хочется получить что-то вроде этого: #include &lt;iostream&gt; using namespace std; #define For ....... int main() { ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru