Отдельные пространства имен для функций и переменных в Common Lisp и Scheme

Используйте typealias

class Address {
    var someProperty: String?
}

typealias GlobalAddress = Address

class ThirdPartyAPI {
    class Address {
        var someOtherProperty: String?
        init(fromAddress address: GlobalAddress) {
            self.someOtherProperty = address.someProperty
        }
    }
}
30
задан Rainer Joswig 19 January 2015 в 09:30
поделиться

6 ответов

У двух разных подходов есть имена: Lisp-1 и Lisp-2. Lisp-1 имеет единое пространство имен для переменных и функций (как в Scheme), тогда как Lisp-2 имеет отдельные пространства имен для переменных и функций (как в Common Lisp). Я упоминаю об этом, потому что вы, возможно, не знаете терминологию, так как вы не упоминали ее в своем вопросе.

Википедия ссылается на эту дискуссию :

Является ли отдельное пространство имен для функций Преимущество является источником разногласий в сообществе Lisp. Обычно это называют дебатами Лисп-1 против Лисп-2. Lisp-1 относится к модели Scheme, а Lisp-2 относится к модели Common Lisp. Эти названия были придуманы Ричардом П. Габриэлем и Кентом Питманом в 1988 году, в котором подробно сравниваются эти два подхода.

Габриэль и Питман '

22
ответ дан 28 November 2019 в 00:15
поделиться

На самом деле, как указано в статье Ричарда Габриэля и Кента Питмана , спор идет о Лисп-5 против Лисп-6, поскольку там уже есть несколько других пространств имен в документе упоминаются имена типов, имена тегов, имена блоков и имена деклараций. edit: это кажется неправильным, как указывает Райнер в комментарии: Scheme на самом деле кажется Lisp-1. Однако эта ошибка в значительной степени не влияет на следующее:

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

Я знаю, что сторонникам Lisp-5 нравится тот факт, что функции являются данными, и что это выражено в ядре языка. Мне нравится тот факт, что я могу назвать список «списком» и машину «автомобилем», не запутывая мой компилятор, а функции в любом случае представляют собой принципиально особый вид данных. править: это моя основная мысль: отдельные пространства имен - это вовсе не бородавка.

Мне также понравилось то, что Паскаль Констанца сказал об этом.

Я знаю, что сторонникам Лисп-5 нравится тот факт, что функции - это данные, и что это выражено в ядре языка. Мне нравится тот факт, что я могу назвать список «списком» и машину «автомобилем», не запутывая мой компилятор, а функции в любом случае представляют собой принципиально особый вид данных. править: это моя основная мысль: отдельные пространства имен - это вовсе не бородавка.

Мне также понравилось то, что Паскаль Констанца сказал об этом.

Я знаю, что сторонникам Лисп-5 нравится тот факт, что функции - это данные, и что это выражено в ядре языка. Мне нравится тот факт, что я могу назвать список «списком» и машину «автомобилем», не запутывая мой компилятор, а функции в любом случае представляют собой принципиально особый вид данных. править: это моя основная мысль: отдельные пространства имен - это вовсе не бородавка.

Мне также понравилось то, что Паскаль Констанца сказал об этом.

11
ответ дан 28 November 2019 в 00:15
поделиться

Я встречал подобное различие в Python (единое пространство имен) и Ruby (отдельные пространства имен для методов и не методов). В этом контексте я предпочитаю подход Python - например, с этим подходом, если я хочу составить список вещей, некоторые из которых являются функциями, а другие нет, мне не нужно делать ничего другого с их именами. , например, в зависимости от их "функциональности". Аналогичные соображения применимы ко всем случаям, в которых функциональные объекты должны быть переданы, а не вызваны (аргументы и возвращаемые значения из функций высшего порядка и т. Д. И т. Д.).

Не-функции также могут быть вызваны (если их классы определяют __ call __ , в случае Python - особый случай «перегрузки оператора»), поэтому «контекстное различие» не

2
ответ дан 28 November 2019 в 00:15
поделиться

Имя функции в схеме - это просто переменная, значение которой является функцией. . Независимо от того, выполняю ли я (define x (y) (zy)) или (let ((x (lambda (y) (zy)))) , я определяю функцию, которая Я могу позвонить. Итак, идея, что "

1
ответ дан 28 November 2019 в 00:15
поделиться

Самый большой недостаток, который я вижу, по крайней мере для Common Lisp, - это понятность. Мы все можем согласиться с тем, что он использует разные пространства имен для переменных и функций, но сколько их у него? В PAIP Норвиг показал, что у него есть «как минимум семь» пространств имен.

Когда одна из классических книг по языку, написанная очень уважаемым программистом, не может даже сказать наверняка в опубликованной книге, я думаю, что есть проблема . У меня нет проблем с несколькими пространствами имен, но я бы хотел, чтобы язык был, по крайней мере,

1
ответ дан 28 November 2019 в 00:15
поделиться

У обоих подходов есть свои плюсы. Однако я считаю, что, когда это важно, я предпочитаю иметь и функцию LIST, и переменную LIST, чем писать одну из них неправильно.

0
ответ дан 28 November 2019 в 00:15
поделиться