web-dev-qa-db-ja.com

最も奇妙な言語機能

あなたの意見では、あなたが遭遇した中で最も驚くべき、奇妙な、奇妙な、あるいは本当に "WTF"言語の特徴は何ですか?

1つの回答につき1つの機能だけを入力してください。

975
Thomas Bonini

ルビーフリップフロップ。条件文の "..."と ".."は必ずしも範囲演算子ではありません。

(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から盗まれます。

Matzは "Rubyプログラミング言語"で書いている: "フリップフロップはRubyのかなりあいまいな機能であり、おそらく最も避けることが..."

3
Skade

PHPで

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

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

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

_編集_

@Kobiが述べたように、それは言語が "FALSE"以外の "TRUE"としてどんな値でも解釈するが、物事があなたが思ったよりもっともっと奇妙であるPHPの場合ではないので起こるかもしれない!

この場合はPHPマニュアルの "文字列から数値への変換"の章で詳しく説明されています。

文字列が有効な数値データで始まる場合は、これが使用される値になります。それ以外の場合、値は0(ゼロ)になります。

これが例です。

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

P.Sそのような暗黙の型変換の有用性よりも私はもっと害があると思います。

3

RPG 2または3(Report Program Generator ...別名Rocket Propelled Garbage)は、私がこれまでに使った中で最も間違いのない言語です。これはプログラムの流れをほとんど制御せず(ファイルの先頭で入力し、末尾で終了)、プログラミングステートメントは固定フォントを使用して特定の列で定義された文字に基づいて定義されます(PUNCH CARDSと思います)。

本当に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
Bill

知らない人にとっては、PostScriptは実際にはプログラミング言語です。私はそれに少し気が狂いました - 私は非常に高いレベルの詳細までマンデルブローフラクタルを計算するPostScriptプログラムを書きました。本当に印刷可能なPostScriptですが、多くの印刷ドライバをクラッシュさせます….

とにかく、PostScriptから始める場所...これが1つです。実際には、識別子が....なしの変数を作成できます。

()cvn 5 def%5に5を割り当てて...何もしない

PostScriptはスタックベースの言語です。 ()スタックに空の文字列を置きます。 cvnはそれを名前に変換します(PSのすべての名前の前にスラッシュがあるため、印刷する場合は "/"です)。それから5 defはそれに値5を割り当てます。 (%はコメント文字)

直接取り戻すことはできません。私が "/ print"と言っても、数字の5は印刷されません。しかし、間接的に戻すことができます。

()cvn load print%これは数字5を表示します

PostScriptはネイティブ型として辞書を持っています、そしてあなたは辞書へのキーとして配列参照を使うことができます...しかしそれはキーであり、配列ではないREFERENCEです。そう:

/ myDict 100ディクトルフ

[0] dup myDict exch 42 put myDict exch get ==%プリント42

myDict [1] 42 put myDict [1] get%は未定義エラーをスローします

編集: /もう1つ楽しいこと... Ghostscriptプロンプトで次のことを試してください。

1 array dup dup 0 exch put ==

あー!

3
James Sweet

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
mattonrails

私のC++のお気に入りの1つ:

#include <iostream>
using namespace std;
int main()
{
    cout <<  3 << 5  << endl;
    cout << (3 << 5) << endl;
    return 0;
}

もちろん、これは簡単に説明できますが、プログラミングの学生が頭を悩ませ始めています。

3
pr1268

RSLプログラミング言語は、1つの奇妙な銀行システムで使用されています。配列用の組み込みクラスTArrayがあります。しかし、そこから継承すると、すべてのインスタンス変数は配列の要素になります。

class (TArray) DerivedArray
  var someField = 56;
end

var a = DerivedArray();
PrintLn(a.Size);     // => 1
PrintLn(a[0]);       // => 56 
3
Ilya Golota

_ php _ backticks

/から http://www.php.net/manual/en/language.operators.execution.php

PHPは1つの実行演算子をサポートしています:バックティック( ``)。これらは一重引用符ではありません。 PHPは、バッククォートの内容をシェルコマンドとして実行しようとします。出力が返されます(つまり、単純に出力にダンプされるのではなく、変数に割り当てることができます)。

$output = `ls -al`;
echo "<pre>$output</pre>";

まあ、コード内ではなく「見つける」ことは「非常に簡単」です。

これも面白いですね。

多くのトラブルの後、私はバッククォート演算子(そしてShell_exec)がリターンのために 制限されたバッファ を持っていると結論しました。私の問題は、私が50万行を超えるファイルを持っていて、10万行をはるかに超える応答を受け取っていたことです。しばらくして、私はパイプが閉じられていることについてgrepからのエラーであふれました。

3
Vili

これが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
fennec

機能:Bash、Kornシェル(ksh93)、およびZシェルはそれぞれ、ドル記号付きまたはドル記号なしの変数を使用した配列の添え字付けを許可します。

array[index]=$value
array[$index]=$value

これは、ドル記号で、10000の期待値を生成します。

unset array
for i in {1..10000}
do
    ((array[$RANDOM%6+1]++))
done
unset total
for count in ${array[@]}
do
    ((total += count))
done
echo $total

Strangeness:RANDOMからドル記号を削除すると、合計は10000を超えるようにランダムに変化します。

同様に、これは2ではなく3を生成します。

a=1; ((r[a++]++)); echo $a

そして、インダイレクションを使用している場合は実行できますが、割り当てであるため、そこにドル記号を使用することはできませんが、二重評価は依然として発生します。

理由:ドル記号を使用すると、変数の展開は算術評価の前に実行されるため、一度だけ実行されます。ドル記号なしで、2回実行されます。1回はルックアップのインデックスを計算し、もう1回は割り当てのインデックスを計算します(したがって、実際には、ループの1ステップでの割り当てはarray[4] = $array[6] + 1のようになります。配列をスクランブルします)。

3

(MRI/C)RubyとMacRuby(しかしJRubyにはない)でシステムロールオーバーが発生し、その後にローカルタイムエラーが発生した場合はどうなるでしょうか。一般的な問題ではありませんが、奇妙なことです。

$ Ruby -version
Ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
$ irb
>> Time.at(67767976233550799)
=> Tue Dec 31 23:59:59 -0500 2147483647
>> Time.at(67767976233550800)
=> Wed Jan 01 00:00:00 -0500 -2147483648
>> Time.at(67768036191694799)
=> Wed Dec 31 23:59:59 -0500 -2147481749
>> Time.at(67768036191694800)
ArgumentError: localtime error
...
Maybe IRB bug!!

ただし、これは64ビット環境に固有の場合があります。

3
Gary S. Weaver

奇妙なもの-NullキーワードとNothingキーワードの両方を持つVBScript(Nullはデータがなく、Nothingはオブジェクトがありません)。キーワードを1つだけ持たないのはなぜですか?他のほとんどの言語は1つでうまくいくようです!

Visual Basic 6.0と(もちろん、VBScriptを使用しているため) "Classic ASP"コードも同じ奇妙さを持っています。 Visual Basicの新旧には、DBNullもあります。

ただし、Visual Basic.NETのNullはようやくなくなったため、Nullは使用されず、NothingDBNullのみが使用されます。

2
martinr

sa = "a =" "a =" "" "a" "" "、@ a =" "" "2N" "" "、a =" "" "c =" "" "_(" "" " 22 "" ""?@ a)、@ a ""、@ a、a = "" a ""、a(c)= "" S + "" _ c、e = $ T(@@ a @(c) ) "、@ a

これはCOS(cache objectscript)のいい一行です。ここで注意すべき面白いことは、コード間接化の5つの異なるモードです* G

2
kazamatzuri

これらの残りの部分は、驚くべきRuby Flip-Flop Operatorには何も関係ありません。

p = proc {|a,b| a..b ? "yes" : "no" }

p[false,false]    => "no"
p[true,false]     => "yes"
p[false,false]    => "yes"   # ???
p[false,true]     => "yes"
p[false,false]    => "no"

はい、プログラムの状態はインタプリタの解析木に格納されています。このようなことが、準拠したRuby実装を作るのに永遠にかかる理由です。 Ruby <3

2
jedediah

PHPでは、次のようになります。

<?php $foo = 'abc'; echo "{$foo";

構文エラーです。

実際に{が必要で、その後に$fooの内容が続く場合は、.を使用する必要があります。

<?php $foo = 'abc'; echo '{' . $foo;
2
Ollie Saunders

Processing(processing.org)はJavaに基づく言語です。簡単に言うと、処理コンパイラは、処理固有の構文をJavaに変換するJavaプリプロセッサです。

言語の設計上、いくつかの驚きがあります。

ProcessingのクラスはJavaの内部クラスにコンパイルされます。これは、実際にはプライベートではないプライベート変数のように、いくつかの煩わしさを引き起こします。

class Foo {
  private int var = 0; // compiles fine
}

void setup() {
  Foo f = new Foo();
  print(f.var); // but does not causes compile error
}

draw()関数も欠けていると、イベントハンドラは呼び出されません。

// void draw() {} // if you forgot to include this
void mousePressed() {
  print("this is never called");
}
2
Lie Ryan

逆ポーランド記法(RPN)。これは引数が関数の前にくることを意味します。あるいは、2 2 +と書くことで、2と2を足します。

そのWTFを特色とする言語には、Forth、PostScript(はい、レーザープリンタ)、およびFactorがあります。

2

私が何年も前に使った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バイトだけを調べます。最初の2つはゼロなので、ゼロを2倍にして返します。この戻り値は4バイトに変換されます。

私が初めてそれに出会ったとき、これは非常に不思議でした。特定の関数に渡したほぼすべての数がゼロとして解釈されました。

2
Jay

COBOLで私を悩ませた非常に小さなことは、専用のモジュロ演算がなかったことです。代わりに、整数の結果のみを求め、残りを別の変数に格納するように指定して除算を行うことができます。 COBOLは変数に関しては非常に敏感なので、それはあなたが本当に必要としていなかった変数、つまり除算の実際の結果になったことを意味します。これは私がどうやって変数に「USELESS」という名前を付けたかの物語です - それは私が考えることができる最も適切な名前でした。

2
Anne Schuessler

PerlのCORE :: openと、手続き型インターフェイスでマスクされたオブジェクト指向の要素を持つ標準ライブラリ:open ( my $fh, '>', 'foobar' ); openは、my()によって返される参照を操作し、引数 '>'をとるコンストラクタです。 「foobar」。さらに、それは祝福されたタイプグロブであるオブジェクトであること(オブジェクト内に状態を保持できないことを意味します)。

Perlmonksの投稿の詳細IO :: File vs CORE :: openここ: http://www.perlmonks.org/? node_id = 763565

2
Evan Carroll

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も同じことをしますが、typesetの代わりに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

SQLサーバー(少なくとも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
Fred

オハイオ州立大学では、Resolve/C++と呼ばれる標準的なC++言語を使用してプログラミングを教えています。 Resolve/C++はすべてのものに対して契約による設計方法を使用します。メソッドとオブジェクト間の必須/確実な関係を維持することを強制するように、コンパイルされるコメント内のコンポーネントとメソッドを数学的にモデル化する必要があります。

2
It Grunt

C++では、保護された抽象仮想ベースの純粋仮想プライベートデストラクタを作成する機能。

これは、保護された抽象仮想ベースから継承された純粋な仮想プライベートデストラクタです。

IOW、クラスのメンバーまたは友人(private)によってのみ呼び出すことができ、それを宣言する基本クラス(abstract base)に0(純粋仮想)が割り当てられ、後で定義される/ overriden保護された方法で多重継承された基底(仮想基底)を共有する派生クラスで。

2
RoadWarrior

rubyでは...

i=true
while(i)
   i=false
   a=2
end
puts defined?(a) // returns true
2
Lucas

FORTRANは実際にはWTFの瞬間ではありませんが、むしろ「なぜこのゴミの瞬間をすべて入力する必要があるのですか」です。

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

「.gt」私がそれが ">"記号であることに気づくまで、私がその言語で少し遊んでいたときに私を捨てた。ああ私はどのように私は生物学の専攻学生ではないし、このがらくたに手を出していなければならないのが大好きです

2
WarmWaffles

Common LISPでは、次元0の配列は奇妙であり、当然、それらは読み取り構文を持っています。

? (aref #0A5)
5
2
Brian

これは実際には「言語機能」(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

LISPでは、リストをコピーすることができます、そしてあなたはベクトルをコピーすることができます、そしてあなたはstructをコピーすることができます、そしてあなたはCLOSオブジェクトをコピーすることができます...

...しかし、配列やハッシュテーブルはコピーできません。

2
user245384

技術的には言語のWTFではなく、アーキテクチャのものです。

http://www.6502.org/tutorials/6502opcodes.html#JMP

6502アセンブリ、間接JMP:

間接ジャンプに関連するキャリーはないことに注意してください。

間接ジャンプは絶対にAを使用しないでください

最後のバイトのベクトル開始

ページの

例えば、アドレス$ 3000に$ 40が含まれ、$ 30FFに$ 80が含まれ、$ 3100に$ 50が含まれる場合、意図したとおりにJMP($ 30FF)の結果は$ 5080ではなく$ 4080に制御が移管されます。 $ 30FFからそして$ 3000からの上位バイト。

そのため、コードに1バイトを追加すると、間接ジャンプがターゲットから大きく外れる可能性があります。

2
Bob Montgomery

午前中に同居できるのであれば、Perlは自動的に基数26を基数10に変換することができます。

$ Perl -E "say lc (@a='a'..'asdf')"
30530
2
gamache

これがまだここにないとは思えない: JSFプロパティへのアクセス

JSF UIタグでは、次のように参照して、サーバー側オブジェクトのプロパティの値をインタフェースに配置します。

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

つまり、Javaはプロパティをサポートしていないため、UIオブジェクトをサーバー上の「プロパティ」にリンクするには、getおよびsetで始まるメソッドを作成する必要があります。

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

私がJSFを最初に学んだときにこれは私を混乱させ、私はまだそれがWTFに値すると考えています…JavaがC#スタイルのプロパティのサポートを実装するまでは他にはありません.

2
iandisme

英語の主観的な場合。

ああ、あなたはプログラミング言語を意味しましたか?次に、Cで(macro)を使用して、macro()のプリプロセッサ#defineをバイパスします。たとえば、誰かが#define free(...)を持っている場合、(free)(...)free(...)と同じにはなりません。

2
MSN

_ comefrom _ だれか?

2
Gaurav

JCL条件付き実行.

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

この機能により、前のステップからの戻りコードに応じてステップを実行することも、実行しないこともできます。とてもいい機能です。

ロジックを裏返しにする2つの小さな機能を除いて。

最初に、条件が真であればステップは実行されません。

次に、4、GT、STEP01は実際には「STEP01からの戻りコードが4より大きい場合」を意味します。

つまり、「STEP01からの戻りコードが4より大きい場合は、このステップを実行しない」ということです。これは、「4がSTEP01からの戻りコードより大きい場合はステップを実行する」という単純な解釈とほとんど同じですが、まったく同じではありません。

あなたがこれらのことを真剣に見た時だけが、列の反対側の必死の夜勤オペレータと一緒に約2.30 amであることを考えると、この二重のあいまいさは深刻な頭痛につながります。

2
James Anderson

これは奇妙な機能ではありません。実際に考えてみると、実際にはまったく意味がありますが、それでもWTFの瞬間を教えてください。

C++(およびC#)では、基本のサブクラスは、基本のインスタンス上の非公開メンバーおよび保護メンバーにアクセスできません。

class Base {
protected:
 m_fooBar;
};

class Derived: public Base {
public:
 void Test(Base& baseInstance) {
  m_fooBar=1; //OK
  baseInstance.m_fooBar = 1; //Badness
  //This, however is OK:
  ((Derived&)baseInstance).m_fooBar = 1; //OK
 }
};
2
Igor Zevaka

私は昔、BUT句を使って言語を作成しました。

1
user207421

Cプリプロセッサとその使用法具体的には、プリプロセッサのメタプログラミングと、プリプロセッサを使用した移植可能なコードの生成 - 合計mindfcuk。

1
Hassan Syed

C#では「動的」です。

Intellisense、型安全性、決定論は "dynamic"キーワードの最初の使用で即座に死んでしまうので、RADまたはpythonの犠牲者と一緒に仕事をしなければならないすべての人にとって一日を台無しにします。

1

C#には、「拡張メソッド」と呼ばれる機能があります。これは、Rubyのミックスインとほぼ同じです。基本的に、既存のクラス定義にメソッドを追加できます(たとえば、Stringに「reverse()」を追加する必要があります)。とても傾いていました)。それだけで大丈夫です - "奇妙な"部分は、これらの拡張メソッドをメソッド本体とすべてのものと共に interface に追加できることです。一方で、これは、同じ継承ツリーの一部ではないクラス全体に単一のメソッドを追加する方法として便利です。もう一方では、具体化されたメソッドをインタフェースに追加しているため、本質的にインタフェースの定義が壊れています。

1
callingshotgun

振り返ってみると、FORTRANの計算後藤はかなり奇妙です。 ウィキペディアに教えてください いくつかのBASICがそれをしのぎます。

もう一つの有名なお気に入りはALGOL 60の 名前による呼び出し パラメータ渡しです。

1
reinierpost

_ j _ では、ほとんどのプリミティブ(別名関数)は二項式(1つの引数)または2項式(2つの引数、左に1つ、右に1つ)です。しかし、修正プリミティブには3がかかります(私はそれが唯一のものだと思いますが、外国為替以外に)。それは3がかかるだろうことは理解できますが、それはちょうど...最初は間違って見えます。

vector =: i. 10   NB. Vector will be 0 1 2 3 4 5 6 7 8 9
(10) (0) } vector NB. Will yield 10 1 2 3 4 5 6 7 8 9
1
MPelletier

私はいつも、JavaコアライブラリのMathクラスでこの関数の目的について疑問に思いました。

static double expm1(double x);  // Returns e^x - 1.
1
Benno

_ j _ では、foreigns(!:)は束ねられたさまざまな関数です。左側の引数はカテゴリであり、右側はさまざまなものに対する増分値であることが多いですが、常にではありません。例えば:

 2!:55 NB。コンソールを閉じる
 9!:10 NB。印刷精度を設定する
 6!:0 NB。実時間
 6!:2 NB。実行時間
 4!:3 NB読み込まれたスクリプト

もちろん、賢いことはそれらをラップすることですが、あなたはただメモリにコミットする人もいます。ところで、それらのすべては、それを考えるようになった、2つの引数を右側に、1つを左側にして、三つ組です。あなたがそれらに最終的な有効な議論を与えない限り、上記のどれもはたらきません。

1
MPelletier

PHPでは、クラス変数にグローバルを明示的に参照し、 this-> を明示的に使用する必要があります。リファクタリングを楽​​しくします。すべての使用方法を見つけずに、変数または引数をグローバルまたはクラスメンバーに昇格させることはできません。

1
Seva Alekseyev

Cでは、a[b][c]c[b[a]]とまったく同じものです。

1
user245839

Fooとはどんなデータ型ですか?

SELECT TOP 1
   NULL AS foo
INTO
   dbo.bar
FROM
   sys.columns --trivial

なぜすべてがゼロになるのですか?

SELECT CAST('' AS int), CAST('' AS datetime), CAST('' AS float)

これ以外は・・・

SELECT CAST('' AS decimal)
1
gbn

HaskellによるMaybeJustの使用。 Maybe aJust aの型を返す型コンストラクタですが、Maybe Intは単なるIntを受け入れないため、Just IntまたはNothingである必要があります。だから、本質的にhaskellの用語で言うと、Just IntはAppleがオレンジ色であるのと同じくらいのIntだ。唯一の接続は、Just 5Maybe Intergerの型を返すということです。これは、関数JustおよびInteger引数を使用して構成できます。これは理にかなっていますが、理論的に可能な限り説明するのは難しいですが、どちらが正しいのでしょうか。それでJustは本当にJustKindaLikeButNotAtAllそうそう、またMaybeは本当にKindaLooksLikeOrIsNothing、そうそうそうです。

-- Create a function that returns a Maybe Int, and return a 5, which know is definitly Int'able
>  let x :: Maybe Int; x = 5;
<interactive>:1:24:
    No instance for (Num (Maybe Int))
      arising from the literal `5' at <interactive>:1:24
    Possible fix: add an instance declaration for (Num (Maybe Int))
    In the expression: 5
    In the definition of `x': x = 5

>  Just 5  
Just 5
it :: Maybe Integer

    -- Create a function x which takes an Int
>  let x :: Int -> Int; x _ = 0;
x :: Int -> Int
-- Try to give it a Just Int
>  x $ Just 5                   

<interactive>:1:4:
    Couldn't match expected type `Int' against inferred type `Maybe t'
    In the second argument of `($)', namely `Just 5'
    In the expression: x $ Just 5
    In the definition of `it': it = x $ Just 5

これを読んで幸運、私はその権利を願っています。

1
Evan Carroll

ColdFusionでは、テキスト値はさまざまな目的のために自動的にさまざまなデータ型に変換されます。 "00A"と "000"が同じように返されているという奇妙な問題が発生しました。 ColdFusionは "00A"を時間として解釈し、ある種の数値時間形式に変換し、それを0に変換していたことが判明しました。それが、文字列の比較機能について学んだときです。

1
Dan Roberts

それほど遠くない昔、私が最初に私のCSクラスでC言語を発見したとき、ポインタがどのように振る舞うのか見るのは非常に奇妙でした。私たちはただプログラムを書いて、それが正しい振る舞いになるまで何をするのかを推測します。

1
iChaib

Smalltalk:

Testクラスにクラスメソッドを用意します。これは定数文字列を返します。

method1
    ^ 'niko'

このメソッドは、何が起こっても常に文字列 'niko'を返すことを期待してください。しかし、そうではありません。

s := Test method1 

(sを 'niko'に設定してください。)

s at: 4 put: $i.

(sを 'niki'に設定してください。)

s := Test method1

(sをもう一度 'niki'に設定してください。)

そのため、メソッドのソースコードが更新されていなくても、2行目のコードでmethod1が 'niko'ではなく 'niki'を返すように恒久的に変更されました。

1
nes1983

Pythonの三項演算子

Pythonでは、C言語の三項演算子(C++の例:bool isNegative = i < 0 ? true : false;)が構文糖として使用できます。

>>> i = 1
>>> "It is positive" if i >= 0 else "It is negative!"
'It is positive'
>>> i = -1
>>> "It is positive" if i >= 0 else "It is negative!"
'It is negative!'

それは本当に奇妙ではなく特徴です。奇妙なことは、Cの(IMOより論理的な)順序(CONDITION?A:B)と比較して順序が変更されたこと(条件がA以外の場合はB)です。

1
AndiDog

暗黙の変数\定数とRubyの可変定数

1
Lucas

else 以外を試してください。

try:     pass
except:  pass
else:    pass
finally: pass

例外がキャッチされなかった場合は、else部分が実行されます。

理にかなっているが、最初は私は本当にそれが何をするのかについての手がかりを全く持っていなかった。

def show_square(string):
  try:
    n = int(string, 10)
  except ValueError:
    print "I can't do that, Dave."
  else:
    print n * n
1
Mene

Tclがインタプリタのタイムフックの感覚を仮想化するのはかなり変です: http://www.tcl.tk/cgi-bin/tct/tip/233.html

基本的には、インタプリタに他の時間データのソースを使用させることができます。最初にシミュレータでハードウェアテストを実行し、後でタイマー機能を置き換えて、実際のものに対して同じテストを実行します。

1
schlenk

Awkでは、配列はインデックス1から始まります。

1
helpermethod

C#では、なぜこれは合法ではないのですか?

public class MyClass<T>
    where T: Enum
{

}

EnumにFunc <T>と一緒に拡張メソッドを追加してTが拡張する列挙型になるようにすると、その列挙型で型推論ができるようになるのはかなりクールです。

コメントについて:はい、実際の列挙型を拡張することはできますが、違いは次のとおりです。

あなたはこれを行うことができます:

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
BFree

JavaScriptでは、2.0 - 1.1 = 0.8999999999999999です。これは仕様でのfloatの実装の結果であるため、常にこのようになります。

1
Zeki

/ ccを呼び出します。/ccを呼び出すと、プログラムの残りの部分を表す関数が本体に渡されます。

1
Watson Ladd

MySQLでは、文字列比較は大文字と小文字を区別しません。

> SELECT * FROM blah WHERE foo = 'BAR';
> SELECT * FROM blah WHERE foo = 'Bar';
> SELECT * FROM blah WHERE foo = 'bAr';

すべて同等です。それらが 'bar'のように見えるfooの任意の値に一致するということだけではありません(例えばfoo = 'bar'の場合、それはBAR、baR、bARなどに一致します)。

1
user244377

C#では、次のコードで「メソッドグループからデリゲートに変換できません」というコンパイラエラーが発生します。その背後にある論理は合理的ですが、それでも私には奇妙な感じがします。

control.BeginInvoke(delegate { DoSomething(); });
1
Dudu

SQL Serverでは、プロダクションコードでselect *を使用すると、厄介な驚きが生じる可能性があります。とにかくselect *を使うことは良い習慣とは考えられていませんが、面白い振る舞いを知っておくのは良いことです。

SqlServer2005での質問 「テーブルからのselect *」と「テーブルからのcolA、colBなどの選択」の興味深い動作を参照してください

1
kristof

ColdFusionの場合

構造体 (別名Java HashMap)は参照渡しです。

あなたは他のデータ型がJavaのように振る舞うと思っていたでしょう...

配列 is 値渡し 、wtf!

List は単なる の単純なカンマ区切りの文字列です。

1
Henry

Javaソースファイルは文字\u001a(control-Z)で終わることができます。

1
An̲̳̳drew

私の頭に浮かんだ最初のことは 'noop'でした、私が最初に頭に浮かんだときにも私の脳は同じことをしました!

1
MikeAinOz

これは私を驚かせました

#define _ -F<00||--F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_
           _-_-_-_
}
1
binaryguy

Goの 擬似定数Iota:

type ByteSize float64
const (
_ = iota;   // ignore first value by assigning to blank identifier
KB ByteSize = 1<<(10*iota); MB; GB; TB; PB; YB;
)   
1
mdm

シフト;

場合によっては、Perlメソッドの最初の行にセルフポインターを読み取るために表示されることがあります。

1
Nylon Smile

Javaのbreakおよびcontinueステートメントにラベルを付けた。

それらはあなたが一回のブレークで複数のコントロールブロックから抜け出すことを可能にします。

1
Roel van Dijk

それがまだ真実かどうかはわかりませんが、VS FORTRAN(66または77)が再帰をサポートしないことを偶然にも発見しました。再帰は偶然のものであり、私たちのデフォルトのF77はそれを美しくサポートしていましたが、その情報をIBM-Whatta Messに渡したとき.

1
Dave

Perl

my %h1 = map { $_ => 1 } qw/foo bar baz/;    // construct an 'is_member' type lookup table
my %h2 = map { "$_" => 1 } qw/foo bar baz/;

2行目は、経験豊富なPerlプログラマーにとっても同一のように見えますが、構文エラーです。 Perlにとってのマイナス面は、あなたが言ったことではなく、常にあなたが意味することをやろうとすることです。

1
Rob Van Dam

C#のyieldステートメント、変ではなくかなり有用.

http://msdn.Microsoft.com/ja-jp/library/9k7k7cf0(VS.80).aspx

1
senthil

これがpythonに関するものです。

>>> print 07
7
>>> print 08
  File "<stdin>", line 1
    print 08
           ^
SyntaxError: invalid token

それは美人ではないですか?

あなたが人間がどのように日付を書くかを考えるとき、特に気にかけない、それは以下の効果を持ちます:

datetime.date(2010,02,07) # ok
datetime.date(2010,02,08) # error!

(その理由は0xは8進数として解釈されるので、print 0108を表示するためです!)

1
Olivier Verdier

私は絶対に意味をなさないがとにかく働いたマクロを見つけようとしているときに私はこれに出会いました。これはObjective-Cにも当てはまりますが、Cの他のフレーバー(または少なくともgccコンパイラ)にも当てはまるかもしれません。

NSString *oneString = @"This " @"is " @"just " @"one " @"normal " @" string";

等しい

NSString *oneString = @"This is just one normal string";

Cスタイルの文字列についても同様です。

char* str = "this " "also " "works";
1
Ron Srebro

Pythonでは、少なくとも私にとっては、これは非常にwftでした。私が初めてそれを見たのは、

>>> "ja " * 5
'ja ja ja ja ja '

あなたは文字列を掛けることができます! WTF?

シモンズ:これはx * nn times xを意味するからだと思います。5 times "ja ""ja ""ja ""ja ""ja ""ja "であり、あなたはこのように文字列を連結できるからです。

>>> "ja ""ja ""ja ""ja ""ja "
'ja ja ja ja ja '

2つのコードが同じ結果になる(そしておそらく同じである)

Javaでは、構築方法によっては、Stringが==演算子をどのように処理するかについて、いくつかの矛盾があります。

String a = "Hello";
String b = "Hello";
System.out.println(a == b ); // prints true.
String c = new String("Hello");
String d = new String("Hello"); 
System.out.println(c == d ); // prints false
1
Jacob Bellamy

Schemeには - 予約済みの識別子があります。したがって、次の式は1に評価されます。

((lambda (lambda) lambda) (let ((let 1)) let))

与えられたスコープ内の定義には制限があることに注意してください。定義がそのスコープ内で識別子を定義するために使用される識別子を再定義することはできません。

(begin (define define 1) define)
1
Dietrich Epp

Unityでは、

GameObject.Find("MyObject")

通常あなたのオブジェクトを返します。しかし、あなたがこのような何かをするならば:

GameObject.Find("MyObject").active = false;
//do other stuff
if (GameObject.Find("MyObject").active)
{
    //do stuff
}

その後、null参照を取得します。 Unity iPhoneでは、このコードはエディタではうまく機能しますが、iPhoneから実行するとSIGBUSが発生します。問題は、GameObject.Find()はアクティブなオブジェクトだけを検索するため、アクティブかどうかを確認しているだけでも、事実上if(null.active)を呼び出していることです。

正しく機能させるためには、非アクティブにする前に保存する必要があります。

GameObject obj = GameObject.Find("MyObject");
obj.active = false;
//do other stuff
if (obj.active)
{
    //do stuff
}

とにかくそれはおそらくより良いやり方ですが、Unityが一般に非アクティブオブジェクトを扱う方法はかなり奇妙です。非アクティブなオブジェクト(テクスチャなど)の大部分はアンロードされているように見えますが、すべてではないため、非アクティブなオブジェクトは依然として多くのメモリを消費する可能性があります。

1
Eli

そしてまたHaskell:

Haskellでは、単純なStringのように任意のサイズのファイルを扱うことができます。文字列が実際に使用されている場合、ファイルは読み取られるだけです。 Haskellの信じられないほどの怠惰さのため、このようなプログラムはファイルのサイズにかかわらず、一定のスペースで実行されます。

main = interact (>>= \x -> if x == '\n' then "\r\n" else [x])

(このプログラムは標準入力から標準出力にファイルを変換し、LFをCRLFに置き換えます。interact関数の入力全体は標準入力に変換され、出力は標準出力に移動されます。)

ファイルハンドルを閉じると、lazy Haskellがすでにそこからすべてのデータを解析しているかどうかを完全に判断することはできないため、この遅延は問題を引き起こす可能性もあります。

1
fuz

これは奇妙なことでも驚くべきことでもありませんが、なのでいつも _ wtf _ と言っています。

構文または識別子名での大文字と小文字の区別。

それを持っているほとんどの言語はちょうどCが持っているのでそれを持っているようです。それには正当な理由はありません。

1
kes

このCプログラムは、x86とx86-64で異なる結果を出力します。

#include <stdio.h>
int main (void)
{
  long a = -1; 
  unsigned b = 1; 
  printf ("%d\n", a > b); 
  return 0;
}
0
John Regehr

javaで

String("aaa")==String("aaa") //false
//you need to use
String("aaa").equals(String("aaa")) // true
0
user422991

С#:

var a = Double.Parse("10.0", CultureInfo.InvariantCulture); // returns 10
var b = Double.Parse("10,0", CultureInfo.InvariantCulture); // returns 100

不変カルチャでは、カンマは小数点記号ではなく、グループ区切り記号です。

私が知っているように、それはいくつかのロケールからの初心者プログラマにとってはよくある間違いです。

0
Alex

C++では、「仮想」MI(多重継承)によって「ひし形」クラス階層が「機能する」ことが可能になるのは奇妙で不愉快です。

A : Base class, e.g. "Object"
B, C: both derive (virtually or not) from Object and 
D: derives from both B and C

問題: "通常の"継承により、Dは2種類のあいまいなAになります。 "仮想" MIは、BのAとCのAを単一の共有ベースAオブジェクトに折りたたみます。

したがって、あなたのホイールがオブジェクトで、あなたの左前のホイールがホイールで、あなたの車が4種類のホイールを継承していても、あなたの車はまだ仮想MIを持つ1種類のオブジェクトにすぎません。それ以外の場合、あなたの車はオブジェクトではなく、4輪のオブジェクトです。

これは、貧弱なクラス設計に報酬を与え、コンパイラの作者を罰し、実行時にObjectが実際には一体どこにあるのか、そして仮想MIの手荷物が置き忘れられた場合に疑問に思う1つの言語機能です。

あなたが本当にあなたのクラス階層で菱形パターンを必要とするならば、それは通常のMIと単一のAベースに委任する「AProxy」で達成することができます。

 A : Base class, e.g. "Object"
AProxy: Base class, constructs with other A to bind to
B : derives from A
C : derives from AProxy
D : derives from both B and C (passing B's A to C's AProxy at construction)

これにはもう少し手間がかかります ダイアモンドMIが本当に好きな人のために そして安心して私たちの残りの部分をより扱いやすい言語機能のセットにしておきます。

0
reechard

COBOLを使用したことがない人にとっては、これは一般的なコード行ですが、考えていることはできません。

PIC XXX

0
The_Black_Smurf

これは私が変だと思ったものです:

C/C++では、少なくともMS C++では必要なだけセミコロンを持つことができます。

int main(void)
{
 cout<<"Hello World";;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;
 return 0;;;;;;;;;;;;;;;;;;;;;;;
}
0
Daniel

_ php _ (やはり?)

最初:(unset)型キャスト。

$a = 1;
$b = (unset)$a;
var_dump($a); // 1
var_dump($b); // NULL

使用方法: http://www.php.net/manual/en/language.types.type-juggling.php#89637

2番目:= NULLunset()関数の違い.

$c = 10;
$d = &$c;
$c = NULL;
var_dump($c); // NULL
var_dump($d); // NULL


$e = 10;
$f = &$e;
unset($e);
var_dump($e); // NULL
var_dump($f); // 10 - WTF?
0
Vili

Cでは、

 int x = 1;
 int y = x++ + ++x;
 printf("%d", y);

あいまいで、表示される内容はコンパイラによって異なります。コンパイラーは、++ xが評価される前、またはステートメントの終わりにx ++の新しい値を保管することができます。

0
TDJoe

PHPの場合:

<?php
$o = new stdClass;
echo count($o);
?>

..印刷1。なぜ考え出したことはありません。

0
Robin

Delphiは "Word"のような型キャストを気にせず、配列arr [0..65535]の外側を読みます。ここで、pos = 65535:arr[Word(pos + 10)]

0
Vladimir