Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/254: Рейтинг темы: голосов - 254, средняя оценка - 4.70
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
5164 / 3523 / 536
Регистрация: 01.06.2013
Сообщений: 7,674
Записей в блоге: 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Закрытая тема Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru