LINUX.ORG.RU

В каких языках (или откуда пришло) есть аналог Go iota?

 ,


0

1
package main

import (
	"fmt"
)

const (
	monday = 1 + iota
	tuesday
	wednesday
	thursday
	friday
	saturday
	sunday
)

func main() {
	fmt.Println(monday, tuesday, wednesday, thursday, friday, saturday, sunday)
}

запускаем, получаем:

1 2 3 4 5 6 7
В каких еще языках есть подобная возможность автоматически инкрементировать следующие в объявлении константы (или переменные)? Откуда это взято в Go? Или это нововведение и появилось впервые в именно Go?


Да почти во всех, наверное, только называется не const, а enum. Даже в сях есть. C99, со стековерфлоу.

enum E {
    E0,
    E1,
    E2 = 3,
    E3,
    E4 = INT_MAX,
    /* Compile time error: Overflow in enumeration values */
    /*E5*/
};

/* If unspecified, the first is 0. */
assert(E0 == 0);
assert(E1 == 1);
assert(E2 == 3);
/* Continue from the last one. */
assert(E3 == 4);
assert(E4 == INT_MAX);
anonymous
()
$ gcc -Wall -Wextra main.c -o main -std=c99 -pedantic

$ ./main 
1 2 3 4 5 6 7

$ cat main.c
#include <stdio.h>

enum
{
	monday = 1,
	tuesday,
	wednesday,
	thursday,
	friday,
	saturday,
	sunday
};

int main() {
	printf("%i %i %i %i %i %i %i\n", monday, tuesday, wednesday, thursday, friday, saturday, sunday);
}
d ★★★★
()
Ответ на: комментарий от beastie

APL

The ⍳ (Iota) function will produce a series of numbers from 1 to the number you give it. 

Спасибо, действительно, только в случае Go начинает с 0.

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

Плохо учил, в c89 enum'ы есть.
Добавлять -std=c99 моя вредная привычка.

d ★★★★
()

По твоим сообщениям похоже на то, что ты выучил Go и теперь пытаешься всех и в первую очередь себя убедить, что ты не потратил время зря.

А по теме - навскидку enum в C, C++ и C# ведут себя именно так.

anonymous
()

:)

use enum qw( :_day=1 mon tues wednes thurs fri satur sun );

map { printf "$_ %i\n", eval $_ if /day/ } keys %main::;
monday 1
tuesday 3
saturday 7
thursday 5
sunday 8
friday 6
wednesday 4

а го так может?))

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

опечатка есть. в примере на компе, я поставил tues=3 в enum. А здесь забыл.

Deleted
()

Т.е. в этом goвноязычке нет даже enum'ов?

Begemoth ★★★★★
()

Фишка iota проявляется больше в следующем:

type ByteSize float64
const (
    _           = iota // ignore first value by assigning to blank identifier
    KB ByteSize = 1 << (10 * iota)
    MB
    GB
    TB
    PB
    EB
    ZB
    YB
)

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

Если я правильно понял код, то во-первых это работать не будет, так как << операция для целых чисел и на TB/ZB будет переполнение (если авторы Go не совсем упороты), во-вторых смысл в этом?

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

еще в далёком 1998:

use enum qw( ONE=1 FOUR=iota*iota NINE TEN=10 ELEVEN TWELVE );
Deleted
()
Ответ на: комментарий от Deleted

И что? Где ты там видишь смешивание типов? Сначала выполняют сдвиговую операцию и целочисленное умножение - все это на 32 битных целых. То есть на TB уже идет переполнение (1 << (10 * 4) > 2 ^ 31 - 1) и присваивают это float'у. Что ты своей ссылкой хотел сказать - вообще не ясно.

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

Да и судя по той ссылке такое присвоение даже не должно работать, так как тип ByteSize != int

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

Ну давай расскажи, что мне там не ясно? Или в этом Go << можно применять к float? Тогда авторы еще больше наркоманы, чем я думал. То что применяется сдвиговый оператор ограничивает тип (1 << (10 * iota)) до целочисленных. Поскольку к ByteSize можно присвоить только значение типа ByteSize или untyped float то такое присвоение работать не должно, только если << не разрешено применять к float, но тогда оно будет работать не так как задумано.

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

во-первых это работать не будет

 KB: 1024 
 MB: 1.048576e+06 
 GB: 1.073741824e+09 
 TB: 1.099511627776e+12 
 PB: 1.125899906842624e+15 
 EB: 1.152921504606847e+18 
 ZB: 1.1805916207174113e+21 
 YB: 1.2089258196146292e+24
kep
() автор топика
Ответ на: комментарий от Deleted

И они еще говорят, что в Go все очевидно. И как блядь сдвиговый оператор работает с float или как он выполняет сдвиг дальше границ типа?

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

Еще раз перечитал, в этот раз про int - untyped int является бесконечным типом, то есть со значением справа все ок, теперь вопрос - как оно присвоится константе? Ведь для int типов получится overflow а для float - ошибка типа.

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

<< операция для целых чисел

Даже в Си++ это уже не обязательно так :)

KRoN73 ★★★★★
()

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

ovk48 ★★★
()
CL-USER> (loop :for i :upfrom 1
                :for day :in '(monday tuesday wednesday
                               thursday friday  saturday sunday)
                :do (setf (symbol-value day)
                          i))
NIL
CL-USER> (format t "~{~A~^, ~}"
                  (list monday tuesday wednesday
                        thursday friday saturday sunday))
1, 2, 3, 4, 5, 6, 7
NIL
CL-USER> 
ados ★★★★★
()
Ответ на: комментарий от ados

Хе-хе, сжато, лаконично и немногословно, ничего не скажешь! :)

Но мы ведь не договаривались использовать циклы-то.

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

Хе-хе, сжато, лаконично и немногословно, ничего не скажешь! :)

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

anonymous
()

Это уродливый костыль для полноценной замены enum'ов из C/C++.

anonymous
()
28 октября 2015 г.
Ответ на: комментарий от kep

Сам ты доширак. У меня хотя бы на человеческом языке описано и всё по существу. А если для розовых феечек итерации покрывают сахаром то это не значит что вы их не используете.

ados ★★★★★
()

Пиздуй

Как несложно догадаться по топику сегодня мы будем говорить о новом, модном, молодёжном говне языке go. Для начала факты:

1. Я не знаю чем думала копчёная индусская обезьяна которая называла язык «go». Очевидную проблему решили костылями - можно кое-как искать по «golang». Созададим трудности и героически их преодолеем.

2. У многих хороших девелоперов код на го вызывает стойкое отвращение. Меня вот например так тошнило только от перла. Индусня, ЧСХ, довольна. Это, ящетаю, заявка на победу.

3. Язык и все окружающие его либы находятся в статусе преальфа. Ну вот ошибки в стандартных либах класса «тихо игноируем хттп ошибку полученную от сервера», такое.

4. Хипстота на хипстоте и хипстотой погоняет. Ну вот например import «github.com/vlastelin/analpleasures». Да, только мастер, только хардкор. Из этого имеем простое следствие - если кто то достаточно туп что бы использовать это поделие в продакшне, то либы он будет импортить именно так. Это, очевидно, приводит к народным хипсторским забавам вида «8 часов судорожно ищем как именно был собран предыдущий билд который вроде как работал».

А теперь плохие новости - это вот говно было сделано гугелем что бы его тупая индусня высококвалифицированные сотрудники могли писать хоть какой то код в современных реалиях (ну - 100500 ядер на процессоре, всё вот это). Такой вот новый петон. Следовательно это говно будет расползаться везде и избежать встречи с ним вы не сможете.

Ну вот как то так.

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