11.02.2015, 14:15  [ТС]
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от Ev_Hyper Посмотреть сообщение
C#, F#, Lisp, Java
Никогда не сравнятся с чистым C, пора бы уже это знать. Больше на оффтоп не отвечаю.

0
Заблокирован
11.02.2015, 14:18
Dennis Ritchie, создавайте отдельную тему, поговорим и об этом...Каждый яп решает какую-то задачу. Для одной - лучше C, для другой - c#, для третьей - lisp или другой функ. язык...
Для каких задач D подходит лучше остальных? Насколько я понимаю таких нет -> D не нужен.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.02.2015, 14:50  [ТС]
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Я не увидел, можно ли задать произвольное условие условной компиляции в командной строке, типа -DUSE_MYLIB12 и в коде как то
Specify -version=USE_MYLIB12 on the command line.
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Может так быть, что с использованием опциональной библиотеки код корректен, а без неё нет.
No, that's not possible. Syntactically correct != semantically
correct. It just means that the syntax rules of the language are
respected, e.g. parens must be correctly nested (no [} or
something like that). Since D libraries can't affect the syntax
of the language, no code can be syntactically correct only in
that library's presence.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import std.stdio;
 
void foo(int *label) {
    int res;
 
    writeln("Enter a label: ");
 
    readf(" %s", &res);
 
    *label = res;
}
 
void main()
{
    int label = 0;
 
    writeln("label = ", label);
 
    a:
    foreach (i; 0 .. 5) {
        write('1');
        b:
        foreach (j; 0 .. 5) {
            write('2');
            c:
            foreach (k; 0 .. 5) {
                write('3');
                d:
                foreach (l; 0 .. 5) {
                    write('4');
                    e:
                    foreach (m; 0 .. 5) {
                        writeln('5');
                        foo(&label);
                        writeln("newlabel = ", label);
                        switch (label) {
                        case 1:
                            continue a;
                        case 2:
                            continue b;
                        case 3:
                            continue c;
                        case 4:
                            continue d;
                        case 5:
                            continue e;
                        default:
                            writeln("The end!");
                            break a;
                        }
                    }
                }
            }
        }
    }
}
http://ideone.com/mB5ylv
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
11.02.2015, 14:53
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
В этой теме я хотел обсудить улучшения или ухудшения в языке D по сравнению с C++. Надеюсь, я понятно выразился.
И какие будут проблемы с указанным примером в C++? goto отменили?
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.02.2015, 15:03  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
И какие будут проблемы с указанным примером в C++? goto отменили?
Никаких. Но новые операторы continue label и break label работают намного удобнее, чем в C++.
Например, вы не сможете одновременно с помощью goto прервать или продолжить цикл с помощью одной и той же метки. Вам придётся создать два оператора goto: один для метки перед циклом (для продолжения), другой goto для метки за циклом (для прерывания). Я правильно размышляю?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
11.02.2015, 15:10
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Но новые операторы continue label и break label работают намного удобнее, чем в C++.
Удобнее.Но признайтесь,часто вы такими приемами хотели бы пользоваться?
Кстати это не новинка,подобная возможность в Perl5 давно была реализована.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.02.2015, 15:11  [ТС]
К тому же оператор goto делает это неочевидно. Переходит к какой-то метке и делает непонятно что. Здесь же программист сразу видит для чего предназначена метка (для явного продолжения или для явного брейка). Оператор goto также сохранён в D. Так что в этом случае я вижу преимущество D перед С++.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
11.02.2015, 15:18
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Но новые операторы continue label и break label работают намного удобнее, чем в C++.
Никаких отличий. Абсолютно одинаково.

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Например, вы не сможете одновременно с помощью goto прервать или продолжить цикл с помощью одной и той же метки.
И? Зато мне не надо писать два разных слова.
D: continue label, break label
C: goto continue, goto break
монопенисуально.

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
метки перед циклом (для продолжения)
Не перед, а после последней инструкции тела цикла.

Один чёрт оба варианта (D, C) — говнокод.

Добавлено через 2 минуты
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
К тому же оператор goto делает это неочевидно.
Чего там неочевидного? o_O'

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Переходит к какой-то метке и делает непонятно что.
Ничего не делает. Просто переходит к метке.

Это в D неочевидно: метка стоит перед циклом, значит по логике, при переходе к ней, цикл должен начаться полностью заново (снова инициализировать счетчик начальным значением и т.п.). В C++ чётко видно к какой инструкции переходит управление.

Добавлено через 51 секунду
Цитата Сообщение от korvin_ Посмотреть сообщение
Не перед, а после последней инструкции тела цикла.
Для указанной же задачи достаточно по одной на каждый цикл.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.02.2015, 15:26  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
Удобнее.Но признайтесь,часто вы такими приемами хотели бы пользоваться?
Не слишком часто. Но по собственным воспоминаниям, когда я изучал C, мне часто не хватало таких операторов. И я находил именно goto в интернете, а не очевидный вариант, так как его не было в C/C++.
Хотя, может быть, и часто. Трудно сказать. Ну точно скажу, что в таких случаях буду всегда использовать break label и continue label.

Добавлено через 8 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Не перед, а после последней инструкции тела цикла.
Ну я почему-то из-за моей задачи подумал про первый цикл, поэтому не упомянул про инструкции его тела, которых нет.
Цитата Сообщение от korvin_ Посмотреть сообщение
Для указанной же задачи достаточно по одной на каждый цикл.
Для указанной задачи я использовал continue там, где вы насолили goto breakLabel.
Цитата Сообщение от korvin_ Посмотреть сообщение
Это в D неочевидно: метка стоит перед циклом, значит по логике, при переходе к ней, цикл должен начаться полностью заново (снова инициализировать счетчик начальным значением и т.п.).
Вы просто не привыкли к этому. Я и сам ещё плохо привык к таким штучкам. Вы можете явно указать int iterator или static int iterator. Всё очевидно.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
11.02.2015, 15:31
Цитата Сообщение от korvin_ Посмотреть сообщение
for*
Остроумно, однако. Срочно необходимо dolist* в CL имплементнуть Правда надо решить что делать с return-ом и формой-результатом.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.02.2015, 15:31  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Ничего не делает. Просто переходит к метке.
А для чего переходит неизвестно. В случае D я могу быть уверен, если написано break label или continue label. Если я напишу goto break или goto continue, то это не значит, что в указанной метке будет находиться break или continue. Возможно там окажется совсем не то, что названо этими словами.
0
Модератор
 Аватар для Curry
5170 / 3534 / 536
Регистрация: 01.06.2013
Сообщений: 7,685
Записей в блоге: 9
11.02.2015, 15:32
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Цитата Сообщение от "korvin_
Это в D неочевидно: метка стоит перед циклом, значит по логике, при переходе к ней, цикл должен начаться полностью заново (снова инициализировать счетчик начальным значением и т.п.).
Вы просто не привыкли к этому.
При учёте того, что ещё и foreach (j; 0 .. 5) выполняется от 0 до 4, то привыкнуть к этому невозможно.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.02.2015, 15:39  [ТС]
К тому же, если не будет цикла для continue label или для break label, то компилятор выдаст ошибку:
Code
1
2
Error: enclosing label 'a' for continue not found
Error: enclosing label 'a' for break not found
Надеюсь, что против этого вам нечего сказать.
goto break в данном случае полностью проигрывает (менее безопасный).

Добавлено через 4 минуты
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
При учёте того, что ещё и foreach (j; 0 .. 5) выполняется от 0 до 4, то привыкнуть к этому невозможно.
Как мне сказал один форумчанин:
Оо, что-то мне подсказывает, что это будет тотальная святая война между новым, мало известным и хорошо устоявшимся старым=))
0
11.02.2015, 15:53

Не по теме:

Я догадался почему у Дешников глаза горят.
Dиэтиламид лизергиновой кислоты. Без неё такое не придумаешь. :D

0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
11.02.2015, 15:54
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А для чего переходит неизвестно. В случае D я могу быть уверен, если написано break label или continue label. Если я напишу goto break или goto continue, то это не значит, что в указанной метке будет находиться break или continue. Возможно там окажется совсем не то, что названо этими словами.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Вы просто не привыкли к этому.
————

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Для указанной задачи я использовал continue там, где вы насолили goto breakLabel.
Никакой разницы.

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Надеюсь, что против этого вам нечего сказать.
Нечего. Я просто не представляю как можно так безалаберно редактировать код. И я уже высказал своё отношение к многочисленным вложенным циклам.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.02.2015, 16:00  [ТС]

Не по теме:

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Я догадался почему у Дешников глаза горят.
Ritchie - это главный создатель C, а не Dешник. :D



Добавлено через 4 минуты
Цитата Сообщение от korvin_ Посмотреть сообщение
Я просто не представляю как можно так безалаберно редактировать код.
Как именно?
Цитата Сообщение от korvin_ Посмотреть сообщение
И я уже высказал своё отношение к многочисленным вложенным циклам.
Какое же у вас отношение к многочисленным вложенным циклам?
Цитата Сообщение от korvin_ Посмотреть сообщение
Нечего.
Ну вот.
0
11.02.2015, 16:07

Не по теме:

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Ritchie - это главный создатель C, а не Dешник.
Ваша же картинка. Оба хороши. :D

0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
11.02.2015, 16:36

Не по теме:

Цитата Сообщение от nullxdth Посмотреть сообщение
Правда надо решить что делать с return-ом и формой-результатом.
Я бы сделал как-то так:

Кликните здесь для просмотра всего текста
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(defmacro dolist* ((x &rest xs) &body body)
  (let (return-form
        (exit (gensym (string 'exit-))))
    (labels ((gen (xs)
               (if (null xs)
                   body
                 (destructuring-bind (x &rest xs) xs
                   (if (eq x :return)
                       (progn
                         (setf return-form xs)
                         body)
                     `((dolist ,x ,@(gen xs))))))))
      (destructuring-bind (var seq) x
        (let ((body (gen xs)))
          `(block ,exit
             (macrolet ((return (&rest args)
                          (when (null args)
                            (setf args ',return-form))
                          (cons 'return-from (cons ',exit args))))
               (dolist (,var ,seq ,@return-form)
                 ,@body))))))))
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(dolist* ((x '(1 2 3)) (y '(4 5 6)) :return 'done)
  (print (cons x y))
  (when (> (+ x y) 7)
    (return)))
 
; (1 . 4) 
; (1 . 5) 
; (1 . 6) 
; (2 . 4) 
; (2 . 5) 
; (2 . 6) 
; DONE
Думаю, этого вполне достаточно.



Добавлено через 2 минуты
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Как именно?
Удалить for, но забыть удалить метку, которая находится прям тут рядом.

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Какое же у вас отношение к многочисленным вложенным циклам?
Наличие многочисленные вложенные циклы — признак говнокода.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
11.02.2015, 16:48
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Насколько плохо, что макроподстановки убрали из D? Или, наоборот, это хорошо?
Совсем убрали? Плохо, даже очень плохо. Как кодогенерировать - непонятно.
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
11.02.2015, 17:35
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А то, что лисперы суют свой код не в свои темы.
Да ладно Вам, вот на ерланг
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-module(lol).
-author('castorsky').
 
-import(io, [write/1,fread/2]).
 
-export([main/0]).
 
foo() ->
    {ok, [A]} = io:fread("ololo: ", "~d"),
    if
        is_integer(A) -> A;
        true -> {error, A}
    end.
 
loop1() ->
    io:write(self()),
    loop2().
 
loop2() ->
    io:write(self()),
    loop3().
 
loop3() ->
    io:write(self()),
    case foo() of
        1 -> loop1();
        2 -> loop2();
        3 -> loop3();
        _Else -> {error, _Else}
    end.
 
main() ->
    loop1().
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Слово display не подходит.
Вообще-то в racket есть print/printf/write/display/displayln. Ну и как же без него format.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Да, и к тому же в D есть выбор между
см выше xD
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Мне кажется, выразительность языка складывается и из его библиотек, а не только язык (+ встроенные функции).
Это же рабочий инструмент, который мы выбираем для практического применения. Возможности библиотек, в том числе, показывают, и возможности языка. Так что ограничения, всякие искусственные на неиспользование библиотек и операторов только мешают сравнению.
ссылку CL vs Python2 уже читали?
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
case 1: continue a;
Вот это фейл, в вэ goto заменили на continue. Я понимаю что это иной goto и он применим только к циклам, но фейл потрясающий.
Цитата Сообщение от nullxdth Посмотреть сообщение
Остроумно, однако.
а то, фирма веников не вяжет xD.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Закрытая тема Создать тему
Опции темы

Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru