LINUX.ORG.RU

Вопрос по lisp (scheme). Почему Nil заменили на false.


0

3

Здравствуйте. Начал недавно изучать Lisp. Сначала смотрел CL, потом приглянулась scheme, и возник вопрос, на который никак не могу найти ответа в гугле. Почему создатели scheme заменили «классический» лисповский Nil на false. Я так понимаю, этому должны были быть веские причины, ведь это введение дополнительной сущности в семантику языка, который изначально позиционировался как максимально простой и прозрачный, т.е. получается некое усложнение вместо упрощения. Причем, как я понимаю, это не просто синтаксический сахар.


Потому что ввели отдельный тип boolean (что, извиняюсь за каламбур, вполне логично). Тогда как nil это частный случай list.

anonymous
()
Ответ на: комментарий от new_1

Потому что пустой список и #f это разные вещи. Отдельные символы нужны для однозначной интерпретации результата функции.

power
()
Ответ на: комментарий от power

Потому что пустой список и #f это разные вещи

Вообще-то в Lisp-1.5 и CL это вроде одно и то же. А например выражение (+ 1 1) и константа 2 - это тоже разные вещи?

new_1
() автор топика
Ответ на: комментарий от psv1967

а я хочу сказать --- чтоб ты всю жизнь ассемблером пользовался :) может поймешь тогда зачем

Я просто не догоняю, если бы просто ввели как синтаксический сахар - тогда нет вопросов. Но ведь теперь () есть true - вот что непонятно.

new_1
() автор топика

Потому что в Scheme есть понятие «чистых» предикатов, то есть функций, которые могут возвращать только #t или #f. А еще в Scheme строгое разделение типов и существует набор встроенных предикатов для типовой проверки. Для каждого значения истинным будет только один из таких предикатов. Например, (boolean? #f) — истина, но (boolean? '()) — ложь. Все логично и стройно.

buddhist ★★★★★
()
Ответ на: комментарий от new_1

Вообще-то в Lisp-1.5 и CL это вроде одно и то же.

«Одно и то же» только с точки зрения Lisp-1.5 и CL. А вообще разные :)

А например выражение (+ 1 1) и константа 2 - это тоже разные вещи?

Конечно разные. Но с одинаковым результатом выполнения.

Не понимаю, в чем проблема? Почему тебя это так смущает?

power
()
Ответ на: комментарий от power

Почему тебя это так смущает

потому что, говорят, что константы вычисляются сами в себя, и если выражения (разные) вычисляются в одинаковый результат, то это , по сути, как-бы одно и то-же. Это больше, может-быть философия, но мне это показалось в начале, фишкой лиспа.

new_1
() автор топика
Ответ на: комментарий от buddhist

Почитайте Sketchy Scheme, например.

А там эта тема поднимается?

new_1
() автор топика
Ответ на: комментарий от new_1

CL

В CL есть #f? Вот уж открытие!

А вот для Lisp-1.5 это действительно так.

выражение (+ 1 1) и константа 2 - это тоже разные вещи

Конечно разные. (+ 1 1) — список. Это результаты их вычисления одинаковые.

Заметьте, что () — атом в Lisp-1.5

buddhist ★★★★★
()
Ответ на: комментарий от new_1

ЕМНИП, там поднимается тема целесообразности системы типов в Scheme в том виде в каком она сейчас существует вообще.

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

В CL есть #f? Вот уж открытие!

Да, но там это вроде бы эквивалент Nil, синтаксический сахар, как я понимаю.

new_1
() автор топика
Ответ на: комментарий от buddhist

ЕМНИП, там поднимается тема целесообразности системы типов в Scheme в том виде в каком она сейчас существует вообще.

Спасибо, буду читать.

new_1
() автор топика
Ответ на: комментарий от new_1

Проверил в CLISP и SBCL — ругаются на #f.

Sketchy Scheme вообще, имхо, одна из лучших книг именно по схеме, раскладывающая все по полочкам. Первая книга, из которой я когда-то понял, что такое продолжения и зачем они нужны :)

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

Sketchy Scheme вообще, имхо, одна из лучших книг именно по схеме, раскладывающая все по полочкам. Первая книга, из которой я когда-то понял, что такое продолжения и зачем они нужны :)

У тебя бумажная версия?

power
()
Ответ на: комментарий от new_1

new_1!

Возможно, вы и без меня это знаете, но есть ещё и такое соображение.

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

всякое пустое множество (nil) трактуется как false.

livi
()
Ответ на: комментарий от livi

Разумеется, пустое множество у нас только одно,
так что правильнее - «всякий раз, когда возникает пустое множество, оно ...»

livi
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.