Базовая Clojure: Как сделать серию if-then?

Все еще пытаюсь обернуть мою голову вокруг Clojure. Я вижу, как реализовать следующее в Haskell, Python и т. Д., Но пока не понимаю, как написать это в Clojure. Цените, если кто-то может показать мне основную структуру. Псевдокод ниже.

a = get_a
if (a == bad_value) then throw exception_a
b = get_b
if (b == bad_value) then throw exception_b
c = get_c
if (c == bad_value) then throw exception_c
...
do_action_with a b c

Будет ли это набором слов, а затем финальным выражением? Спасибо. Я хочу использовать sizeof, чтобы быть безопасным / педантичным. typedef struct _parent {float calc; текст char [255]; Int используется; } parent_t; ...

Я пытаюсь объявить структуру, которая зависит от другой структуры. I want to use sizeof to be safe/pedantic.

typedef struct _parent
{
  float calc ;
  char text[255] ;
  int used ;
} parent_t ;

Now I want to declare a struct child_t that has the same size as parent_t.text.

How can I do this? (Pseudo-code below.)

typedef struct _child
{
  char flag ;
  char text[sizeof(parent_t.text)] ;
  int used ;
} child_t ;

I tried a few different ways with parent_t and struct _parent, but my compiler will not accept.

As a trick, this seems to work:

parent_t* dummy ;
typedef struct _child
{
  char flag ;
  char text[sizeof(dummy->text)] ;
  int used ;
} child_t ;

Is it possible to declare child_t without the use of dummy?

101
задан jww 21 September 2018 в 16:53
поделиться

5 ответов

Хотя определение размера буфера с помощью #define - это один идиоматический способ сделать это, другой способ - использовать такой макрос:

#define member_size(type, member) sizeof(((type *)0)->member)

и использовать его как это:

typedef struct
{
    float calc;
    char text[255];
    int used;
} Parent;

typedef struct
{
    char flag;
    char text[member_size(Parent, text)];
    int used;
} Child;

На самом деле я немного удивлен, что sizeof ((type *) 0) -> member) разрешено даже в качестве константного выражения. Крутая вещь.

185
ответ дан 24 November 2019 в 04:38
поделиться

Я сейчас не на своей машине для разработки, но я думаю, что вы можете сделать одно из следующего:

sizeof(((parent_t *)0)->text)

sizeof(((parent_t){0}).text)


Edit : Мне нравится макрос member_size, который Джои предложил использовать эту технику, я думаю, я бы его использовал.
28
ответ дан 24 November 2019 в 04:38
поделиться

Вы можете использовать директиву препроцессора для size as:

#define TEXT_MAX_SIZE 255

и использовать ее как в родительском, так и в дочернем файле.

4
ответ дан 24 November 2019 в 04:38
поделиться

Используйте директиву препроцессора, например #define:

#define TEXT_LEN 255

typedef struct _parent
{
  float calc ;
  char text[TEXT_LEN] ;
  int used ;
} parent_t ;

typedef struct _child
{
  char flag ;
  char text[TEXT_LEN] ;
  int used ;
} child_t ;
9
ответ дан 24 November 2019 в 04:38
поделиться

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

typedef char description[255];

, а затем иметь поле

description text;

в обоих ваших типах.

4
ответ дан 24 November 2019 в 04:38
поделиться
Другие вопросы по тегам:

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