Используйте typealias
class Address {
var someProperty: String?
}
typealias GlobalAddress = Address
class ThirdPartyAPI {
class Address {
var someOtherProperty: String?
init(fromAddress address: GlobalAddress) {
self.someOtherProperty = address.someProperty
}
}
}
У двух разных подходов есть имена: Lisp-1 и Lisp-2. Lisp-1 имеет единое пространство имен для переменных и функций (как в Scheme), тогда как Lisp-2 имеет отдельные пространства имен для переменных и функций (как в Common Lisp). Я упоминаю об этом, потому что вы, возможно, не знаете терминологию, так как вы не упоминали ее в своем вопросе.
Википедия ссылается на эту дискуссию :
Является ли отдельное пространство имен для функций Преимущество является источником разногласий в сообществе Lisp. Обычно это называют дебатами Лисп-1 против Лисп-2. Lisp-1 относится к модели Scheme, а Lisp-2 относится к модели Common Lisp. Эти названия были придуманы Ричардом П. Габриэлем и Кентом Питманом в 1988 году, в котором подробно сравниваются эти два подхода.
Габриэль и Питман '
На самом деле, как указано в статье Ричарда Габриэля и Кента Питмана , спор идет о Лисп-5 против Лисп-6, поскольку там уже есть несколько других пространств имен в документе упоминаются имена типов, имена тегов, имена блоков и имена деклараций. edit: это кажется неправильным, как указывает Райнер в комментарии: Scheme на самом деле кажется Lisp-1. Однако эта ошибка в значительной степени не влияет на следующее:
Обозначает ли символ что-то, что нужно выполнить, или что-то, на что следует ссылаться, всегда ясно из контекста. Помещение функций и переменных в одно и то же пространство имен в первую очередь является ограничением: программист не может использовать одно и то же имя для вещи и действия. В результате Lisp-5 избегает некоторых синтаксических накладных расходов для ссылки на что-то из другого пространства имен, чем то, что подразумевает текущий контекст. править: это не вся картина, только поверхность.
Я знаю, что сторонникам Lisp-5 нравится тот факт, что функции являются данными, и что это выражено в ядре языка. Мне нравится тот факт, что я могу назвать список «списком» и машину «автомобилем», не запутывая мой компилятор, а функции в любом случае представляют собой принципиально особый вид данных. править: это моя основная мысль: отдельные пространства имен - это вовсе не бородавка.
Мне также понравилось то, что Паскаль Констанца сказал об этом.
Я знаю, что сторонникам Лисп-5 нравится тот факт, что функции - это данные, и что это выражено в ядре языка. Мне нравится тот факт, что я могу назвать список «списком» и машину «автомобилем», не запутывая мой компилятор, а функции в любом случае представляют собой принципиально особый вид данных. править: это моя основная мысль: отдельные пространства имен - это вовсе не бородавка.
Мне также понравилось то, что Паскаль Констанца сказал об этом.
Я знаю, что сторонникам Лисп-5 нравится тот факт, что функции - это данные, и что это выражено в ядре языка. Мне нравится тот факт, что я могу назвать список «списком» и машину «автомобилем», не запутывая мой компилятор, а функции в любом случае представляют собой принципиально особый вид данных. править: это моя основная мысль: отдельные пространства имен - это вовсе не бородавка.
Мне также понравилось то, что Паскаль Констанца сказал об этом.
Я встречал подобное различие в Python (единое пространство имен) и Ruby (отдельные пространства имен для методов и не методов). В этом контексте я предпочитаю подход Python - например, с этим подходом, если я хочу составить список вещей, некоторые из которых являются функциями, а другие нет, мне не нужно делать ничего другого с их именами. , например, в зависимости от их "функциональности". Аналогичные соображения применимы ко всем случаям, в которых функциональные объекты должны быть переданы, а не вызваны (аргументы и возвращаемые значения из функций высшего порядка и т. Д. И т. Д.).
Не-функции также могут быть вызваны (если их классы определяют __ call __
, в случае Python - особый случай «перегрузки оператора»), поэтому «контекстное различие» не
Имя функции в схеме - это просто переменная, значение которой является функцией. . Независимо от того, выполняю ли я (define x (y) (zy))
или (let ((x (lambda (y) (zy))))
, я определяю функцию, которая Я могу позвонить. Итак, идея, что "
Самый большой недостаток, который я вижу, по крайней мере для Common Lisp, - это понятность. Мы все можем согласиться с тем, что он использует разные пространства имен для переменных и функций, но сколько их у него? В PAIP Норвиг показал, что у него есть «как минимум семь» пространств имен.
Когда одна из классических книг по языку, написанная очень уважаемым программистом, не может даже сказать наверняка в опубликованной книге, я думаю, что есть проблема . У меня нет проблем с несколькими пространствами имен, но я бы хотел, чтобы язык был, по крайней мере,
У обоих подходов есть свои плюсы. Однако я считаю, что, когда это важно, я предпочитаю иметь и функцию LIST, и переменную LIST, чем писать одну из них неправильно.