Странная языковая особенность

Из эмпирического тестирования кажется, что max() и min() в списке вернут первое в списке, которое соответствует max() / min() в случае связи:

>>> test = [(1, "a"), (1, "b"), (2, "c"), (2, "d")]
>>> max(test, key=lambda x: x[0])
(2, 'c')
>>> test = [(1, "a"), (1, "b"), (2, "d"), (2, "c")]
>>> max(test, key=lambda x: x[0])
(2, 'd')
>>> min(test, key=lambda x: x[0])
(1, 'a')
>>> test = [(1, "b"), (1, "a"), (2, "d"), (2, "c")]
>>> min(test, key=lambda x: x[0])
(1, 'b')

И Отличное слежение Джереми подтверждает, что это действительно так.

975
задан 22 revs, 8 users 38% 26 September 2011 в 15:40
поделиться

285 ответов

Переменные повсюду принимаются в виде глобалей в ColdFusion, независимо от того, где они размещены.

<cffunction name="one" returntype="void">
    <cfset var wtf="coldfusion">
    <cfinvoke method="second">
</cffunction>

<cffunction name="two" returntype="void">
    <cfoutput>#wtf#</cfoutput>
</cffunction>
4
ответ дан 22 November 2019 в 20:53
поделиться

В Пайтоне:

>>> x = 4
>>> y = 1000000
>>> x is 4
True
>>> y is 1000000
False
>>>

Просто попробуй, если не веришь мне!

4
ответ дан 22 November 2019 в 20:53
поделиться

В php:

easter_date - Получить временную метку Unix для полуночи Пасхи данного года

int easter_date ([int $ year])

4
ответ дан 22 November 2019 в 20:53
поделиться

В Java (на самом деле, я недавно написал это в другом сообщении SO):

    int x = 1 + + + + + + + + + + + + + 1;
    System.out.println(x);
4
ответ дан 22 November 2019 в 20:53
поделиться

SQLite позволяет объявлять столбцы с любым типом данных, который вам нужен. Он ищет несколько конкретных подстрок («INT», «REAL», «TEXT» и т. Д.) Для определения сродства.

Это позволяет использовать объявления типов:

CREATE TABLE Quirks (
   X    FLOATING POINT,  -- = INTEGER affinity because of the "INT"
   Y    STRING,          -- = NUMERIC affinity
);
4
ответ дан 22 November 2019 в 20:53
поделиться

В PHP

var_export('false' == 0);       // true

var_export('false' == true);    // true

var_export('false' == false);   // false

EDIT

Как упоминалось в @Kobi, это могло произойти, потому что язык интерпретирует любое значение как «ИСТИНА», кроме « ЛОЖЬ », но не в случае с PHP, где все еще более странно, чем вы думали!

Этот случай полностью задокументирован в главе «Преобразование строки в числа» руководства по PHP, где сказано:

Если строка начинается с допустимого числовые данные, это будет значение использовал. В противном случае значение будет 0 (нуль).

Вот пример:

print (int) 'zero';    // 0
print (int) 'false';   // 0
// but
print (int) '1 - one'; // 1

P.S. Я вижу больше вреда, чем пользы от таких неявных преобразований типов.

3
ответ дан 22 November 2019 в 20:53
поделиться

Этот старый фаворит PHP - это не только , который WTFish сам по себе, но ошибка разрешения области видимости - одна из тех вещей, которые видят так много разработчиков, что это того стоит проявляя некоторую WTF любовь:

$class = new StdClass();
$class::test();

PHP Parse error:  syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM on line 3
4
ответ дан 22 November 2019 в 20:53
поделиться

В Ruby вы можете делать некоторые странные вещи с помощью heredocs. Подумайте:

a = <<ONE
This is one. #{<<TWO}
This is two. #{<<THREE}
This is three.
THREE
TWO
ONE

p a # => "This is one. This is two. This is three.\n\n\n"
3
ответ дан 22 November 2019 в 20:53
поделиться

Рубиновые шлепанцы. «...» и «..» в условных операторах не всегда являются операторами диапазона:

(0..20).each do |x|
  if ((x%10) == 5)..((x%10) == 5)
    print "#{x} "
  end
end

(0..20).each do |x|
  if ((x%10) == 5)...((x%10) == 5)
    print "#{x} "
  end
end

Будет выведено:

5 15
5 6 7 8 9 10 11 12 13 14 15

.. проверяет оба оператора на каждом проходе, ... проверяет только «on» или «off» "в каждом проходе (в зависимости от состояния триггера). Они украдены из awk и sed.

Матц пишет в «Языке программирования Ruby»: «Триггеры - довольно непонятная особенность Ruby, и, вероятно, их лучше избегать ...»

3
ответ дан 22 November 2019 в 20:53
поделиться

Для тех, кто не знал, PostScript на самом деле является языком программирования. Я немного сошел с ума - я написал программу PostScript, которая вычисляет фрактал Мандельброта с очень высокой степенью детализации. Это действительно печатаемый PostScript, хотя он приведет к сбою многих драйверов печати ...

В любом случае, с чего начать с PostScript ... Вот один: вы действительно можете создать переменную с идентификатором ... ничего.

() cvn 5 def% Присвойте число 5 ... ничему

PostScript - это язык, основанный на стеке. () помещает в стек пустую строку. cvn преобразует его в имя ("/", если вы его напечатаете, потому что всем именам в PS предшествует косая черта). Затем 5 def присваивает ему значение 5. (% - символ комментария)

Вы не можете напрямую вернуть его, например если я скажу «/ print», это не напечатает число 5. Но вы можете получить его обратно косвенно:

() cvn load print% это напечатает число 5

Что еще ... PostScript имеет словари как собственный тип, и вы можете использовать ссылку на массив в качестве ключа к словарю ... но именно ССЫЛКА является ключом, а не массив. Итак:

/ myDict 100 dict def

[0] dup myDict exch 42 put myDict exch get ==% prints 42

myDict [1] 42 put myDict [1] get% выдает неопределенную ошибку

Изменить: Ах да, еще одна забавная вещь ... Попробуйте следующее в приглашении Ghostscript:

1 array dup dup 0 exch put ==

Ого!

3
ответ дан 22 November 2019 в 20:53
поделиться

Особое значение различных столбцов в Фортране. (Возможно, это совершенно естественно, если вы выросли с перфокартами.)

Одним из побочных эффектов этого является то, что, например, имена переменных усекаются после столбца 72. В сочетании с IMPLICIT NONE это приводит к молчаливому введению новой переменной, когда имя такой переменной начинается близко к столбцу 72.

Вам потребуется

  1. знать об этом

  2. редактор, который выделяет часть комментария (после колонки 72) другим цветом, чем часть до...

4
ответ дан 22 November 2019 в 20:53
поделиться

Поскольку я не видел, чтобы кто-нибудь об этом упоминал ... RPG 2 или 3 (Генератор программ отчетов ... он же Rocket Propelled Garbage) - это, безусловно, самый мерзкий язык, который я когда-либо использовал. Он сочетает в себе почти полное отсутствие контроля над потоком программы (Enter вверху файла, Exit внизу), а операторы программирования определяются на основе символов, определенных в определенных столбцах, с использованием фиксированного шрифта (подумайте о ПЕРФОКАРТАХ !!).

Чтобы быть действительно FUBAR, вы должны попытаться программировать на DYL-280. Он сочетал в себе последовательность и логику RPG с синтаксисом COBOL.

Найдите здесь RPG: wikipedia.org / wiki / IBM_RPG

Пример DYL-280: http://99-bottles-of-beer.net/language-dyl-280-224. html

3
ответ дан 22 November 2019 в 20:53
поделиться

Вот немного возни в отладчике Perl:

  DB<1> sub foo { +(1..20) } 
  DB<2> @bar = foo(); # list of 1, 2, 3, 4...20
  DB<3> x scalar @bar # size of list
0  20
  DB<4> x scalar foo();
0  ''

Все верно. Когда вы вызываете метод таким образом, скалярный контекст из scalar распространяется вниз в вызов подпрограммы, превращая безобидно выглядящий ... в совершенно другой оператор. (Это оператор "флип-флоп", а не оператор диапазона).

3
ответ дан 22 November 2019 в 20:53
поделиться

JCL Условное выполнение.

//STEP02 EXEC PGM=PROG02,COND=(4,GT,STEP01) .

Эта возможность позволяет выполнять или не выполнять шаг в зависимости от кода возврата от предыдущих шагов. Довольно неплохая возможность.

За исключением пары небольших возможностей, которые вывернули логику наизнанку и назад.

Во-первых, шаг НЕ выполняется, если условие истинно.

Во-вторых, 4,GT,STEP01 на самом деле означает "если код возврата из STEP01 больше 4"

Так что все это означает "Не выполняйте этот шаг, если код возврата из STEP01 больше 4"

Так что все это означает "Не выполняйте этот шаг, если код возврата из STEP01 больше 4". Это почти, но не совсем то же самое, что и наивная интерпретация "Выполнять этот этап, если 4 больше, чем код возврата из STEP01".

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

2
ответ дан 22 November 2019 в 20:53
поделиться

В Lisp можно скопировать список, скопировать вектор, скопировать структуру, скопировать CLOS-объект...

... но нельзя скопировать массив или хэш-таблицу.

2
ответ дан 22 November 2019 в 20:53
поделиться

Обратная польская нотация (РПН). Это означает, что аргументы предшествуют функции. Или, другими словами, вы добавляете два и два, записывая 2 +.

Языки, показывающие, что WTF включает Форт, Postscript (да, лазерных принтеров) и Factor.

.
2
ответ дан 22 November 2019 в 20:53
поделиться

Я думаю, что это на самом деле не "языковая особенность" (C), и я, вполне возможно, очень невежественен в размещении, но я не мог понять, почему это происходит, поэтому я спрошу. Если это окажется связано с какой-то странной языковой особенностью... ну, это действительно сделало меня "WTF", так что это место стоит того.

int a = 0;
int *p = &a;

printf("%d, %d, %d.\n", *p, (*p)++, *p); // Outputs "1, 0, 0.\n" on MinGW's GCC 4.4.1

Почему?

-- редактирование

-- только что получилось, и это не так уж и важно. Теперь я чувствую, как над мной смеются гуру C++. Я думаю, что порядок, в котором вычисляются параметры функции, не определен, так что компиляторы могут вызывать их по своему усмотрению (и я думаю, что читал об этом где-то в документации по boost). В данном случае утверждения аргументов вычислялись задом наперёд, вероятно, отражая соглашение о вызове функции.

.
2
ответ дан 22 November 2019 в 20:53
поделиться

FORTRAN на самом деле не WTF момент, а скорее "Зачем мне набирать весь этот мусорный момент"

IF(12 .gt. 11) THEN
 // Do some magic
ENDIF

".gt." сбил меня с толку, когда я немного играл с языком, пока я не понял, что это был символ ">". О, как мне нравится не быть биологом и баловаться в этом дерьме изо дня в день

.
2
ответ дан 22 November 2019 в 20:53
поделиться

Меня всегда интересовало назначение этой функции в математическом классе библиотеки Java Core:

static double expm1(double x);  // Returns e^x - 1.
1
ответ дан 22 November 2019 в 20:53
поделиться

Оглядываясь назад, вычисленная гота FORTRAN довольно странная. Википедия сообщает мне, что некоторые BASIC перестарались.

Другой известный фаворит - вызов Алголя 60-х по имени, передача параметра.

.
1
ответ дан 22 November 2019 в 20:53
поделиться

C# оператор доходности, не странный, но довольно полезный.

http://msdn.microsoft.com/en-us/library/9k7k7cf0(VS.80).aspx

1
ответ дан 22 November 2019 в 20:53
поделиться

На обычном Лиспе массивы с нулевыми размерами странные, и, естественно, они имеют читаемый синтаксис.

? (aref #0A5)
5
2
ответ дан 22 November 2019 в 20:53
поделиться

В Bash переменные могут быть и скалярами, и массивами:

$ a=3
$ echo $a
3
$ echo ${a[@]}    # treat it like an array
3
$ declare -p a    # but it's not
declare -- a="3"
$ a[1]=4          # treat it like an array
$ echo $a         # acts like it's scalar
3
$ echo ${a[@]}    # but it's not
3 4
$ declare -p a
declare -a a='([0]="3" [1]="4")'
$ a=5             # treat it like a scalar
$ echo $a         # acts like it's scalar
5
$ echo ${a[@]}    # but it's not
5 4
$ declare -p a
declare -a a='([0]="5" [1]="4")'

ksh делает то же самое, но использует typet вместо declare.

Когда вы делаете это в zsh, вы получаете присваивание подстрок вместо массивов:

$ a=3
$ a[2]=4          # zsh is one-indexed by default
$ echo $a
34
$ a[3]=567
$ echo $a
34567
$ a[3]=9
$ echo $a
34967
$ a[3]=123         # here it overwrites the first character, but inserts the others
$ echo $a
3412367
$ a=(1 2 3)
$ echo $a
1 2 3              # it's an array without needing to use ${a[@]} (but it will work)
$ a[2]=99          # what about assignments?
$ echo $a
1 99 3
2
ответ дан 22 November 2019 в 20:53
поделиться

В C#, почему это не легально?

public class MyClass<T>
    where T: Enum
{

}

Было бы неплохо иметь возможность добавлять методы-расширения в Enum's вместе с Func, где T было бы перечислением, которое вы расширяете, так что вы могли бы получить вывод типа на это перечисление.

Re комментарий: Да, вы можете расширить настоящее перечисление, но вот в чем разница:

Вы можете сделать это:

public static void DoSomethingWithEnum(this Enum e)
{
   //do whatever
}

но что, если вы хотите взять Func со своим методом, который будет иметь тот же тип, что и перечисление:

public static void DoSomethingWithEnum<T>(this T e, Func<T,bool> func )
   where T: Enum
{
   //do whatever
}

Таким образом, вы можете вызвать свой метод так:

DayOfWeek today = DayOfWeek.Monday;
today.DoSomethingWithEnum(e => e != DayOfWeek.Sunday);

или что-то в этом роде. У вас есть идея... Это невозможно, и я не уверен, почему...

1
ответ дан 22 November 2019 в 20:53
поделиться

Perl's CORE::open и стандартная библиотека, имеющая элементы объектной ориентации, замаскированные под процедурный интерфейс: open ( my $fh, '>', 'foobar'); open - конструктор, который работает по ссылке, возвращаемой функцией my(), и принимает аргументы '>' и 'foobar'. Более того, это объект, который является благословенным печатным шрифтом (что означает, что он не может держать состояние внутри объекта).

Больше информации о моем perlmonks посту IO::File vs CORE::open здесь: http://www.perlmonks.org/?node_id=763565

2
ответ дан 22 November 2019 в 20:53
поделиться

Компилятор Fortran, который я использовал много лет назад, обладал интересной особенностью: (a) Цифры сначала хранились в высоком байте; (b) Цифры передавались в подпрограммы по адресу; (c) не было проверки длины во время компиляции.

Так что вы могли бы написать программу, подобную этой: (Извините, если я испортил синтаксис. Прошло много времени с тех пор, как я написал Fortran.)

INTEGER*2 FUNCTION TIMESTWO (INTEGER*2 N)
RETURN N*2

... THEN CALL THIS SOMEWHERE WITH A LONG INTEGER ...

INTEGER*4 I, J

I=42
J=TIMESTWO(I)

Окончательное значение J равно ... нулю!

Почему? Потому что передаваемое значение равно 4 байтам, но вызываемая функция смотрит только на первые два байта. Так как первые два байта равны нулю, то она удваивает ноль и возвращает его. Это возвращаемое значение затем преобразуется обратно в четыре байта.

Это было очень загадочно, когда я впервые столкнулся с этим. Почти каждое число, которое я передал некоторым функциям, интерпретировалось как ноль!

.
2
ответ дан 22 November 2019 в 20:53
поделиться

Что-то странное - в VBScript есть ключевое слово Null и ключевое слово Nothing ( Null отсутствуют данные и ] Ничего - это недостающий объект). Почему бы не использовать одно ключевое слово ...? Кажется, что большинство других языков прекрасно справляются с одним!

Visual Basic 6.0 и, конечно же, «классический ASP» код (потому что он использует VBScript) имеют одинаковую причудливость. И в старом, и в новом Visual Basic у нас также есть DBNull .

Однако ситуация улучшается, поскольку в Visual Basic.NET Null наконец-то исчез, так что Null не используется и только Nothing и ] DBNull .

2
ответ дан 22 November 2019 в 20:53
поделиться

Спасибо за ответы, я играл вокруг с этим, и после некоторой помощи от моего друга Google я нашел Каир пакет, который позволяет создавать файлы svg, я могу затем редактировать их в Inkscape .

library(Cairo)
Cairo(600,600,file="testplot.svg",type="svg",bg="transparent",pointsize=8, units="px",dpi=400)
testplot
dev.off()
Cairo(1200,1200,file="testplot12200.png",type="png",bg="transparent",pointsize=12, units="px",dpi=200)
testplot
dev.off()

Теперь я просто должен играть с различными настройками, чтобы получить мой график как можно лучше, прежде чем написать файл.

-121--3320749-

Это классическая проблема производителя/потребителя. Это можно решить с помощью переименования файлов, которое является атомарным в системах POSIX.

-121--1462283-

Очень маленькая вещь, которая раздражала меня в COBOL, заключалась в том, что не было специальной операции по модулю. Вместо этого можно сделать деление, указывающее, что нужны только целые числовые результаты, а остальные сохранить в другой переменной. Поскольку COBOL очень чувствителен, когда дело доходит до переменных, это означает, что вы в конечном итоге с переменной, которая вам не очень нужна, то есть фактический результат деления. Это история о том, как я однажды назвал переменную «БЕСПОЛЕЗНО» - это было самое подходящее имя, которое я мог бы придумать.

2
ответ дан 22 November 2019 в 20:53
поделиться

Я не могу поверить, что это еще не здесь: Доступ к недвижимости JSF .

В теге jsf-интерфейса вы получите значение свойства от объекта сервера в интерфейс, ссылаясь на него таким же образом:

<h:inputText value="#{myObject.property}></h:inputText>

Дело в том, что Java не поддерживает свойства, поэтому вы должны написать Методы, начинающиеся с GET и SET, чтобы связать объект пользовательского интерфейса к «свойству» на сервере.

public void setProperty(String property){...}
public String getProperty(){...}

Это запутало меня, когда я впервые узнал JSF, и я все еще считаю, что WTF-достойным ... хотя на самом деле на самом деле нет другого способа сделать это до тех пор, пока Java не реализует поддержку Свойства C # -лей.

2
ответ дан 22 November 2019 в 20:53
поделиться

Вы настроили Trust Store для вашего соединения?

-121--5044751-

в SQL Server (MS, по крайней мере):

Это всегда будет оценивать значение false:

IF @someint <> NULL

Дано:

DECLARE @int INT

SET @int = 6

IF @int <> NULL
BEGIN
    Print '@int is not null'
END
ELSE
BEGIN
    Print '@int is evaluating to null'
END

Вывод будет:

@int is evaluating to null

Это должно быть написано:

IF @someint IS NOT NULL
BEGIN
END

Кто поставил английские майоры на команду SQL! :)

2
ответ дан 22 November 2019 в 20:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: