Składnia Delphi kontra reszta świata

Składnia Delphi kontra reszta świata
D9
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 11 lat
  • Postów:2
0

Witajcie,
Chciałbym zrobić autoupdater do stworzonej już gry. Włączając grę chcę, aby aplikacja sprawdzała czy podmienić plik odpowiedzialny za listę serwerów czy też nie. Ma to się odbywać bez żadnych powiadomień.

Teraz mam do was pytanie
W jakim języku to będzie mi najłatwiej zrobić ? Nie chcę, aby wymagało to zbędnych programów jak np NetFramework.
Jeżeli macie jakieś jeszcze wskazówki to prosiłbym bardzo. Jeden plik będzie zmieniał się od czasu do czasu. Nie wiem jak to nawet zrobić optymalnie czy ma sprawdzać obecną wersję czy tylko za pomocą różnicy rozmiaru pliku ?

Obecnie znam bardzo dobrze php, html, css.

PS
Mam chęci i sam chcę to zrobić :) Przy okazji troszeczkę nabrać podstaw.

edytowany 2x, ostatnio: olesio
_13th_Dragon
A grę stworzyłeś w języku ... ?
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

o_O W tym samym języku co grę.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
_13th_Dragon
"... Obecnie znam bardzo dobrze php, html, css ..."
unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
0

Prawdopodobnie zrobił ją w jakimś "generatorze gierek".
Poszukaj czy nie ma też gotowych autoupdaterów - wydaje mi się że raczej na pewno są.

Autoupdatery stworzone przez początkujących programistów są raczej niebezpieczne dla użytkowników. Każda aktualizacja powinna być podpisana kluczem asymetrycznym.
W innym przypadku wprowadzamy do komputera backdoora którego może potencjalnie wykorzystać dowolna osoba.
Wystarczy że podepniemy się do złowrogiego hotspota, który zaserwuje zmienione adresy w DNS i właściciel będzie mógł zainstalować w komputerze dowolną aplikację swojego autorstwa bez potwierdzenia ze strony użytkownika

Duo94 napisał(a):

Nie chcę, aby wymagało to zbędnych programów jak np NetFramework.

.NET framework zbędny? Nawet sterowniki do kart graficznych radeona wymagają .NET Framework
w wersji 2.0 jest zainstalowany praktycznie na każdym komputerze
wersja 3.5 jest na co najmniej 60% komputerów (ciężko znaleźć dokładne statystyki)
każdy nowy komputer z windows 8 dostaje wersję 4.5 razem z systemem


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 4x, ostatnio: unikalna_nazwa
mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
0
Duo94 napisał(a):

Nie chcę, aby wymagało to zbędnych programów jak np NetFramework.

To polecam WinAPI i np. C++.


<sup>_</sup>
D9
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 11 lat
  • Postów:2
0

Gra jest starsza. Trudno, żeby napisać w tym języku skoro nawet nie wiem w jakim została napisana. Ja tylko chcę dorobić takie mini aktualizacje listy serwerów.

.NET framework zbędny? Nawet sterowniki do kart graficznych radeona wymagają .NET Framework
w wersji 2.0 jest zainstalowany praktycznie na każdym komputerze
wersja 3.5 jest na co najmniej 60% komputerów (ciężko znaleźć dokładne statystyki)
każdy nowy komputer z windows 8 dostaje wersję 4.5 razem z systemem

Chodzi mi, o to żeby każda potencjalna osoba nie musiała go instalować.

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Mogę jak @mcoder polecić WinAPI, a jeżeli nie C++, to może być Delphi. I jeżeli nie chcesz WinAPI, a nie zraża Ciebie to że exek updatera będzie o wiele większy niż sam aktualizowany plik i ogólnie będzie rozmiarów rzędu 200 kb i więcej, nawet po spakowaniu UPX'em to moze być VCL. Do wspomnianych języków na sieci jest wiele kursów. Więcej jest chyba kursów dla WinAPI i C++, także po polsku. Dla WinAPI i Delphi od siebie moge polecić poza dokumentacją na MSDN, tę oto stronę: http://www.angelfire.com/hi5/delphizeus - natomiast do obsługi TCP dla pobierania na przykład protokołem HTTP tego pliku do aktualizacji, polecam pod WinAPI ten moduł: http://piechnat.pl/article/simpletcp.html - a dla VCL Synapse.


Pozdrawiam.
mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
2
olesio napisał(a):

może być Delphi.

Delphi ma składnie, której przyzwyczajenia przeszkadzają w nauce innych języków.

Po co pisać:

Kopiuj
var
   i : integer;
begin
  i := i + 1;
  if i = 5 then begin ShowMessage('i = 5'); end;
end;

jak można krócej:

Kopiuj
int i;
i++;
if(i == 5) { MessageBox(0, "i == 5", 0, 0); }

Mówią, że te słowa angielskie pomagają w zrozumieniu początkującym.
To może zrobimy język w stylu:

Kopiuj
please declare variable named i of type integer;
please increment i by one;
if i is equal to 5 show message box with text 'i = 5';

<sup>_</sup>
edytowany 1x, ostatnio: mcoder
n0name_l
Delphi ma składnie, której przyzwyczajenia przeszkadzają w nauce innych języków. rotfl.
Patryk27
Not sure if trolling or just retarded...
Azarien
to ostatnie już było. nazywało się COBOL.
somekind
A obecnie Visual Basic.
1

Dla większości ludzi składnia to tylko składnia, begin i end występują chociażby w Ruby, język to tylko narzędzie i pewna abstrakcja. Niestety takie poglądy są częste wśród newbie, całe szczęście zazwyczaj z nich wyrastają.

mcoder napisał(a):

Mówią, że te słowa angielskie pomagają w zrozumieniu początkującym.
To może zrobimy język w stylu:

Kopiuj
please declare variable named i of type integer;
please increment i by one;
if i is equal to 5 show message box with text 'i = 5';

Ktoś już to zrobił i nazwał COBOLem.

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Gorlice
1
mcoder napisał(a):

Delphi ma składnie, której przyzwyczajenia przeszkadzają w nauce innych języków.

Po co pisać:

Kopiuj
var
   i : integer;
begin
  i := i + 1;
  if i = 5 then begin ShowMessage('i = 5'); end;
end;

Jak już to

Kopiuj
var
  i: Integer;
begin
  Inc(i);
  if i = 5 then
    ShowMessage('i = 5');
end;

Aby krytykować inny język najpierw trzeba go poznać. Może uzasadnisz dlaczego to niby znajomość Delphi przeszkadza w nauce innych języków bo to że składnia jest odrobinę dłuższa raczej nie jest sensownym argumentem. Tak samo poznasz co to zmienna, funkcja, klasa itd. więc o co chodzi?


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
3

@mcoder: co kuhwa, za przeproszeniem?!

Po co pisać: (...) skoro można krócej: (...)

A po co pisać:

Kopiuj
int i;
i++;
if(i == 5) { MessageBox(0, 'i == 5', 0, 0); }

Skoro można krócej:

Kopiuj
#define m MessageBox
int _;_++;if(_==5)m(0,'i==5',0,0);

Lub czytelniej:

Kopiuj
Var i: Integer;
Begin
  Inc(i);
  if (i = 5) Then
    ShowMessage('i = 5'); // lub Application.MessageBox lub Windows.MessageBox lub samo MessageBox.
End;

(btw, oba te kody to undefined behavior, wiesz o tym oczywiście?)
(btw2, 'foo' to w C++ nie jest ciąg znaków, tylko liczba! Ten Twój siplasplasowy mesedżboks najpewniej się zcrashuje podczas wyświetlania)

Popieram @kAzek - wytłumacz, dlaczego rzekomo znajomość Object Pascala przeszkadza w nauce innych języków?
Ja mogę stwierdzić, że nauka C++ utrudnia naukę Pythona. Dlaczego? Bo tak. Jaki ma to sens?


Mówią, że te słowa angielskie pomagają w zrozumieniu początkującym. To może zrobimy język w stylu:

Istnieje wiele takich języków, nieczęsto używanych z oczywistego powodu.


[irony]Btw, w C++ istnieje zbyt wiele słów kluczowych. Piszmy w Brajnfuku! Bo w jakim celu ułatwiać pracę programiście, skoro można na wszystkie sposoby utrudniać?[/irony]

edytowany 6x, ostatnio: Patryk27
n0name_l
Gdybys wywalil tego definea mialbys 11 znakow krotszy kod :D
Patryk27
Ale jestem przykładnym programistą i piszę kod wielokrotnego użytku c: Jeżelibym wyświetlił 3 mesejdżboksy, to już oszczędzę całe szesnaście znaków :)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:31 minut
  • Lokalizacja:Tuchów
  • Postów:12166
0
mcoder napisał(a)

Po co pisać: (...) skoro można krócej: (...)

To tak jakbyś napisał, że nauka któregoś z azjatyckich języków przeszkadza w nauczeniu się angielskiego, co jest oczywiście totalną bzdurą; Można umieć i jedno i drugie;

Od kiedy to krócej znaczy lepiej? Pascal akurat nie jest językiem, który ma składnię wymuszającą najwięcej znaków do wklepania - już bardziej można by przyczepić się Basica, ale tego typu porównania nie mają najmniejszego sensu;

I po co się czepiać? Przecież nikomu nie przeszkadza, że trzeba napisać kilka(naście) znaków więcej; Poza tym to Basic ma najprzyjemniejszą do pisania i analizowania składnię; A obfuskacja kodu przez nadźganie w nim połowy znaków specjalnych wcale nie sprawi, że program będzie działał lepiej/szybciej, za to utrudni jego zrozumienie;

Polecam więc powrócić do tematu poruszonego pierwotnie w tym wątku: "Autoupdater jaki wybrać język programowania" i przestać hejtować wszystko co popadnie.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
1
Patryk27 napisał(a):

A po co pisać:

Kopiuj
int i;
i++;
if(i == 5) { MessageBox(0, 'i == 5', 0, 0); }

Skoro można krócej:

Kopiuj
#define m MessageBox
int _;_++;if(_==5)m(0,'i==5',0,0);

Lub czytelniej:

Kopiuj
Var i: Integer;
Begin
  Inc(i);
  if (i = 5) Then
    ShowMessage('i = 5'); // lub Application.MessageBox lub Windows.MessageBox lub samo MessageBox.
End;

Mój kod jest i krótki i czytelny. A Twój pierwszy kod jest nieczytelny, a drugi nie jest krótki _

Patryk27 napisał(a):

(btw2, 'foo' to w C++ nie jest ciąg znaków, tylko liczba! Ten Twój siplasplasowy mesedżboks najpewniej się zcrashuje podczas wyświetlania)

Użyłem w C++ ' ' zamiast " ", bo ostatnio miałem za dużo styczności z Delphi. /me +1

Patryk27 napisał(a):

wytłumacz, dlaczego rzekomo znajomość Object Pascala przeszkadza w nauce innych języków?

Bo Delphi wyłącza myślenie i jest zbyt niechlujne. Np. rozróżnianie wielkości liter czy wywoływanie procedur w stylu myProc; oraz myProc();

Ktoś napisze: "Fajne to Delphi, bo mogę pisać myProc; oraz myProc(); oraz MYPROC; i będzie to samo. To może będziemy pisać żółw albo żułw albo rzułf itd. hehe


<sup>_</sup>
n0name_l
Delphi wyłącza myślenie rotfl2.
KA
Proponuję przestać używać Windowsa i oczywiście przestać pisać programy pod ten system, bo nie rozróżnia wielkości liter w nazwach plików/folderów.
n0name_l
Ja bym proponował przestać się pogrążać ;>
unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
0

jedyny zły nawyk jaki się wynosi z delphi to porównanie przez pojedynczy znak równości
po przejściu na inny język notorycznie się zdarzało zrobić przypisanie zamiast porównania

poza tym - język jak język


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
2

Mój kod jest i krótki i czytelny. A Twój pierwszy kod jest nieczytelny, a drugi nie jest krótki _

No ok, przyjmijmy, że tak jest.
Delphi za to nadrabia normalnymi tekstami błędów, w porównaniu do niektórych Visualowych: LNK431123123987 BECAUSE FUCK YOU (;P) czy błędów GCC w szablonach, gdzie nagle wypluwa kilkaset linijek błędów z powodu literówki.
Btw, mierzysz "jakość" języka względem ilości słów kluczowych składni? :|

Np. rozróżnianie wielkości liter

Windows też nie rozróżnia wielkości liter w nazwach plików oraz folderów/katalogów/whateva, a jednak ludzie (w tym programiści :P) z niego korzystają.

czy wywoływanie procedur w stylu myProc; oraz myProc();

A kto Ci zabroni pisać wszędzie myProc();?

Ktoś napisze: "Fajne to Delphi, bo mogę pisać myProc; oraz myProc(); oraz MYPROC; i będzie to samo. To może będziemy pisać żółw albo żułw albo rzułf itd. hehe

Twoje ostatnie zdanie nie ma sensu, jak już, to powinno być: "To może będziemy pisać żółw, ŻÓŁW, Żółw".
Widać, że u Ciebie coś myślenie szwankuje, lecz nie jest to bynajmniej wina Delphi.


edytowany 4x, ostatnio: Patryk27
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Wrocław
6

Najfajniejsze jest to, że na forum ogólnie hejtuje się Delphi, mówi o dzieciach Delphi, hakerach piszących w Delphi boty do Tibii, ale jak @mcoder pisze o nim źle, to nagle okazuje się cudownym językiem. :D

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

@somekind: nikt nie twierdzi, że Delphi jest cudownym językiem; po prostu co innego fakt, że script kiddies mają tendencję do pisania "wuasnych botuff" do Tibii w Delphi, a co innego, gdy już chodzi o irracjonalny hejt na tę odmianę Pascala.


vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
8

@mcoder: Delphi to słabszy język od C++ (chociaż FPC daje radę), ale nie z powodów które podajesz.
Gdyby zwięzłość języka miała znaczenie to wszyscy byśmy programowali w C/Perlu i cieszyli się na widok kodu który nikt poza nami nie rozumie.

Delphi/FPC - plusy:

  • czytelna składnia (w tym begin/end) - to plus
  • lepsza modularność niż w C/C++ (interface/implementation/initialization/finalization)
  • czytelniejsza zmienna liczba parametrów funkcji
  • czytelna deklaracja delegatów (w odróżnieniu od C - poprawione dopiero w C++ - Boost::function, w standardzie od C++11)
  • dwa sposoby na przekazywanie obiektów (referencja i interface) - zamiast 6-ciu w C++: referencja, const referencja, wskaźnik, wartość, smart pointer, r-value ref - "zabawne" zwłaszcza przy budowaniu szablonów
  • wbudowana obsługa foreach (for-in) - w C/C++ dostępne od C++11 (range-based for)
  • jedna klasa bazowa (TObject)
  • wbudowany mini garbage collection przez słowo "interface"
  • lepsze RTTI (co umożliwiło lepsze zarządzanie komponentami)
  • słowo kluczowe override (w C++ dostępne od C++11)
  • przenośność GUI - przez Lazarus/FPC
  • szybkie budowanie GUI
  • łatwość parsowania języka
  • wydajność execa (jeśli FPC)

Delphi - minusy

edytowany 4x, ostatnio: vpiotr
Zobacz pozostałe 10 komentarzy
vpiotr
Możliwe, ale nikt Ci nie każe używać D7...
Riddle
nikt też nie każe używać starszych od C++11 wersji, a jednak w Twoim spisie pełno jest "dostępne od C++11".
vpiotr
różnica polega na tym, że C++11 nie jest jeszcze nigdzie w pełni wspierane - chyba że czegoś nie wiem.
Endrju
GCC 4.8.1 oraz Clang 3.ileś ma pełne wsparcie dla funkcjonalności C++11. Biblioteka standardowa pełna jest chyba tylko w Clangu. Co do komercyjnych kompilatorów to nie wiem.
vpiotr
OK, czyli GCC jest kompletne, ale libstdc++ nie. Clang nie jest oficjalnie wspierany na Windows, czyli dla pewnie jakiejś 90% populacji programistów nie istnieje. O C++11 wspomniałem, żeby zaznaczyć że coś się dzieje w C++ (zwłaszcza w GCC i MS CL)... Chociaż ile z tego już mogę wykorzystać - nie badałem.
0

W najnwoszych delphi, string to unicodestring inaczej

vpiotr
niestety masz rację - dlatego to dla mnie minus
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

@Duo94: a tak w temacie to takiego toola zrobiłbym w FPC/Lazarus ew. z użyciem KOL-a.

FPC/Lazarus:
http://www.lazarus.freepascal.org/

KOL (mniejsze execi, prawdopodobnie więcej roboty)
http://kolmck.net/

plus jakiś dodatkowo komponent do aktualizacji - np. ten (nie wspierają FPC, ale możliwe że zadziała - tylko ryzyko):
http://www.tmssoftware.com/site/wupdate.asp

hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:15 dni
0

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Wrocław
3
Patryk27 napisał(a):

@somekind: nikt nie twierdzi, że Delphi jest cudownym językiem; po prostu co innego fakt, że script kiddies mają tendencję do pisania "wuasnych botuff" do Tibii w Delphi, a co innego, gdy już chodzi o irracjonalny hejt na tę odmianę Pascala.

Ale gdzie w negatywnej opinii jest ten "irracjonalny hejt"? To zjawisko spotyka tutaj raczej @mcodera, tylko dlatego, że wymienił kilka konkretnych wad Delphi. A to, co opisał, czyli np. rozwlekłość składni (sekcja var, pojebane begin i end), nierozróżnianie wielkości liter, różne sposoby wywoływania metod (o ile dobrze zrozumiałem, to jest to syf największy z możliwych), "udziwnione" operatory porównania i przypisania. Takie rzeczy faktycznie nakłaniają do pisania niechlujnego kodu, i utrudniają zmianę języka, bo wymaga ona złamania wielu przyzwyczajeń.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
somekind napisał(a):
Patryk27 napisał(a):

@somekind: nikt nie twierdzi, że Delphi jest cudownym językiem; po prostu co innego fakt, że script kiddies mają tendencję do pisania "wuasnych botuff" do Tibii w Delphi, a co innego, gdy już chodzi o irracjonalny hejt na tę odmianę Pascala.

Ale gdzie w negatywnej opinii jest ten "irracjonalny hejt"? To zjawisko spotyka tutaj raczej @mcodera, tylko dlatego, że wymienił kilka konkretnych wad Delphi. A to, co opisał, czyli np. rozwlekłość składni (sekcja var, pojebane begin i end), nierozróżnianie wielkości liter, różne sposoby wywoływania metod (o ile dobrze zrozumiałem, to jest to syf największy z możliwych), "udziwnione" operatory porównania i przypisania. Takie rzeczy faktycznie nakłaniają do pisania niechlujnego kodu, i utrudniają zmianę języka, bo wymaga ona złamania wielu przyzwyczajeń.

To co Ty odczytujesz jako wadę - dla niektórych jest zaletą. Np. w C/C++ HttpExReader i HTTPExREader to dwa różne identyfikatory - współczucie dla osoby wspierające kod, który używa obu wersji. Kod w Pascalu jest dla mnie bardziej czytelny, ale to już subiektywna opinia.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
3
somekind napisał(a):
Patryk27 napisał(a):

@somekind: nikt nie twierdzi, że Delphi jest cudownym językiem; po prostu co innego fakt, że script kiddies mają tendencję do pisania "wuasnych botuff" do Tibii w Delphi, a co innego, gdy już chodzi o irracjonalny hejt na tę odmianę Pascala.

Ale gdzie w negatywnej opinii jest ten "irracjonalny hejt"? To zjawisko spotyka tutaj raczej @mcodera, tylko dlatego, że wymienił kilka konkretnych wad Delphi. A to, co opisał, czyli np. rozwlekłość składni (sekcja var, pojebane begin i end), nierozróżnianie wielkości liter, różne sposoby wywoływania metod (o ile dobrze zrozumiałem, to jest to syf największy z możliwych), "udziwnione" operatory porównania i przypisania. Takie rzeczy faktycznie nakłaniają do pisania niechlujnego kodu, i utrudniają zmianę języka, bo wymaga ona złamania wielu przyzwyczajeń.

Może i wymienił kilka konkretnych wad Delphi, lecz nie wspomniał o żadnej wadzie składni siplasplasowatej, a takich jest również niemało.

A to, co opisał, czyli np. rozwlekłość składni (sekcja var...

Sekcja var może i faktycznie być czymś dziwnym dla kogoś, kto cały czas pisze w C++, lecz w gruncie rzeczy fajnie jest mieć wszystkie zmienne zadeklarowane w jednym miejscu.
Dzięki temu można uniknąć sytuacji pokroju:

Kopiuj
int main()
{
 int i = 1;
 
 {
     int i = 2;
 }
}

Yup, ten kod jest poprawny i kompiluje się

Chociaż z drugiej strony dzięki deklarowaniu zmiennych stricte tam, gdzie są potrzebne, uniknąć można np.tego:

Kopiuj
Var ListX, ListY, ListZ: TSplittingPlaneList;
    Sp                 : PSplittingPlane;
    I, Index           : Integer;
    Tri                : TTriangle;

    Axis: Integer = __NOAXIS;

    sx, sy, sz, bx, by, bz, _width, _height, _depth, hw, hh, hd, _x, _y, _z: Double;

    O, P0, P1, P2, E0, E1, E2: TVector3;

    traversal_cost, intersection_cost, best_cost, cost, nosplit_cost, split_position, surface_area, templ, tempr, surface_area_l, surface_area_r: Double;

    nl, nr, flag: Integer;

    bounds0, bounds1: TBoundingBox;

Jest to fragment mojej implementacji k-d tree z SAH :P


pojebane begin i end

Dlaczego Twoim zdaniem pojebane?
Równie dobrze można by stwierdzić, że "pojebane" jest mało czytelne rozwiązanie z C++, czyli klamerki.


nierozróżnianie wielkości liter

W tym nie widzę żadnej wady. A może to właśnie wadą jest, że C++ nie rozróżnia wielkości liter?


różne sposoby wywoływania metod

Są tylko dwie metody (z nawiasami oraz bez) i naprawdę nie jest to syf największy z możliwych.
Nikt przecież nie zabrania Ci wszędzie pisać (); notacja beznawiasowa to tylko ułatwienie.

Ja mógłbym natomiast powiedzieć, że "wadą" C++ jest różny wybór przestrzeni nazw:

Kopiuj
using namespace foo;
using foo::xyz;
foo::

Tylko czy naprawdę jest to wada? W rzeczywistości to przecież ułatwia pisanie kodu.
Podobnie ułatwia notacja beznawiasowa.


"udziwnione" operatory porównania i przypisania

Co jest w nich dziwnego?
= to porównanie
:= to przypisanie
Jest to logiczne i zrozumiałe dla każdego, kto miał z tym językiem kontakt na przynajmniej parę dni.

Natomiast można by powiedzieć, że w C++ operator przypisania jest 'dziwny':

Kopiuj
int a, b, c;
a = b = c;

Co akurat ma swoje zalety (aka inicjacja wielu zmiennych na raz), lecz u początkujących może spowodować drobny mindfuck.


Takie rzeczy faktycznie nakłaniają do pisania niechlujnego kodu

Ale klamerki i makra z C++ oraz kompilatory, które bez specjalnych przełączników nie trzymają się w 100% standardu* to zachęcają do pisania poprawnego kodu [rotfl]

Kopiuj
#include <iostream>
#define r return
#define HEX__(n) 0x##n##LU
#define c std::cout
#define u__(x) ((x&0x0000000FLU)?1:0)+((x&0x000000F0LU)?2:0)+((x&0x00000F00LU)?4:0)+((x&0x0000F000LU)?8:0)+((x&0x000F0000LU)?16:0)+((x&0x00F00000LU)?32:0)+((x&0x0F000000LU)?64:0)+((x&0xF0000000LU)?128:0)
#define t int
#define l for
#define u(d) ((unsigned char)u__(HEX__(d)))
#define $ unsigned t
#define n unsigned char
t main(){$ __[]={u(1101000),u(1101011),u(1111111),u(10000111),u(10001101),u(10100100)};l($ _=0;_<u(110);_++)c<<[_]($ $$)->n{r(n)$$-10*_;}(__[_]);r 0;}

Ten kod powyżej oczywiście wyświetla słowo hakier w konsoli, co widać na pierwszy rzut oka, czyż nie?**


Ach, no i to piękne deklarowanie wyrażeń lambda w C++! ```cpp []()->int{} ```

i utrudniają zmianę języka, bo wymaga ona złamania wielu przyzwyczajeń.

Och, zapamiętanie, że w C++ porównuje się poprzez ==, a nie = jest niewątpliwie ciężką zmianą, współczuję wszystkim, którzy borykają się z syndromem Pascalowego porównania [*]
Może jestem dziwny, ale jak zaczynałem uczyć się C++, to ten błąd popełniałem przez... 4 godziny? Potem się przyzwyczaiłem i teraz już właściwie zawsze piszę == (jeżeli mowa o składni C-podobnej) oraz =, jeżeli mowa o Pascalowo-podobnych językach.


`*` np.: ```cpp int len; cin >> len; char tab[len]; ``` `**` oczywiście nikt takiego kodu zazwyczaj nie pisze - podałem jedynie przykład ukazujący, że czytelność języka nie zależy od składni (no, chyba, że mowa np.o Pythonie, ale pomijając języki z narzuconym formatowaniem kodu), tylko od programisty. Mówienie, że istnienie "begin" oraz "end" nakłania do pisania niechlujnego kodu to bullshit. Prędzej napiszesz coś nieczytelnego w C++, niżeli Pascalu.

edytowany 3x, ostatnio: Patryk27
Azarien
twój przykład z cin&gt;&gt;len; char tab[len]; będzie legalny w C++14 :-]
ShookTea
"= to porównanie := to przypisanie Jest to logiczne i zrozumiałe dla każdego, kto miał z tym językiem kontakt na przynajmniej parę dni." - ale nielogiczne i niezrozumiałe dla kogoś, kto miał przed nauką kontakt z dowolnym innym językiem.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
Patryk27 napisał(a):

Ach, no i to piękne deklarowanie wyrażeń lambda w C++!

Kopiuj
[]()->int{}

Lambda i "range-based for" - bez auto to przykład zwycięstwa lenistwa nad rozumem.
Tak samo zresztą jak "&&".

Fajne koncepcje, tylko że ten syntax obnaża czyjąś fobię przez słowotwórstwem.
Pewnie dlatego na "override" trzeba było czekać aż do C++11.

Zresztą "static" użyty w celu określenia że funkcja jest prywatna dla modułu to też dla mnie jakiś WTF.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Wrocław
5
Patryk27 napisał(a):

Może i wymienił kilka konkretnych wad Delphi, lecz nie wspomniał o żadnej wadzie składni siplasplasowatej, a takich jest również niemało.

Tzn. gdy piszę, że nie lubię zupy ogórkowej, muszę od razu wymienić wszystkie inne zupy, których nie lubię? Bez przesady...

w gruncie rzeczy fajnie jest mieć wszystkie zmienne zadeklarowane w jednym miejscu.

Nie. Fajnie jest mieć jak najmniejszy zasięg, a nie musieć wszystkiego deklarować na początku pliku jak w XIX w.

Równie dobrze można by stwierdzić, że "pojebane" jest mało czytelne rozwiązanie z C++, czyli klamerki.

begin i end zaciemniają te miejsca, które wymagają ich użycia. Klamerki to jednak cztery razy mniej znaków, szybciej się je czyta, nie rozpraszają tak, jak słowa.

W tym nie widzę żadnej wady. A może to właśnie wadą jest, że C++ nie rozróżnia wielkości liter?

A nie rozróżnia? Bo zdaje się, że chodziło o nazwy zmiennych. W tym wypadku nierozróżnianie wielkości liter jest przyzwoleniem na niechlujstwo.

Są tylko dwie metody (z nawiasami oraz bez) i naprawdę nie jest to syf największy z możliwych.
Nikt przecież nie zabrania Ci wszędzie pisać (); notacja beznawiasowa to tylko ułatwienie.

Nie "tylko dwie", ale "aż dwie".
Gdy widzę nawiasy wiem, że mam do czynienia z wywołaniem funkcji. Gdy nawiasów nie ma, to wygląda jakoś dziwnie.

Spójrz na to z punktu widzenia wieloosobowej pracy nad kodem. Jeden będzie pisał wszystko małymi literami, inny wielkimi, jeszcze inny po wielbłądziemu, jeden będzie wywoływał funkcje z nawiasami, inny bez. To jest bałagan, czyli niechlujstwo. A gdy język na to nie pozwala, to przynajmniej ten problem jest z głowy.

= to porównanie
:= to przypisanie
Jest to logiczne i zrozumiałe dla każdego, kto miał z tym językiem kontakt na przynajmniej parę dni.

A co w tym logicznego?

Ale klamerki i makra z C++ oraz kompilatory, które bez specjalnych przełączników nie trzymają się w 100% standardu* to zachęcają do pisania poprawnego kodu [rotfl]

Wszyscy przecież wiedzą, że C++ to obrzydliwy język, ale nie o to tu chyba chodzi.

podałem jedynie przykład ukazujący, że czytelność języka nie zależy od składni (no, chyba, że mowa np.o Pythonie, ale pomijając języki z narzuconym formatowaniem kodu), tylko od programisty.

Ja bym powiedział, że zależy od jednego i drugiego, ale od składni bardziej. Bo nieczytelnego programistę można nauczyć lepiej pisać, ale składni zmienić się nie da.

ShookTea
"Klamerki [...] szybciej się je czyta" powaliło mnie :)
somekind
Klamerek właściwie nie trzeba czytać, w przeciwieństwie do begin i end. Trudno mi to wytłumaczyć słowami, liczę na zrozumienie czytelnika. ;)
ShookTea
Wiem, ale i tak odpaliłem NetBeansa i próbowałem przeczytać mój kod (po polsku). Fajnie mi nawet wychodziło: "publiczna klasa Main start!"
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
2
somekind napisał(a)

Tzn. gdy piszę, że nie lubię zupy ogórkowej, muszę od razu wymienić wszystkie inne zupy, których nie lubię? Bez przesady...

Bardziej chodzi o to, gdy np.mówisz, że nie lubisz Xyz, bo coś tam coś tam coś tam i twierdzisz, że Abc jest lepsze uzasadniając to jakimiś nierealnymi przykładami, które ukazują wybrane zalety Abc, a nie są ani trochę obiektywne i po prostu... nota bene idiotyczne.

Nie. Fajnie jest mieć jak najmniejszy zasięg, a nie musieć wszystkiego deklarować na początku pliku jak w XIX w.

Kto co woli; ja jestem przystosowany do składni Pascala, chociaż jak wspomniałem: rozwiązanie C++-owate nie jest złe (aka: ten fragment z mojego raytracera).

begin i end zaciemniają te miejsca, które wymagają ich użycia. Klamerki to jednak cztery razy mniej znaków, szybciej się je czyta, nie rozpraszają tak, jak słowa.

Kwestia przystosowania imo; ilekroć patrzę na jakiś dłuższy C++-owaty kod, to zaczynam dostawać mini ataku epilepsji od tych klamerek.
Poza tym, gdyby to było kompletnie złe rozwiązanie, nie zostałoby zastosowane np.w Rubym.

A nie rozróżnia? Bo zdaje się, że chodziło o nazwy zmiennych.(...)

Argh, chciałem napisać "może wadą C++ jest to, że właśnie jest case-sensitive".

(...) W tym wypadku nierozróżnianie wielkości liter jest przyzwoleniem na niechlujstwo.

Dawanie programiście dostępu do klawiatury jest samo w sobie przyzwoleniem na niechlujstwo, nie mówiąc o angażowaniu go w jakiś projekt.

Gdy widzę nawiasy wiem, że mam do czynienia z wywołaniem funkcji. Gdy nawiasów nie ma, to wygląda jakoś dziwnie.

Cóż, again: kwestia przyzwyczajenia. Ja bezproblemowo radzę sobie z rozpoznawaniem wywołań procedur, głównie dlatego, że czym innym może być foo;, jak nie wywołaniem procedury (a w razie czego IDE dodatkowo podpowiada)? ;)
No i dochodzi też druga kwestia: większość procedur tak czy siak posiada listę parametrów, więc nawiasy są nieuniknione (pomijając magicznie hacki kompilatora, ale nie o tym teraz jest mowa).

Spójrz na to z punktu widzenia wieloosobowej pracy nad kodem. Jeden będzie pisał wszystko małymi literami, inny wielkimi, jeszcze inny po wielbłądziemu, jeden będzie wywoływał funkcje z nawiasami, inny bez. To jest bałagan, czyli niechlujstwo. A gdy język na to nie pozwala, to przynajmniej ten problem jest z głowy.

A to C++ nie pozwala na nazywanie wszystkiego małymi literami, wielkimi literami lub w camel-case?

A co w tym logicznego?

Chyba nie rozumiem pytania: to są po prostu dwa odmienne operatory, w C++ ich odpowiednikami są = oraz ==, dla programisty Pascala właśnie podejście C++ jest nielogiczne i vice versa :P
Można by natomiast się wykłócać o logiczność takiego C++owego kodu:

Kopiuj
if (a=10)

Ja bym powiedział, że zależy od jednego i drugiego, ale od składni bardziej. Bo nieczytelnego programistę można nauczyć lepiej pisać, ale składni zmienić się nie da.

Właśnie - nieczytelnego programistę można nauczyć lepiej pisać, zatem możesz go nauczyć pisać tak, by nawet newbie zrozumiał (na)pisany przez niego kod.

Jak to afair powiedział Hal Abelson:

Programs must be written for people to read, and only incidentally for machines to execute.


edytowany 3x, ostatnio: Patryk27
fasadin
muszę tu przyznać racje @Patryk27. Składnia to przyzwyczajenie, które szybko znika (begin end). A c++ logika nie jest logiczna. Od podstawówki nas uczono że równa się to jest = a nie ==. Zapewne w delphi nie musisz używać sztuczek typu if ( 4 = liczba ). w c++ funkcje możesz wywołać poprzez przekazanie adresu wskaźnika (z tego co pamietam). Także też tam masz dwa sposoby na wywołanie. A dyskusja tutaj zaczela się od delphi vs c++ (tak to odebrałem). Poprzedni użytkownik naskoczył na delphi z argumentami które były po prostu bardzo słabe. A teraz się ciągnie NieWiadomoCo
unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
2
somekind napisał(a):

Są tylko dwie metody (z nawiasami oraz bez) i naprawdę nie jest to syf największy z możliwych.
Nikt przecież nie zabrania Ci wszędzie pisać (); notacja beznawiasowa to tylko ułatwienie.

Nie "tylko dwie", ale "aż dwie".
Gdy widzę nawiasy wiem, że mam do czynienia z wywołaniem funkcji. Gdy nawiasów nie ma, to wygląda jakoś dziwnie.

w c++ i praktycznie wszystkich pochodnych też możesz ominąć nawiasy przy new
możesz pisać zarówno

Kopiuj
new klasa();

jak i: new klasa;

Kopiuj
jeśli nie podajemy parametrów i w większości przypadków nie będzie różnicy

ale to takie odejście od tematu
tak naprawdę chciałem napisać:

<b>WYPIEPRZAĆ Z TYM TEMATEM DO FLAME'A</b>

Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 1x, ostatnio: unikalna_nazwa
RE
Jakiś czas temu dodałem tylko dopisek do tematu, ale faktycznie całość teraz przeniosłem do flame. Szkoda, że w Coyote nie ma wydzielania części dyskusji do nowego wątku :<.
somekind
Zdaniem @Marooneda to nie jest potrzebne.
Marooned
Co nie jest potrzebne wg mnie? Bo jeśli mowa o wydzielaniu postów z wątku do nowego wątku, to od dawna mi tego brakuje, więc albo nie zrozumiałem albo nie o mnie myślałeś.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
Patryk27 napisał(a):

A co w tym logicznego?

Chyba nie rozumiem pytania: to są po prostu dwa odmienne operatory, w C++ ich odpowiednikami są = oraz ==, dla programisty Pascala właśnie podejście C++ jest nielogiczne i vice versa :P
Można by natomiast się wykłócać o logiczność takiego C++owego kodu:

Kopiuj
if (a=10)

Czytelność czy nie to rzecz subiektywna, ale fakt jest taki, że operator porównania wywodzi się z matematyki gdzie:
a "=" b oznacza, że a ma taką samą wartość jak b

a operatora przypisania po prostu nie ma.

Dlatego dla matematyka bardziej naturalna jest pisownia Pascalowa, a nie "==" lub "===" lub "!==" (ałła)...

edytowany 1x, ostatnio: vpiotr
4
vpiotr napisał(a):

Dlatego dla matematyka bardziej naturalna jest pisownia Pascalowa, a nie "=="

Zwlaszcza, kiedy Matlab, R i co tam jeszcze wymyślisz uzywa ==.

Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:10 miesięcy
3
Patryk27 napisał(a):

Sekcja var może i faktycznie być czymś dziwnym dla kogoś, kto cały czas pisze w C++, lecz w gruncie rzeczy fajnie jest mieć wszystkie zmienne zadeklarowane w jednym miejscu.
Dzięki temu można uniknąć sytuacji pokroju:

Kopiuj
int main()
{
 int i = 1;
 
 {
     int i = 2;
 }
}

Yup, ten kod jest poprawny i kompiluje się

Czego chcesz unikać? Właśnie odkryłeś, że istnieją również inne rodzaje scopingu, niż ten jedyny słuszny w Pascalu...
Druga deklaracja i przesłania pierwszą na tej samej zasadzie, co zmienna lokalna może przesłonić zmienną globalną (block scoping pozwala to robić na jeszcze większą skalę). Drugie i ma niższy czas życia (co jest chyba w miarę oczywiste).

Patryk27 napisał(a):

Można by natomiast się wykłócać o logiczność takiego C++owego kodu:

Kopiuj
if (a=10)

Okej.

Kopiuj
int x;
while(x = nextCostam()) {
   //...
}

Nadal nielogiczne?

unikalna_nazwa napisał(a):

w c++ i praktycznie wszystkich pochodnych też możesz ominąć nawiasy przy new
możesz pisać zarówno

Kopiuj
new klasa();

jak i: new klasa;

Kopiuj
> jeśli nie podajemy parametrów i w większości przypadków nie będzie różnicy


Tak, tylko `new`, czy `sizeof` są dla odmiany <b>operatorami</b>, a to trochę zmienia postać rzeczy w kwestii nawiasów i w ogóle.


 > ##### [vpiotr napisał(a)](http://4programmers.net/Forum/963970):
> Czytelność czy nie to rzecz subiektywna, ale fakt jest taki, że operator porównania wywodzi się z matematyki

Operator dodawania też wywodzi się z matematyki i jest nim oznaczana suma dwóch punktów leżących na krzywej eliptycznej oraz masa innych rzeczy. Jednoznaczne definicje operatorów w matematyce, rly?

Women were the reason I became a monk - and, ah, the reason I switched back...
vpiotr
A dlaczego akurat "jednoznaczne"? C/C++ jest jednoznaczne?
Demonical Monk
To jest dobre pytanie - czy gdziekolwiek są jednoznaczne?
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)