C ++ Tuple vs Struct

На самом деле хорошим практическим примером является Макрос ЦИКЛА Lisp.

http://www.ai.sri.com/pkarp/loop.html

макрос ЦИКЛА состоит просто в том что - макрос Lisp. Все же это в основном определяет мини-цикличное выполнение DSL (Предметно-ориентированный язык).

, Когда Вы просматриваете то небольшое учебное руководство, Вы видите (как раз когда новичок), что трудно знать, какая часть кода является частью макроса Цикла, и который является "нормальным" Lisp.

И это - один из ключевых компонентов, Шепелявит выразительность, что новый код действительно нельзя отличить от системы.

, В то время как в, скажем, Java, Вы не можете (сразу) быть в состоянии знать, какая часть программы прибывает из стандартной библиотеки Java по сравнению с Вашим собственным кодом, или даже сторонней библиотеки, Вы ДЕЙСТВИТЕЛЬНО знаете, какая часть кода является языком Java, а не просто вызовами метода на классах. Предоставленный, это - ВЕСЬ "язык Java", но как программист, Вы ограничены только выражением Вашего приложения как комбинация классов и методов (и теперь, аннотации). Принимая во внимание, что в Lisp, буквально все доступно для всех.

Полагают, что интерфейс Common SQL подключает язык Common LISP к SQL. Здесь, http://clsql.b9.com/manual/loop-tuples.html , они показывают, как макрос Цикла CL расширяется для создания SQL, связывающего "гражданина первого класса".

можно также наблюдать конструкции такой как" [выбор [имя] [фамилия]: от [сотрудника]: порядок - [фамилией]]". Это - часть пакета SQL CL и реализованный как "макрос читателя".

Видят, в Lisp, мало того, что можно сделать макросы для создания новых конструкций, как структуры данных, управляющие структуры, и т.д. Но можно даже изменить синтаксис языка посредством макроса читателя. Здесь, они используют макрос читателя (в случае,' [' символ) для заглядывания к режиму SQL, чтобы заставить SQL работать как встроенный SQL, а не как просто необработанные строки как на многих других языках.

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

язык Common LISP является одной из нескольких сред, где мы можем не только создать наше приложение от вершины вниз, но где мы можем поднять язык и среду для встречи нас половина пути. Мы можем кодировать в обоих концах.

Мышление, столь изящное, как это может быть, это не панацея. Очевидно, существуют другие факторы, которые влияют на язык и выбор среды. Но это, конечно, стоит учиться и играть с. Я думаю, узнавая, что Lisp является отличным способом усовершенствовать Ваше программирование, даже на других языках.

83
задан S.L. Barth - Reinstate Monica 1 August 2012 в 10:56
поделиться

2 ответа

кроме того, действительно ли формат данных совместим друг с другом (попеременно литой)?

Странно я не вижу прямой ответ на эту часть вопроса.

ответ: никакой . Или по крайней мере не надежно, поскольку расположение кортежа является неуказанным.

Во-первых, Ваша структура Стандартный Тип макета . Упорядочивание, дополнение и выравнивание участников четко определены комбинацией стандарта и Вашего ABI платформы.

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

кортеж обычно реализуется с помощью наследования одним из двух способов: старый Дизайн C++ Loki/Modern рекурсивный стиль или более новый стиль variadic. Ни один не Стандартный Тип макета, потому что нарушают следующие условия:

  1. (до C++ 14)

    • не имеет никаких базовых классов с нестатическими элементами данных, или

    • не имеет никаких нестатических элементов данных в большей части производного класса, и самое большее один базовый класс с нестатическими элементами данных

  2. (для C++ 14 и позже)

    • Имеет все нестатические элементы данных и битовые поля, объявленные в том же классе (или все в полученном или все в некоторой основе)

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

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

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

1
ответ дан 24 November 2019 в 08:58
поделиться

Мой опыт состоит в том, что со временем функциональность начинает приближаться к типам (как структуры POD), который раньше был чистыми держателями данных. Вещи как определенные модификации, которые не должны требовать внутреннего знания данных, поддерживая инварианты и т.д.

, Который является хорошей вещью; это - основа объектной ориентации. Это - причина, почему C с классами был изобретен. Используя чистые сборы данных как кортежи не открыты для такого логического расширения; структуры. Вот почему я почти всегда выбирал бы структуры.

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

Другой проблемой является безопасность типов и самодокументирующий код. Если Ваша функция получает объект типа inbound_telegram или location_3D, это ясно; если это получает unsigned char *, или tuple<double, double, double> это не: телеграмма могла быть исходящей, и кортеж мог быть переводом вместо местоположения или возможно чтениями минимальной температуры с длинных выходных. Да, Вы можете определение типа, чтобы ясно дать понять намерения, но который на самом деле не препятствует тому, чтобы Вы передали температуры.

Эти проблемы имеют тенденцию становиться важными в проектах, которые превышают определенный размер; недостатки кортежей и преимущества тщательно продуманных классов становятся не видимыми и действительно являются издержками в маленьких проектах. Запуск с надлежащих классов даже для незаметных небольших агрегатов данных выплачивает последние дивиденды.

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

0
ответ дан 24 November 2019 в 08:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: