Tính năng ngôn ngữ lạ nhất


974

Theo ý kiến ​​của bạn, tính năng ngôn ngữ "WTF" đáng ngạc nhiên, kỳ lạ, lạ hoặc thực sự nhất mà bạn đã gặp là gì?

Xin vui lòng chỉ có một tính năng cho mỗi câu trả lời.


5
@gablin Tôi nghĩ rằng nếu bạn kết hợp các dấu phân cách LISP với regex PERL bằng cách sử dụng phân tích cú pháp javascript, bạn sẽ bao phủ 90% WTF ...
Talvi Watia

Câu trả lời:


1859

Trong C, mảng có thể được lập chỉ mục như vậy:

a[10]

đó là rất phổ biến.

Tuy nhiên, hình thức ít được biết đến (thực sự có tác dụng!) Là:

10[a]

có nghĩa giống như trên.


758
đó là bởi vì [10] có nghĩa là * (a + 10) ... và 10 [a] có nghĩa là * (10 + a) :)
Michel Gokan

77
Đừng quên "Xin chào thế giới" [i]. Hoặc tôi ["Xin chào thế giới"]
Richard Pennington

167
Hoặc, hữu ích hơn, "0123456789abcdef" [x & 0xf]
Dipstick

17
@frunsi: Nó luôn hoạt động như mong đợi. Bổ sung con trỏ không giống như bổ sung số nguyên đơn giản trên các địa chỉ. Nó là giao hoán cho kích thước là loại trong câu hỏi.
R. Martinho Fernandes

12
@mcv - a [10] giống như "* (a + 10)", trong đó biểu thức "a + 10" là số học con trỏ (và vì a là một số ngắn, trong ví dụ của bạn, a + 10 có nghĩa là 'bắt đầu từ một địa chỉ và di chuyển 10 quần short, tức là 20 byte '). Biểu thức 10 [a] được đặt xen kẽ là "* (10 + a)", trong đó "10 + a" cũng là số học con trỏ và được xử lý chính xác theo cùng một cách.
Edan Maor

1292

Trong JavaScript:

 '5' + 3 gives '53'

Trong khi

 '5' - 3 gives 2

81
Tôi nhớ khi lần đầu tiên tôi bắt đầu sử dụng javascript bằng cách sử dụng loại kỹ thuật này để thêm số trong chuỗi: "111" - - "222" cho 333 trong khi "111" + "222" cho "111222".
Callum Rogers

112
+cho việc nối chuỗi là khủng khiếp
Matteo Riva

420
+ cho concat không phải là vấn đề. Gõ yếu là.
FogleBird

270
@FogleBird Không ai thực sự là vấn đề. Đó chỉ là sự kết hợp của cả hai với các quy tắc cưỡng chế không nhất quán.
TM.

70
Vì vậy, về cơ bản, + là concat khi một chuỗi có liên quan. Tại sao họ không thể mã hóa thứ gì đó như '123456' - 456 = '123'? Điều đó sẽ rất thú vị.
Jimmie Lin

872

Trong JavaScript, cấu trúc sau

return
{
    id : 1234,
    title : 'Tony the Pony'
};

trả vềundefined là một lỗi cú pháp do chèn dấu chấm phẩy ngầm ẩn trên dòng mới sau return. Các công việc sau đây như bạn mong đợi mặc dù:

return {
    id : 1234,
    title : 'Tony the Pony'
};

Thậm chí tệ hơn, cái này còn hoạt động tốt (ít nhất là trong Chrome):

return /*
*/{
    id : 1234,
    title : 'Tony the Pony'
};

Đây là một biến thể của cùng một vấn đề không mang lại lỗi cú pháp, chỉ âm thầm thất bại:

return
    2 + 2;

225
Chèn dấu chấm phẩy là một trong những phần xấu nhất của JavaScript.

230
Bạn luôn gặp vấn đề khi bạn thiết kế các tính năng ngôn ngữ xung quanh giả định rằng người dùng của bạn chủ yếu sẽ là những kẻ ngốc.
Rob Van Dam

8
Tôi thực sự đã có vấn đề đó, là nhà phát triển c #, tôi đặt cú đúp vào dòng mới. Mất hàng giờ tôi mới nhận ra vấn đề là gì. Ngay cả khi tôi đã giải quyết vấn đề, tôi cũng không biết vấn đề là gì cho đến khi tôi đọc câu trả lời của bạn!
Fedor Hajdu

24
Nick Retallack: Bởi vì, do cú pháp dấu ngoặc nhọn & dấu chấm phẩy giống chữ C của JavaScript, nên tất cả các dòng mới đều không rõ ràng.
Tamas Czinege

19
Nếu bạn không nên sử dụng kiểu C khi lập trình bằng JavaScript, thì các nhà thiết kế ngôn ngữ JavaScript sẽ chọn một cú pháp kiểu C.
Ryan Lundy

795

Bảng chân lý JavaScript:

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

Nguồn: Doug Crockford


237
Điều tốt là Javascript có toán tử ===.
Ẩn danh

65
Vậy mục đích nào ==phục vụ trong mắt nhà thiết kế ngôn ngữ?
Chris S

137
Người khó hiểu.
Javier

123
Thật tuyệt nếu ==có ý nghĩa của ===, và sau đó có một nhà điều hành khác, một cái gì đó giống như ~=kiểu ép buộc được phép.
TM.

18
@Otto Thật ra, vì chúng tôi đang nhìn ra, ví dụ của anh ấy cho thấy == không đối xứng. Hiện tại, tôi không thấy mức độ giao hoán sẽ được chỉ định cho mối quan hệ nhị phân.
Peter ALLenWebb

660

Các chữ trong C và C ++.

int main() {
   printf("LOL??!");
}

Điều này sẽ in LOL|, bởi vì bộ ba ??!được chuyển đổi thành |.


71
Nhanh chóng! Nói với tất cả C / b / lập trình viên!
Esteban Küber

235
Những bức thư rất tuyệt vời, bởi vì bạn có thể chắc chắn rằng không ai sẽ tìm thấy cái gì ??! sẽ có nghĩa là từ Google mà không biết tên.
zaratustra

56
Mặc định bị vô hiệu hóa trong GCC.
sastanin

360
Những thứ này cho phép bạn sử dụng "toán tử WTF": (foo ()! = ERROR) ??! ??! cerr << "Lỗi xảy ra" << endl;
dùng168715

57
Những bức thư là một điều ác cần thiết khi chúng được giới thiệu. Một số nền tảng không bao gồm khóa ký tự nhất định cho ngôn ngữ, do đó, đó là "bộ ba" hoặc "bạn không thể có trình biên dịch kết thúc trình biên dịch C vì vậy hãy sử dụng trình biên dịch chương trình". Kiểm tra mô tả của Stroustrup trong "Ngôn ngữ lập trình C ++".
Euro Micelli

573

Thú vị với quyền anh tự động và bộ đệm nguyên trong Java:

Integer foo = 1000;
Integer bar = 1000;

foo <= bar; // true
foo >= bar; // true
foo == bar; // false

//However, if the values of foo and bar are between 127 and -128 (inclusive)
//the behaviour changes:

Integer foo = 42;
Integer bar = 42;

foo <= bar; // true
foo >= bar; // true
foo == bar; // true

Giải trình

Xem nhanh mã nguồn Java sẽ hiển thị như sau:

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param  i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    if (i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

Lưu ý: IntegerCache.high mặc định 127trừ khi được đặt bởi một thuộc tính.

Điều xảy ra với quyền anh tự động là cả foo và bar cùng một đối tượng số nguyên được truy xuất từ ​​bộ đệm trừ khi được tạo rõ ràng: ví dụ: foo = new Integer(42)do đó, khi so sánh đẳng thức tham chiếu, chúng sẽ đúng hơn là sai. Cách thích hợp để so sánh giá trị Integer là sử dụng.equals;


31
Mất vài giây để xem tại sao ... java phải giữ một nhóm các số nguyên cho các giá trị trong khoảng từ -128 đến 128, nếu không, nó sẽ tạo ra một Số nguyên mới, phải không?
Mike Akers

18
tuy nhiên, hãy nhớ rằng nếu bạn chỉ định Số nguyên mới (42) thì nó sẽ không sử dụng thể hiện từ nhóm nên thanh foo == sẽ đánh giá thành sai
z -

10
Tôi luôn luôn sử dụng số nguyên thay vì Số nguyên nếu có thể, nhưng nếu tôi phải sử dụng Số nguyên vì một số lý do, tôi có nên sử dụng .equals () thay vì ==?
MatrixFrog

246
Rất vui vì tôi là lập trình viên C #.

87
@ Will: C # có một số vấn đề rất giống nhau. Xem blogs.msdn.com/jmstall/archive/2005/03/06/386064.aspx
spookylukey

373

Trích dẫn Neil Fraser (nhìn vào cuối trang đó),

try {
    return true;
} finally {
    return false;
}

(trong Java, nhưng hành vi rõ ràng là giống nhau trong JavaScript và Python). Kết quả được để lại như một bài tập cho người đọc.

EDITED: Miễn là chúng ta về chủ đề này cũng xem xét điều này:

try {
    throw new AssertionError();
} finally {
    return false;
}

42
+1. Vì một số lý do, tôi thấy điều này rất vui nhộn và không thể ngừng cười khúc khích.
outis

153
Rất may, C # không cho phép sự điên rồ như vậy ...Control cannot leave the body of a finally clause
Richard Ev

64
Điều này trở lại, sai, phải không? Nó có thể trông giống như một WTF (và có thể là một), nhưng tôi sống theo quy tắc: Cuối cùng luôn luôn chiến thắng, trừ khi bạn gặp sự cố với Máy trước đó.
Michael Stum

28
Công bằng mà nói, tôi đổ lỗi cho lời giải thích hay của TDWTF vì đã nhớ rằng cuối cùng luôn chiến thắng trừ khi bạn rút dây nguồn: thedailywtf.com/Articles/My-Tales.aspx
Michael Stum

22
Tôi không chắc những gì mã sẽ trả lại trong trường hợp này. Nhưng tôi hoàn toàn chắc chắn rằng bạn không được đặt returntrong finallymệnh đề.
jfs

325

APL (trừ TẤT CẢ nó), khả năng viết bất kỳ chương trình nào chỉ trong một dòng.

ví dụ: Trò chơi cuộc sống của Conway trong một dòng trong APL :

văn bản thay thế http://catpad.net/michael/APLLife.gif

Nếu dòng đó không phải là WTF, thì không có gì!

Và đây là một video


19
Tôi yêu APL. Ah, niềm vui của việc dành cả một buổi chiều để viết một nửa dòng mã! Điều đầu tiên tôi sẽ làm khi tôi nhận được một bàn phím nơi tôi có thể lập trình những chữ cái nào được hiển thị là để tự mình làm lại với APL.
Daniel C. Sobral

24
Trông giống như một ngôn ngữ cho người Hy Lạp.
Esko

45
@Erik: Có niềm vui khi được tìm thấy bằng cách viết mã chỉ về những gì bạn muốn chứ không phải về cách đến đó. Của việc thể hiện mã của bạn như là một biểu thức duy nhất. Nó giống như cắt katana hoàn hảo cuối cùng. Tất nhiên, trong một cuộc chiến thực sự, tôi muốn có một khẩu súng.
Daniel C. Sobral

7
@Daniel: Bạn dành cả một buổi chiều để viết một dòng mã ... và cả tuần để đọc một dòng mã. ;-)
Jürgen A. Erhard

93
APL sẽ rất tuyệt khi được xem trong một bộ phim hành động khoa học viễn tưởng. Tôi có thể tưởng tượng ai đó đang ngồi ở một thiết bị đầu cuối ba màu lẩm bẩm "Định hình lại vectơ tên lửa của kẻ thù ... hoán đổi ... pi lần logarit ... lên cấp - và - thực hiện!" tiếp theo là tiếng nổ và cổ vũ.
Joey Adams

321

Những điều kỳ lạ mà các mẫu C ++ có thể được sử dụng, thể hiện rõ nhất qua "Văn học tương tự đa chiều" sử dụng các mẫu để tính diện tích của các hình dạng "được vẽ". Đoạn mã sau là C ++ hợp lệ cho hình chữ nhật 3x3

#include"analogliterals.hpp"
using namespace analog_literals::symbols;

          unsigned int c = ( o-----o
                             |     !
                             !     !
                             !     !
                             o-----o ).area;

Hoặc, một ví dụ khác với khối lập phương 3D:

  assert( ( o-------------o
            |L             \
            | L             \
            |  L             \
            |   o-------------o
            |   !             !
            !   !             !
            o   |             !
             L  |             !
              L |             !
               L|             !
                o-------------o ).volume == ( o-------------o
                                              |             !
                                              !             !
                                              !             !
                                              o-------------o ).area * int(I-------------I) );

18
Mặc dù nghĩa đen tương tự của Eelis là tuyệt vời, chúng là một tính năng ngôn ngữ lạ , hay chỉ là một cách kỳ lạ để sử dụng một tính năng?

85
WTF thực sẽ là lỗi trình biên dịch được tạo bởi một trong những lỗi không đúng.
Andrew McGregor

6
Thật là bệnh hoạn ... làm tôi tỉnh táo trở lại khi có một phiên bản AnalogLiterals hỗ trợ xoay nghĩa đen quanh trục X, Y và Z trong Eclipse ... bây giờ sẽ mang lại cho "lập trình trực quan" một ý nghĩa thực sự mới.
TheBlastOne

2
Việc đặt hàng của o và L và | có vấn đề gì không?
Ming-Tang

4
Vấn đề đặt hàng, vì các mẫu sử dụng quá tải toán tử một cách sáng tạo (Đừng làm điều này với mã thực, việc lạm dụng các toán tử làm cho mã khó đọc)
josefx

292

Nhiều biến tích hợp của Perl:

  • $#- không bình luận!
  • $0, $$$?- giống như các biến shell có cùng tên
  • , $&$'- các biến khớp kỳ lạ
  • $"$,- các biến lạ cho các dấu phân cách danh sách và trường đầu ra
  • $!- thích errnonhư một số nhưng strerror(errno)là một chuỗi
  • $_- các biến ẩn, luôn được sử dụng và không bao giờ nhìn thấy
  • $#_ - số chỉ mục của đối số chương trình con cuối cùng ... có thể
  • @_ - tên (không) của hàm hiện tại ... có thể
  • $@ - ngoại lệ cuối cùng
  • %:: - bảng biểu tượng
  • $:, $^, $~, $-, Và $=- một cái gì đó để làm với định dạng đầu ra
  • $.$% - số dòng đầu vào, số trang đầu ra
  • $/$\ - dấu tách bản ghi đầu vào và đầu ra
  • $| - bộ điều khiển đệm đầu ra
  • $[- thay đổi cơ sở mảng của bạn từ 0 dựa trên 1 dựa trên 42 dựa trên: WHEEE!
  • $}- không có gì cả, đủ kỳ lạ!
  • $<, $>, $(,$) - UID thực và có hiệu quả và GIDs
  • @ISA - tên của các siêu lớp trực tiếp của gói hiện tại
  • $^T - thời gian khởi động tập lệnh tính bằng giây
  • $^O - tên hệ điều hành hiện tại
  • $^V - phiên bản này của Perl là gì

Có rất nhiều nơi mà những người đến từ. Đọc danh sách đầy đủ ở đây .


83
Các $[biến là tà ác nhất của tất cả.
Brad Gilbert

24
Chắc chắn sẽ đánh giá cao nếu Perl 6 là thứ tôi có thể mã hóa mà không phải kiểm tra perldoc perlvarcứ sau 5 giây. (Mặc dù tôi thú nhận rằng một nửa thời gian tôi kiểm tra nó với suy nghĩ "Tôi biết có một biến đặc biệt có thể làm điều này cho tôi, tôi chỉ không nhớ cái nào ..." = P)
Chris Lutz

17
Vấn đề với use English;nó là nó ảnh hưởng đến hiệu suất RegExp. Tôi không làm điều này lên. perldoc.perl.org/English.html#PERFORMANCE
Dave Webb

13
@Dave: đó không phải là vấn đề vì tùy chọn -no_match_vars trong trang bạn đã liên kết. @Brad: $ [là xấu xa. Ý định đằng sau nó là xấu xa, đúng vậy, nhưng nó thậm chí còn không hoạt động! @Artem: từ perlvar "Số nhận dạng Perl bắt đầu bằng chữ số, ký tự điều khiển hoặc ký tự dấu chấm câu được miễn các hiệu ứng của khai báo gói và luôn bị buộc phải ở trong gói chính; chúng cũng được miễn các lỗi 'vars' nghiêm ngặt." Vì vậy, điều đó có nghĩa là @ $ sẽ được tạo và gán mà không có lỗi ngay cả khi bị nghiêm ngặt. Ừ!
rjh

4
@Brian: Làm thế nào để bạn đề xuất tìm hiểu cú pháp khi tài liệu chính thức tuyên bố rằng có những trường hợp thông dịch viên Perl đoán theo cách hiểu một cách tự nhiên một chuỗi các ký tự? Ví dụ /$foo[bar]/, [bar]phần là một lớp ký tự hoặc một chỉ mục cho mảng @foo? Grep perldata cho câu trả lời đáng sợ.
j_random_hacker

289

PHP xử lý các giá trị số trong chuỗi . Xem câu trả lời trước cho một câu hỏi khác để biết chi tiết đầy đủ nhưng, tóm lại:

"01a4" != "001a4"

Nếu bạn có hai chuỗi chứa một số ký tự khác nhau, chúng không thể được coi là bằng nhau. Các số 0 đứng đầu rất quan trọng vì đây là các chuỗi không phải là số.

"01e4" == "001e4"

PHP không thích chuỗi. Đó là tìm kiếm bất kỳ lý do nào mà nó có thể tìm thấy để coi các giá trị của bạn là số. Thay đổi các ký tự thập lục phân trong các chuỗi đó một chút và đột nhiên PHP quyết định rằng các chuỗi này không còn nữa, chúng là các số trong ký hiệu khoa học (PHP không quan tâm rằng bạn đã sử dụng dấu ngoặc kép) và chúng tương đương nhau vì các số 0 đứng đầu bị bỏ qua cho các số. Để củng cố điểm này, bạn sẽ thấy rằng PHP cũng đánh giá "01e4" == "10000"là đúng vì đây là những số có giá trị tương đương. Đây là hành vi được ghi lại, nó chỉ là không hợp lý.


56
Chỉ cần sử dụng === và! ==. Mà nên được sử dụng dù sao trừ khi cần một so sánh loại lỏng lẻo.
Dykam

14
@Dykam, nếu bạn theo liên kết đến câu trả lời đầy đủ hơn, bạn sẽ thấy rằng tôi đã giải quyết việc sử dụng toán tử ===.
Dan Dyer

18
Đánh máy yếu một lần nữa!
gillonba

43
Tôi luôn biết PHP là một tội lỗi. Cho đến bây giờ tôi đã không nhận ra đó là một tội lỗi không thể tha thứ: D
Thomas Eding

2
Họ nên dùng dân công nghệ để sử dụng === trong bất kỳ cuốn sách lập trình hoặc hướng dẫn nào. Đã thêm ghi chú: Trên một ứng dụng PHP được viết xấu, tôi có thể cung cấp mật khẩu của mình bất cứ thứ gì được phân tách thành cùng một số.
Pepijn

282

Chúng ta hãy bỏ phiếu cho tất cả các ngôn ngữ (chẳng hạn như PL / I) đã cố gắng loại bỏ các từ dành riêng.

Nơi nào khác bạn có thể viết hợp pháp các biểu thức gây cười như:

IF IF THEN THEN = ELSE ELSE ELSE = THEN

( IF, THEN, ELSELà tên biến)

hoặc là

IF IF THEN THEN ELSE ELSE

( IFlà một biến THENELSElà chương trình con)


1
@quark: đó là một câu trả lời riêng cho vấn đề này! ;) ... (và vâng, bạn có thể lập trình bằng tiếng Anh, chỉ cần triển khai nó dưới dạng .ppt cho các nhà phát triển khác .;)
Macke

28
@RoadieRich một nhóm trâu không rõ ràng từ Buffalo, chúng chỉ là trâu không cần thiết.
Jürgen A. Erhard

18
John nơi James đã từng có đã có đã có tác dụng tốt hơn đối với giáo viên.
GameFreak

4
Tôi đã thấy một số nhà sản xuất bảng hiệu bên ngoài một nhà máy sản xuất kem Ben và jerrys vào một ngày khác. Tôi đã phê bình công việc của họ, tôi nói với họ rằng không có đủ không gian giữa ben và và và jerrys.
Tom Gullen

9
Có lẽ nó sẽ cần thiết cho các chương trình tạm thời trong tương lai. NẾU THÌ = NGAY && WHERE = TẠI ĐÂY KHI = THÌ BÂY GIỜ = ELSEWHERE
Kelly S. Pháp

282

'Tính năng' chuyển đổi bát phân JavaScript là một điều tốt để biết về:

parseInt('06') // 6
parseInt('07') // 7
parseInt('08') // 0
parseInt('09') // 0
parseInt('10') // 10

Thêm chi tiết tại đây .


60
Bị mắc kẹt trong một lỗi mà tất cả các số làm việc ngoại trừ 8 và 9 !! Đã phát điên !!! Cảm ơn Brian!
Faruz

10
@Yada Ý bạn là bát phân? Hệ thập lục phân là 0x.
luiscubal

48
Và đó là lý do tại sao parseInt đưa ra một đối số phụ (tùy chọn) :).
LiraNuna

10
dẫn 0 có nghĩa là số bát phân. vì 8 không phải là một chữ số bát phân hợp lệ, kết quả phải là 0.
devio

22
... và parseInt ('010') -> 8 chỉ khiến bạn bối rối.
Richard Gadsden

213

Thiết bị của Duff trong C!

Trong C, người ta có thể xen kẽ một do / while với câu lệnh switch. Dưới đây là một ví dụ về một memcpy sử dụng phương pháp này:

void duff_memcpy( char* to, char* from, size_t count ) {
    size_t n = (count+7)/8;
    switch( count%8 ) {
    case 0: do{ *to++ = *from++;
    case 7:     *to++ = *from++;
    case 6:     *to++ = *from++;
    case 5:     *to++ = *from++;
    case 4:     *to++ = *from++;
    case 3:     *to++ = *from++;
    case 2:     *to++ = *from++;
    case 1:     *to++ = *from++;
            }while(--n>0);
    }
}

9
Thiết bị của Duff có lẽ là một lý do chính đáng để câu lệnh chuyển đổi không bị ngắt theo mặc định ;-) Tuy nhiên, tôi chưa thấy bất kỳ cách sử dụng tốt nào khác của công tắc và vòng lặp xen kẽ - nhưng có lẽ có một. Oh chờ đợi, vâng, có một cách sử dụng khác: coroutines và protothreads.
Frunsi

16
@frunsi: "Thiết bị của Duff có lẽ là một lý do chính đáng để câu lệnh chuyển đổi không bị ngắt theo mặc định" - Luôn đặt trường hợp phổ biến thành mặc định. Tôi không thể nói chính xác đây là trường hợp phổ biến ..
BlueRaja - Danny Pflughoeft

6
@mcv có lẽ dễ nhất nếu bạn cố đọc nó dưới dạng mã lắp ráp, tức là whileở cuối là một (có điều kiện) JMPtrở lại do, điều này giải thích tại sao bạn có thể bỏ qua dovà vẫn kết thúc trong vòng lặp.
wds

14
Hãy nhớ rằng Thiết bị của Duff thường tạo mã WORSE so với câu lệnh lặp thông thường cho các trình biên dịch hiện đại, biết cách kiểm soát vòng lặp (tốt hơn) hơn bạn có thể làm bằng tay.
Billy ONeal

37
@frunsi: Bản thân Duff, xuất bản nó, đã tuyên bố như thế này: "Điều này chắc chắn cung cấp một cuộc tranh luận trong cuộc thảo luận liệu công tắc có nên vượt qua theo mặc định hay không, nhưng tôi không chắc liệu cuộc tranh luận đó có đúng hay không."
SF.

204

Algol truyền theo tên (minh họa bằng cú pháp C):

int a[3] = { 1, 2, 3 };
int i = 1;

void f(int j)
{
    int k;
    k = j;  // k = 2
    i = 0;
    k = j;  // k = 1 (!?!)    
}

int main()
{
    f(a[i]);
}

33
Nếu bạn nghĩ về nó, nó thực sự có ý nghĩa xoắn
RCIX

90
Đây là "vượt qua tham chiếu" cuối cùng.
Dykam

3
Điều đó có thể xảy ra ở Scala mặc dù ( def f(j : => int))
Dario

10
Vì vậy, đây là một cái gì đó như thế ... template<typename T> struct by_name { virtual operator T&() = 0; }; void f(by_name<int> j) { ... } int main() { f(struct : by_name<int> { operator int&() { return a[i]; } }); }nào?
Simon Buchan

2
Nó thực sự khá đơn giản: Bạn tạo ra một đoạn mã nhỏ (thường được gọi là "thunk", do đó cách chơi chữ của tôi ở trên) tính toán địa chỉ kết quả từ biểu thức, trong trường hợp này & a [i]. Một con trỏ tới hàm này được truyền cho hàm được gọi, sau đó sử dụng nó để tính địa chỉ hiện tại mỗi khi tham số được truy cập.
Richard Pennington

189

Trong Python:

>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False

Không phải là WTF, mà là một tính năng hữu ích.


176
Tôi ước mọi ngôn ngữ khác đều có tính năng này
vava

32
Như với hầu hết các tính năng Python thú vị, có vẻ như Guido chỉ ALGOL đã đóng băng cú pháp của một tính năng Lisp thú vị. :-)
Ken

4
Geoffrey, nó là một tính năng và (10 > 5 > 1) != ((10 > 5) > 1)trong Python.
sastanin

18
Ngoài ra, nó đánh giá chỉ một lần, vì vậy (funct_a(5)+5 > b > funct_a(5))chỉ gọi funct_a(5)một lần. Đó là một tính năng TUYỆT VỜI!
Khelben

57
@Khelben: Không, funct_asẽ được gọi hai lần trong ví dụ đó. Trong b > funct_a(5) > cđó sẽ chỉ được gọi một lần, trái ngược với b > funct_a(5) and funct_a(5) > c.
Baffe Boyois

189

Trong Java:

int[] numbers() {
  return null;
}

Có thể được viết như:

int numbers() [] {
  return null;
}

23
Ồ Tôi ước tôi có thể là một con ruồi trên tường khi cú pháp mảng đó được thiết kế!
Adam Paynter

29
Tôi ghét phải nói điều này nhưng WTF là một phần mở rộng nhất quán của hệ thống loại C. Nếu các hàm C được phép trả về các mảng thì nó sẽ trông như thế. Cái đẹp hơn là một sự vi phạm nhất quán để làm cho nó dễ đọc hơn. Giống như "const char * var" so với "char const * var".
Gordon Wrigley

15
@Adam - Thật sự có ý nghĩa khi bạn xem xét khai báo biến đó tương tự cho phép cả "int Stuff []" và "int [] Stuff". Họ chỉ để các quy tắc tương tự làm việc để khai báo phương thức.
Brandon Yarbrough

2
@lImbus: Trên thực tế, const T*T const*tương đương, đó là T* constcon trỏ. Ngoài ra, tôi ghét phông chữ sans.
Simon Buchan

3
Rốt cuộc, numbers()[2]là một tuyên bố pháp lý.
badp

184

INTERCAL có lẽ là bản tóm tắt tốt nhất về các tính năng ngôn ngữ lạ nhất. Sở thích cá nhân của tôi là tuyên bố COMEFROM (gần như) trái ngược với GOTO.

COMEFROM gần như trái ngược với GOTO ở chỗ nó có thể đưa trạng thái thực thi từ bất kỳ điểm tùy ý nào trong mã sang câu lệnh COMEFROM. Điểm trong mã nơi chuyển trạng thái xảy ra thường được cung cấp dưới dạng tham số cho COMEFROM. Việc chuyển giao xảy ra trước hay sau khi lệnh tại điểm chuyển được chỉ định tùy thuộc vào ngôn ngữ được sử dụng. Tùy thuộc vào ngôn ngữ được sử dụng, nhiều COMEFROM tham chiếu cùng một điểm khởi hành có thể không hợp lệ, không mang tính quyết định, được thực thi theo một mức độ ưu tiên được xác định hoặc thậm chí tạo ra sự thực thi song song hoặc theo cách khác như được thấy trong Intercal Threaded. Một ví dụ đơn giản về câu lệnh "COMEFROM x" là nhãn x (không cần đặt ở vị trí gần bất kỳ nơi nào gần COMEFROM tương ứng của nó) hoạt động như một "cửa bẫy". Khi thực thi mã đạt đến nhãn, điều khiển được chuyển đến câu lệnh sau COMEFROM. Hiệu quả của việc này chủ yếu là làm cho việc gỡ lỗi (và hiểu luồng điều khiển của chương trình) trở nên vô cùng khó khăn, vì không có dấu hiệu nào gần nhãn mà điều khiển sẽ bí ẩn nhảy sang điểm khác của chương trình.


16
Khá ác - biến nhãn thành GOTO. Âm thanh giống như một tính năng ngôn ngữ mà tin tặc sẽ cầu xin ...
RCIX

114
Ok, nhưng INTERCAL được cho là buồn cười - đây không thực sự là một "gotcha" đáng ngạc nhiên. Trình biên dịch INTERCAL thực sự có thể từ chối biên dịch chương trình nếu bạn không sử dụng công cụ PLEASEsửa đổi thường xuyên!
Groo

10
Âm thanh như AOP :)
akuhn

6
Điều làm tôi ngạc nhiên nhất là trong phân tích yêu cầu hệ thống trong "Thế giới thương mại TI", COMEFROM thực sự được sử dụng trong các tệp văn bản mô tả các trường hợp sử dụng. (nghiêm túc: một số nhà phân tích ở đây đã trì hoãn việc di chuyển toàn công ty sang OpenOffice thay vì Văn phòng của MS vì trước đây không thể tham chiếu chính xác "đến" với độ chi tiết cần thiết trong một liên kết)
jsbueno

5
Groo: Tệ hơn. Sử dụng XIN quá thường xuyên và nó từ chối biên dịch chương trình của bạn vì bạn đang mò mẫm (C-INTERCAL yêu cầu từ 33% đến 66% các câu lệnh để có các sửa đổi PLEASE).
Vatine

160

Không thực sự là một tính năng ngôn ngữ, nhưng là một lỗ hổng triển khai: Một số trình biên dịch Fortran đầu tiên đã triển khai các hằng số bằng cách sử dụng một nhóm không đổi. Tất cả các tham số đã được thông qua tham chiếu. Nếu bạn đã gọi một hàm, vd

f(1)

Trình biên dịch sẽ chuyển địa chỉ của hằng số 1 trong nhóm hằng số cho hàm. Nếu bạn đã gán một giá trị cho tham số trong hàm, bạn sẽ thay đổi giá trị (trong trường hợp này là giá trị 1) trên toàn cầu trong chương trình. Gây ra một số đầu gãi.


124
Ôi. Sau đó 2+2 có thể bằng 5(cho các giá trị rất lớn 2của khóa học!).
Alok Singhal

12
ừm, giá trị nào của 2 sẽ làm cho "2 + 2" == "5"? Tôi không biết bất kỳ giá trị số nguyên 2 nào có thể đảm nhận điều đó là đúng.
Aaron

36
@earlz: Tôi nghi ngờ rằng nó sẽ trở thành một giá trị không thể thiếu, với bất kỳ mẫu bit nào. Mặt khác, bạn có thể đặt 5 đến 4 theo cách đó (vì vậy 2+2sẽ bằng 5với các giá trị nhỏ của 5).
David Thornley

18
Xin lỗi, Alok, nhưng đây là FORTRAN sớm mà chúng ta đang nói đến. Nó sẽ không đúng sự thật 2 + 2 = 5; đó sẽ là một lỗi cú pháp. Điều gì sẽ là sự thật 2 + 2 .EQ. 5.
David Thornley

3
Trong Haskell đoạn trích sau ước tính thành 5: "let 2 + 2 = 5 in 2 + 2" :)
Tirpen

153

Không biết nó có thể được coi là một tính năng ngôn ngữ hay không, nhưng, trong C ++, hầu như bất kỳ lỗi biên dịch nào liên quan đến các mẫu đều cung cấp một lượng WTF hợp lý cho nhiều lập trình viên C ++ trên toàn thế giới hàng ngày :)


15
Điều đó không sao, hầu hết các mã liên quan đến các mẫu đã tạo ra rất nhiều WTF trên toàn thế giới.
Joris Timmermans

43
Hãy đến ngay bây giờ. tham chiếu không xác định đến `std :: basic_ostream <char, std :: char_traits <char >> & std :: toán tử << <std :: char_traits <char >> (std :: basic_ostream <char, std :: char_traits <char> > &, char const *) 'Hoàn toàn có thể đọc được!
Matt Greer

10
Tôi đã từng có một lỗi trình biên dịch liên quan đến mẫu là năm dòng, trong đó ngắn nhất là mười bảy nghìn ký tự (lỗi 'không khớp với lỗi x' cổ điển, trong một chương trình templated sâu). Đó là WTF, không phải là tính năng ở nơi đầu tiên, các mẫu rất tuyệt vời.
Andrew McGregor

111
Ngay cả khi không có lỗi, hãy thử tìm các hàm nào mất nhiều thời gian nhất với trình lược tả của bạn. Hãy nhìn xem, đó làstd::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::vector< std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator>(std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::allocator<std::pair<int, std::complex> >)
rlbond

12
Tôi nghĩ rằng điều này phù hợp ở đây: Kiểm tra STLFilt tại bdsoft.com/tools/stlfilt.html để làm cho đầu ra có thể đọc được.
trả trước

150

Nhiều không gian tên của C:

typedef int i;

void foo()
{
    struct i {i i;} i;
    i: i.i = 3;
    printf( "%i\n", i.i);
}

Hoặc với các nhân vật:

typedef char c;

void foo()
{
    struct c {c c;} c;
    c: c.c = 'c';
    printf( "%c\n", c.c);
}

Làm thế quái nào mà biên dịch này rõ ràng!?
Earlz

13
+1 Định danh thẻ cho enums và structs là phần khó hiểu nhất của C imho. Ít người hiểu tại sao thành ngữ để gõ một con trỏ tới một cấu trúc trông giống như nó.
Tadeusz A. Kadłubowski

11
Nó biên dịch bởi vì mỗi một trong số chúng tôi có một không gian tên rõ ràng do bối cảnh.
Andrew McGregor

149

Tôi muốn nói rằng toàn bộ khoảng trắng của Python là tính năng WTF lớn nhất của tôi. Thật vậy, bạn ít nhiều đã quen với nó sau một thời gian và các biên tập viên hiện đại giúp bạn dễ dàng xử lý, nhưng ngay cả sau khi phát triển trăn toàn thời gian trong năm qua, tôi vẫn tin rằng đó là một ý tưởng tồi. Tôi đã đọc tất cả các lý do đằng sau nó nhưng thành thật mà nói, nó cản trở năng suất của tôi. Không nhiều lắm, nhưng nó vẫn là một cái gờ dưới yên.

chỉnh sửa: đánh giá bằng các bình luận, một số người dường như nghĩ rằng tôi không muốn thụt mã của mình. Đó là một đánh giá không chính xác. Tôi đã luôn thụt mã của mình bất kể ngôn ngữ nào và tôi có bị ép buộc hay không. Điều tôi không thích là nó là sự thụt lề xác định khối mã nào nằm trong. Tôi thích các dấu phân cách rõ ràng cho điều đó. Trong số các lý do khác, tôi thấy các dấu phân cách rõ ràng làm cho việc cắt và dán mã dễ dàng hơn.

Ví dụ: nếu tôi có một khối thụt vào 4 khoảng trắng và dán nó vào cuối một khối được thụt vào 8 khoảng trắng, trình soạn thảo của tôi (tất cả các trình soạn thảo?) Không biết liệu mã được dán có thuộc khối 8 không gian hay bên ngoài không khối. OTOH, nếu tôi có các dấu phân cách rõ ràng thì rõ ràng khối nào thuộc về mã và làm thế nào nó được thụt vào - nó được thực hiện bằng cách tìm kiếm các dấu phân cách khối một cách thông minh.

chỉnh sửa 2: một số người cung cấp nhận xét dường như nghĩ rằng đây là một tính năng tôi ghét hoặc tôi nghĩ làm cho python trở thành một ngôn ngữ kém. Một lần nữa, không đúng sự thật. Mặc dù tôi không thích nó nhiều lắm, nhưng đó là điểm chính. Câu hỏi là về tính năng ngôn ngữ kỳ lạ nhất , và tôi nghĩ điều này thật kỳ lạ, bởi vì nó là thứ gì đó rất, rất ít (nhưng> 0) ngôn ngữ sử dụng.


63
nếu nó cản trở năng suất của bạn thì mã không phải trăn của bạn không thể đọc được ...
Tor Valamo

27
Bạn đã sử dụng ngôn ngữ nào trước Python? Làm thế nào bạn có thể làm việc với những người khác và không thụt vào ngôn ngữ đó? Làm thế nào bất cứ ai có thể đưa ra mã không thụt lề trong bất kỳ ngôn ngữ nào? Bạn có làm việc trong một căn phòng đầy những thiên tài không cần tín hiệu thị giác trong mã nguồn không?
S.Lott

53
+1 Không thể đồng ý nhiều hơn, nếu trình soạn thảo của tôi (Emacs) không thể thụt mã của tôi dựa trên một cái gì đó khác biệt (như niềng răng / bắt đầu, kết thúc / bạn đặt tên cho nó), điều đó thật nghiêm túc. Hầu như bất kỳ cấu trúc lại nào bạn thực hiện trên một chức năng "lớn hơn" có thể là một trải nghiệm thực sự tồi tệ.
Dmitry

83
Đây là thỏa thuận - với bất kỳ ngôn ngữ nào khác, tôi có thể làm nổi bật một khối mã và được thụt lề đúng cách bởi bất kỳ trình soạn thảo nào. Nhưng vì khoảng trắng IS theo định nghĩa thụt lề thích hợp, bạn sẽ mất khả năng đó trong Python. Vì vậy, khó hơn để di chuyển mã xung quanh hoặc tái cấu trúc mọi thứ. Và đối với người tuyên bố OP là "người đầu tiên khẳng định đó là một vấn đề", tôi đã phải duy trì một số mã trăn trong một thời gian và bây giờ tôi sẽ sử dụng bất kỳ ngôn ngữ nào trên python vì lý do này.
Kendall Helmstetter Gelner

38
Tôi không nhớ khoảng trắng trong Python. WTF là nó không được thi hành một cách nhất quán. Bạn có thể kết hợp các mức thụt lề và các tab, miễn là chúng phù hợp với anh chị em của chúng. Vì vậy, mức thụt đầu tiên có thể là một khoảng trắng và mức thứ hai có thể là hai TAB và đây không phải là lỗi cú pháp.
tức là

138

Tôi đã đấu tranh một chút về điều này:

1;

Trong perl, các mô-đun cần phải trả về một cái gì đó đúng .


29
Một số mô-đun có thể trả về giá trị dựa trên hoạt động thời gian chạy. Nếu bạn luôn luôn trả lại đúng sự thật, bạn vẫn không cần phải lo lắng về điều đó: returnvalues.useperl.at
Ẩn danh

8
Nếu bộ nhớ Perl của tôi phục vụ cho tôi một cách chính xác, việc trả về true từ một mô-đun cho biết mô-đun được tải thành công. Trả lại một giá trị sai có nghĩa là đã xảy ra sự cố và sẽ ngăn chương trình chạy (nếu không bị bắt).
Barry Brown

Đây là một tuyên bố C hợp lệ là tốt, chỉ có không có gì được trả lại.
sigjuice

24
Mark Dominus đã viết, "Tôi rất hiếm khi sử dụng 'Cogito ergo sum';mà mọi người đều biết là hiển nhiên đúng trong tất cả các vũ trụ có thể. Điều này đảm bảo tính di động tối đa."
Greg Bacon

PHP <?=1;?>trả về 1. <?=true;?>trả về 1. <?=false;?>trả về null.
Talvi Watia

135

Tôi ngạc nhiên khi không ai nhắc đến cấu trúc vòng lặp 7 của Visual Basic .

For i As Integer = 1 to 10 ... Next
While True ... End While
Do While True ... Loop
Do Until True ... Loop
Do ... Loop While True
Do ... Loop Until True
While True ... Wend

Vì dính an! Trước điều kiện của bạn là cách quá phức tạp!


47
Họ đáng lẽ phải làm cho nó " WhileWhend", vì có một số người phát âm từ "while" với từ gần đúng vô âm của âm thanh. Và tất nhiên nó xếp hàng đẹp hơn, và mã xếp hàng là tốt.
dreamlax

43
Tại sao bạn lại hành động như vậy?
Erik Forbes

48
Ồ Tôi hơi luyến tiếc khi nghĩ về nó. Lần đầu tiên tôi sử dụng VB đã trở lại như một đứa trẻ 9 tuổi. Tôi đến từ Thụy Điển và lúc đó không thành thạo tiếng Anh. Bây giờ, có một từ Thụy Điển gọi là "vänd", về cơ bản có nghĩa là "quay lại" và được phát âm tương tự như "wend". Do đó, tôi nghĩ rằng nó rất có ý nghĩa ... :)
Emil H

61
! không phải trong VB, nó là "Không". Hoặc là nó? Vâng, không phải là không, nhưng không phải.
brianary

7
Có, "Wend" là một từ tiếng Anh, có nghĩa là đi hoặc tiếp tục một số khóa học hoặc cách ( google.com/search?q=define%3A+wend ). Tôi không chắc điều đó có giúp ích hay không.
Michael Myers

134

Đối với những người không biết, bclà "ngôn ngữ máy tính chính xác tùy ý" và tôi sử dụng nó khá thường xuyên để tính toán nhanh, đặc biệt khi các số liên quan lớn ( $là dấu nhắc):

$ bc -lq
12^345
20774466823273785598434446955827049735727869127052322369317059031795\
19704325276892191015329301807037794598378537132233994613616420526484\
93077727371807711237016056649272805971389591721704273857856298577322\
13812114239610682963085721433938547031679267799296826048444696211521\
30457090778409728703018428147734622401526422774317612081074841839507\
864189781700150115308454681772032

bcđã là một lệnh Unix tiêu chuẩn trong một thời gian dài.

Bây giờ cho "tính năng WTF". Đây là từ man bc(nhấn mạnh của tôi):

Thoát : Khi đọc câu lệnh thoát, bộ xử lý bc bị chấm dứt, bất kể nơi nào tìm thấy câu lệnh thoát. Ví dụ: "nếu (0 == 1) thoát" sẽ khiến bc chấm dứt.

tạm dừng : Câu lệnh tạm dừng (phần mở rộng) là câu lệnh được thực thi khiến bộ xử lý bc chỉ thoát khi được thực thi. Ví dụ: "if (0 == 1) tạm dừng" sẽ không khiến bc chấm dứt vì việc tạm dừng không được thực thi.


41
Tôi sử dụng Haskell cho công cụ này.
Thomas Eding

8
Máy tính Google?
igul222

7
Tôi đã bắt đầu sử dụng Python và máy tính google rất tuyệt nếu bạn trực tuyến. Nhưng tôi đã từng sử dụng bctrước đó và muốn viết về bcbài viết của mình vì những trích dẫn tuyệt vời từ trang người đàn ông.
Alok Singhal

6
@Brian, sau đó bạn sẽ thích: echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc(mặc dù bạn có thể đã biết điều này).
Alok Singhal

2
Tôi sử dụng irb (Ruby tương tác shell). Nhưng trở lại trong ngày, tôi luôn đạt được dc - như bc, nhưng sử dụng đánh bóng ngược. Geektastic!
tragomaskhalos

134

Tôi luôn tự hỏi tại sao chương trình đơn giản nhất là:

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Trong khi đó, nó có thể là:

print "Hello World!"

Có lẽ điều này là khiến sinh viên khoa học máy tính sợ hãi ngay từ đầu ...


34
Trong một số ngôn ngữ, "Xin chào thế giới!" là một chương trình hợp lệ.
David Thornley

31
@SoMoS: trong hầu hết các ngôn ngữ động như Python, Ruby hoặc Perl in "Hello World!" hoặc một số biến thể nhỏ (ví dụ: đặt thay vì in) là một chương trình hợp lệ và đầy đủ.
Dave Kirby

36
@Loadmaster: hàm ý là "tất cả mã thuộc về một lớp" hoặc "tất cả mã thuộc về một hàm" là những ràng buộc không cần thiết
Jimmy

19
Chỉ vì một ngôn ngữ bắt buộc sử dụng các đối tượng, không có nghĩa là nó đang được sử dụng để lập trình hướng đối tượng thích hợp. Hoàn toàn có thể lập trình thủ tục trong Java hoặc C #. Đó là những gì phương pháp tĩnh dành cho.
jdmichal

68
Tôi yêu những người nghĩ rằng OOP có nghĩa là mọi thứ nên là một đối tượng.
Tor Valamo

132

JavaScript là hướng đối tượng, phải không? Vì vậy, các phương thức chạy trên chuỗi chữ và số nên hoạt động. Thích "hello".toUpperCase()3.toString(). Hóa ra cái thứ hai là lỗi cú pháp, tại sao? Bởi vì trình phân tích cú pháp dự kiến ​​một số được theo sau bởi một dấu chấm là một dấu phẩy động. Đó không phải là WTF, WTF là bạn chỉ phải thêm một dấu chấm khác để làm cho nó hoạt động:

3..toString()

Lý do là nghĩa đen 3.được hiểu là 3.0, và 3.0.toString()hoạt động tốt.


8
Hoạt động theo cách này trong Python quá (thử 3..__add__(4)). Sau đó, một lần nữa tôi nghĩ (3).__add__(4)là một cách ít tổn thương não hơn để làm điều đó :)
badp

49
Bạn chỉ có thể làm (3) .toString ()
Joseph Montanez

13
@ Gorilla3D: yeah, nhưng đó không phải là một tính năng ngôn ngữ lạ, phải không?
Theo

25
3.0.toString()làm mắt tôi ngứa.
Ben Trống

18
127.0.0.1.toInt ()
berkus

130

Trong JavaScript:

2 == [2]

// Even stranger
2 == [[[2]]]

// And down-right nutty
var a = { "abc" : 1 };
a[[[["abc"]]]] === a["abc"]; // this is also true

May mắn thay, những người tốt bụng tại stackoverflow.com đã giải thích toàn bộ cho tôi: Tại sao 2 == [2] trong JavaScript?


6
Đó là lý do tại sao bạn nên sử dụng ===thay thế.
Gumbo

10
Điều này rất hữu ích, nếu bạn có một hàm trả về một số và bạn muốn trả về một số siêu dữ liệu bổ sung với nó, bạn có thể trả về [số] với một số trường bổ sung được thêm vào. Mã đơn giản sẽ không bao giờ biết nó không phải là số thực và mã khác có thể nhận được siêu dữ liệu cần thiết.
Andrey Shchekin

36
@Andrey ngoại trừ rằng nếu tôi phải duy trì mã làm những gì bạn đề xuất, tôi sẽ sớm mong muốn cái chết của tác giả.
Breton

@Andrey, đó là một ý tưởng tuyệt vời! Bạn cũng có thể sử dụng Number(n)để làm một cái gì đó tương tự. Thật không may trong cả hai giải pháp của chúng tôi đều ===phá vỡ = (.
Xavi

5
+1: Tôi đã coi mình là một lập trình viên js có kiến ​​thức và tôi chưa bao giờ biết về điều này: D
Thomas Eding

126

Tính năng đáng ghét nhất của tôi là bất kỳ cú pháp tệp cấu hình nào bao gồm logic có điều kiện. Loại điều này đầy rẫy trong thế giới Java (Ant, Maven, v.v. Bạn biết bạn là ai!).

Bạn chỉ cần kết thúc lập trình bằng ngôn ngữ ac ** p, với gỡ lỗi hạn chế và hỗ trợ trình chỉnh sửa hạn chế.

Nếu bạn cần logic trong cấu hình của mình, phương pháp "Pythonic" của mã hóa cấu hình bằng ngôn ngữ thực sẽ tốt hơn nhiều.


24
Tcl đã phát minh lại rằng rất lâu trước khi Python ra đời và Lisp đã phát minh ra nó trước đó. Vì vậy, đừng gọi nó là Pythonic, hãy gọi nó là Emacs-ish.
slebetman

46
Hãy gọi nó là đúng.
bản tin

30
NGAY Nếu cấu hình hoặc ngôn ngữ xây dựng của bạn đã hoàn tất, bạn đang làm sai. Tôi đang nhìn bạn CMake / autotools.
Joseph Garvin

16
Đây chính xác là những gì Lua được thiết kế cho, ban đầu
Cogwheel

1
Chà, nếu mã của bạn bằng Python, thì việc có tệp cấu hình của bạn là tệp Python là một ý tưởng tuyệt vời, vì sau đó bạn chỉ cần nhập tệp và đọc các thuộc tính của mô-đun. Và bạn có được sức mạnh hoàn chỉnh 100% của Python trong tệp cấu hình của bạn.
asmeker

113

powerbasic (www.powerbasic.com) bao gồm chỉ thị của trình biên dịch:

# BLOAT {bloatsize}

điều này làm tăng kích thước của tệp thực thi được biên dịch bởi <bloatsize>byte. cái này được đặt trong trình biên dịch trong trường hợp mọi người tạo tệp thực thi không thích kích thước nhỏ của tệp thực thi được tạo. nó làm cho EXE dường như lớn hơn để cạnh tranh với các ngôn ngữ lập trình cồng kềnh :)


9
Haha yuk. Tôi đã nghe nói về các nhà phát triển cố tình làm chậm một số hoạt động (ví dụ như tìm kiếm) bởi vì nó giúp mọi người tin rằng nó thực sự đang làm gì đó. Điều tương tự tôi đoán.
David

42
Điều này nhắc nhở tôi về một cái gì đó tôi đọc gần đây. Họ đang thử nghiệm FPS và quyết định tăng số lượng điểm nhấn mà kẻ xấu có được. Sau đó, họ hỏi những người thử nghiệm xem AI của họ như thế nào và họ thề rằng nó thông minh hơn nhiều. Nhưng AI đã không thay đổi, chỉ là những điểm nhấn. Mọi người có một câu chuyện nhất định về thế giới trong đầu của họ, và nếu bạn hiểu và phù hợp với mong đợi của họ, họ sẽ chỉ cho rằng nó xác nhận câu chuyện kể của họ.
Nate CK

5
Tôi đã từng thêm rất nhiều sự chậm lại vào các chương trình của mình để làm cho chúng trông giống như chúng đang làm một cái gì đó phức tạp. Trở lại trường tiểu học, đó là.
Matti Virkkunen

3
Hồi đi học, chúng tôi có 80286 máy và tôi thực sự phải viết một số thói quen đầu ra màn hình trong lắp ráp để có tốc độ hợp lý (tức là không bò).
berkus

7
CK @Nate, nếu AI sống đủ lâu để khoe AI của nó, nó có thể thực sự được thông minh hơn, trong khi trước đó có thể đã chết quá nhanh để chứng minh điều đó.
zzzzBov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.