1 JavaScriptが悪い理由
•1.1貧弱なデザイン
•1.2タイプシステム
•1.3悪い機能
•1.4欠落している機能
•1.5 DOM
2 Luaが吸う理由
3 PHPが吸い込まれる理由
•3.1現在サポートされているバージョンで修正
4 Perl 5が吸い込まれる理由
5 Pythonが吸い込まれる理由
•Python 3で修正された5.1
6 Rubyが吸う理由
7 Flex / ActionScriptが吸い込まれる理由
8スクリプト言語が悪い理由
9 Cが吸う理由
10 C ++が吸う理由
11 .NETが吸い込む理由
12なぜC#が吸うのか
13 VB.NETが吸い込まれる理由
15 Objective-Cが吸う理由
16 Javaが吸い込まれる理由
•16.1構文
•16.2 Java 7(2011)で修正
•16.3モデル
•16.4ライブラリ
•16.5ディスカッション
17 Backbaseが吸う理由
18 XMLが吸い込まれる理由
19なぜXSLT / XPathが嫌いなのか
20 CSSが吸い込まれる理由
•CSS3で修正された20.1
21 Scalaが吸う理由
22なぜHaskellが吸うのか
23閉鎖が吸い込まれる理由
24なぜ吸うのか
•24.1基本プログラミングツール(基本言語)
•24.2相互運用性
•24.3標準ライブラリ
•24.4ツールキット
•24.5コミュニティ
25錆が吸う理由
•25.1セキュリティ
•25.2構文
•25.3 APIの設計と型システム
•25.4コミュニティ
•25.5ツールキット
JavaScriptが悪い理由
一部の規定はJavaScript自体には適用されず、Webアプリケーションプログラミングインターフェイス( https://developer.mozilla.org/en/docs/Web/API )に適用されることに注意してください。
貧弱なデザイン
• , .
• Camel- :
XMLHttpRequest
HTMLHRElement
• "+" . , :
var i = 1; // i = i + ""; // ! // - i + 1; // "11" i - 1; // 0
• + , += 1 ++. :
var j = "1"; j++; // j 2 var k = "1"; k += 1; // k "11" [1,5,20,10].sort() // [1, 10, 20, 5]
• var , , . let.
• JavaScript . .
• - . . ( ES6).
• JavaScript: , , , , « » « ». - , . ( ES6 ).
• JavaScript . , __proto__, . ( Object.create(null) ES5 Map ES6).
• . , ( Array.from ES6):
var args = Array.prototype.slice.call(arguments);
( ).
• .
0.1 + 0.2 === 0.30000000000000004;
, , . . http://www.math.umd.edu/~jkolesar/mait613/floating_point_math.pdf.
• NaN , .
typeof NaN === "number" // , NaN NaN != NaN NaN !== NaN // , "" "NaN". x !== x // - isNaN(x)
, IEEE754. IEEE754 .
• (null) , typeof null === 'object'.
( , http://www.jslint.com/)
• JavaScript C, .. - ++ --. . « » .
• JavaScript Perl.
• «this» («») , :
// "This" object.property = function foo() { return this; // "This" , () } // "This" var functionVariable = function foo() { return this; // "This" } // "This" function ExampleObject() { this.someNewProperty = bar; // "This" this.confusing = true; } // "This" function doSomething(somethingHandler, args) { somethingHandler.apply(this, args); // "this" , "" this.foo = bar; // "This" "" var that = this; // , "this" someVar.onEvent = function () { that.confusing = true; // "this" someVar } }
•
// "This" return { a: 5 };
• , . , . .
// "This" return { 'a': 5 };
• :
function bar() { // -, var, foo = 5; }
( «use strict» (« ») ES5.)
• == , , , . === , , .
0 == "" 0 == "0" 0 == " \t\r\n " "0" == false null == undefined "" != "0" false != "false" false != undefined false != null
• :
new Function("x", "y", "return x + y"); new Array(1, 2, 3, 4, 5); new Object({"a": 5}); new Boolean(true);
• parseInt , , , 10:
parseInt("72", 10);
Number('72') .
• «with» ( ) , .
with (obj) { foo = 1; bar = 2; }
• «for in» , , object.hasOwnProperty(name) Object.keys(...).forEach(...).
for (var name in object) { if (object.hasOwnProperty(name)) { /* ... */ } } // Object.keys(object).forEach(function() { ... });
• , , ; «for in» , , ( , .. parseInt ).
var n = 0; for (var i in [3, 'hello world', false, 1.5]) { i = parseInt(i); // alert(i + n); } // [3, 'hello world', false, 1.5].map(Number).forEach(function() { alert(i + n) });
• () (. https://developer.mozilla.org/en/JavaScript/Reference/Deprecated_Features), getYear setYear Date.
• ES6, . JavaScript — , Object.freeze(...).
// const pi = 3.14159265358; const msg = "Hello World"; // const bar = {"a": 5, "b": 6}; const foo = [1, 2, 3, 4, 5]; // const func = function() { const x = arguments[0], y = arguments[1]; return x + y; };
• , , , . (ES6 ).
ES6 x -> x * x
• , Math.pow , **, . ( ES6 **)
Math.pow(7, 2); // 49
• . , - , , .
DOM ( )
• Firefox, Internet Explorer, Opera, Google Chrome, Safari, Konqueror .. DOM .
• , alert(), , , .
// function doNothingWithEvent(event) { return true; } // function doNothingWithEvent(event) { alert('screwing everything up'); return true; }
Lua
• , .
do local realVar = "foo" real_var = "bar" -- Oops end print(realVar, real_var) -- nil, "bar"
• . Lua , , .
• vararg ( ) , .
local function fn() return "bar", "baz" end print("foo", fn()) -- foo bar baz print("foo", fn(), "qux") -- foo bar qux
• vararg ( ) (
...
).
• varargs ( ) .
• varargs ( ).
• varargs ( ) .
• varargs , , , varargs, , , , \0 C-.
• . , 0, .
•
break
,
do while
(
while (something) do
,
repeat something until something
)
goto
,
continue
. .
• , :
>2+2 stdin:1: unexpected symbol near '2' >return 2+2 4
• Lua , PCRE.
• . , , , __index-.
• . «» Lua .
• . , — , , . .
>("string"):upper() STRING () >({1,2,3}):concat() stdin:1: attempt to call method 'concat' (a nil value) >(3.14):floor() stdin:1: attempt to index a number value
PHP
•
'0'
,
0
0.0
,
'0.0'
— .
• .
• - , . , , : :
• doc-"<<<END"
PHP < 5.3.
• . , php4.x, php5, php5.1…
• . ( ) , — (, , ):
$x = Array(); $y = array(); $x == $y; # is true $x = 1; $X = 1; $x == $X; # is true
• , , «nonexistent_constant_name». .
• , , , ; .
• , (.func_get_args()
).
• , ; , .
•
Array()
- .
• «-» — . - — . :
$arr[2] = 2; $arr[1] = 1; $arr[0] = 0; foreach ($arr as $elem) { echo "$elem "; } // "2 1 0"!!
• .
•
"use strict"
.
• POSIX STRFTIME(3) .
• :
error_log("Frobulating $net->ipv4->ip"); Frobulating Object id #5->ip $foo = $net->ipv4; error_log("Frobulating $foo->ip"); Frobulating 192.168.1.1
:
error_log("Frobulating {$net->ipv4->ip}");
• : // #.
•
<?php
?>
, HTML , .
• :
float
double
.
• , , , , , PHP 5.4 ( PHP 7).
•
(float)
.
• . , , .. ,
array_diff
,
array_reverse
.. ; , + (- ). ? :
$a.diff($b)
,
$a.reverse()
.
• PHP C Perl, , , -. , .
• : —
array_reverse
shuffle
— .
• «needle, haystack», — «haystack, needle».
• , .
• :
$$a[1]
${$a[1]}
${$a}[1]
,
$a[1]
$aa
.
• , , . , , , .
• : () , , , ( PHP 7).
•
$
, , — , — , .
•
!
,
=
, —
if (!$a = foo())
— «» !
• 32- 64- (
<< >> <<= >>=
) 32 .
• ( ) , .
• «».
•
and
or
,
&&
||
, .
• ,
:
endif;
,
endwhile;
,
endfor;
endforeach
.
•
(int)
(integer)
, —
(bool)
(boolean)
, —
(float)
,
(double)
(real)
.
• , .
• PHP5 — , , , ( ).
• , , , , .
• .
• - , ,
include
FALSE
.
• - ,require()
.
• , , : .
• , , , :
function makeyogurt($type = "acidophilus", $flavour) { return "Making a bowl of $type $flavour.\n"; } echo makeyogurt("raspberry"); // " ". .
• (PHP 4) (
$this
) (
self
).
• , ,
unserialize()
,
__PHP_Incomplete_Class
, .
• foreach, , .
• , self:: __CLASS__, , ( PHP >= 5.3 static::):
class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); // A, B!
• (, ) .
class a { function nextFoo() { class b {} // } }
• (, ) «»:
$var1 = "Example variable"; $var2 = ""; function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 =& $var1; // } else { $GLOBALS["var2"] =& $var1; // } } global_references(false); echo "var2 is set to '$var2'\n"; // var2 '' global_references(true); echo "var2 is set to '$var2'\n"; // var2 '' "
• /: , « ».
• PHP , .
• 64- 32- , (intval('9999999999') 9999999999 64- , — 2147483647 32-).
• , , :
SplFileObject
.
•
SplFileObject
SplFileInfo
. ? !?
• PHP , , . , short_open_tags, , , , !
• :
in_array("foobar", array(0)) === true
• , «foobar» , 0. , in_array strict, , , === == , - .
• php.ini , ( ). , .
•
null
,
""
, 0 0.0 — .
• ,
0
, ,
08
,
09
,
012345678
. , 8 9 :
08 == 0
,
08 != 8
,
0777 == 07778123456
( PHP 7).
• , , ; , (
intdiv()
PHP 7).
PHP 5.5 . ( 04/19/2016):
• ( PHP 5).
•
[]
{}
NULL
( PHP 5).
• , ( PHP 5).
• « », () ( PHP 5).
• ( PHP 5):
class Foo { function Foo($name) { // $globalref global $globalref; $globalref[] = &$this; $this->setName($name); } function echoName() { echo "\n", $this->name; } function setName($name) { $this->name = $name; } } $bar1 = new Foo('set in constructor'); $bar1->setName('set from outside'); $bar1->echoName(); // " " $globalref[0]->echoName(); // " " // , : $bar2 =& new Foo('set in constructor'); $bar2->setName('set from outside'); $bar2->echoName(); // " " $globalref[1]->echoName(); // " "
• , , « » , ( PHP 5):
class A { function A() { echo "Constructor of A\n"; } function B() { echo "Regular function for class A, but constructor for B"; } } class B extends A { } $b = new B; // B()
• __autoload , ( PHP 5.3).
• ; create_function , , ( PHP 5.3).
• , ( PHP 5.4).
$first_element = function_returns_array()[0]; // !! $first_element = ( function_returns_array() )[0]; // , !! // : $a = function_returns_array(); $first_element = $a[0];
Perl 5
• Perl , Python, , . , 14 . 1998.
• «use strict» (« ») — , «use unstrict» (« ») «use slop» (« ») ( /), . . . «» .
use strict; use warnings;
• .
my @list = ("a", "b", "c"); print $list[0];
• ( Perl6::Subs).
sub foo { my ($a, $b) = @_; }
• , .. , - , Perl , .
• . , , .. , , ..
• , , , .
• -. : «, !», — . . , . Perl- , , , ( , , , — : — «»).
• .
• , here-doc.
my $doc = <<"HERE"; But why would you? HERE print $doc;
• , , , , . , , : « @{[sub{'like'}]}. ».
• , Ruby, «unless» (« »). «if not», , , :
1. if (! )
2. if ( )
3. unless ()
•
if($a==$b) $c=$d ;
; :
1. $c=$d if($a==$b);
2. if($a==$b) { $c=$d; }
• $,@,%,& ? , … , , , . Perl , , , , @ $ .
• , 6 .
Python
• — « »: , / / .. . -C, , , -, , , .
if(something) if(something_else) do_this(); else do_that();
, «else», , if(), ; Python, , , .
• self , , .
• , a.b() «b» «a»; , , a.b() «a» «» ; :
class NoExplicit: def __init__(self): self.selfless = lambda: "nocomplain" def withself(): return "croak" #will throw if calld on an _instance_ of NoExplicit a = NoExplicit () print(a.selfless()) #won't complain print(a.withself()) #will croak
, a.b() , ; , « , », Python .
• , , , ; dicts JavaScript, .
• ,
,
«». - . , :
foo = 1.0 + 2 # Foo is now 3.0 foo = 1,0 + 2 # Foo is now a tuple: (1,2) foo = 3 # Foo is now 3 foo = 3, # Foo is now a tuple: (3,)
• , , . , , . , , , , . , : — !
(1) == 1 # (1) is just 1 [1] != 1 # [1] is a list 1, == (1,) # 1, is a tuple (1) + (2) != (1,2) # (1) + (2) is 1 + 2 = 3 [1] + [2] == [1,2] # [1] + [2] is a two-element list isinstance((), tuple) == True # () is the empty tuple
• , . : .
• .
• - — ; , -, .
• — if/elif/elif ( ).
• "
do ... until <condition>
", "
while not <condition>
:"
• Python (x if cond else y) - : (cond? x: y).
• , .
• .
• , .
• , , 5 () [1].
• / — (, list.index()), — (, len(list)).
• , Python
"""
• Python2.x Python3.x Linux .
• :
__main__
• , -, , - :
if __name__ == "__main__":
• — :
f.write(u'blah blah blah\n')
• Python 3 , . , , . Python 3.5 , , , Python , , , .
• «yield» . Python «yield» , , , -, .
• Python 3.5 «async» «await» . Python , «yield» «yield from», . , , , , , [2]. , , «yield», , , , «async», .. «def», «with» «for».
• super() , -, [3].
• , :
os.path.expanduser
os.path.supports_unicode_filenames
( , ).
Python 3
•
!=
<>
(. php).
• :
(-1)**(0.5)
,
pow(-1, 0.5)
0+1j
.
• , .
Ruby
•
String#downcase
? «downcase»? — «lower case,» «lowercase» «lower».
String#upcase
«uppercase» «upper». , , Ruby — . , tw… PHP.
• Unicode , 1.0, 1.9/2.0 2007 .
• / 1.8.
• .
• ( Ruby 2.0, !) ( = ).
•
@
@@
.
• , , ; : . « » « ». : 1.8.7, 1.9.1 Windows. ?
• ( ) «» : . « Proc».
• : , , , « ».
• «».
nil.to_i
«nil» 0, 0 «nil».
nil.to_i.nil? #=> false
.
•
String#to_i
, :
"x".to_i == 0
.
• Ruby , , , . , , , . Ruby 2.0.
• , , , . ,
Array#size/Array#length
,
Array#[]/Array#slice
.
• , , . , (?) .
• / , .
• ( ) .
• , ,
begin ... rescue ... end if expr
.
if expr
, .
•
unless
(
if not
) , , .
• . , , .
• « » . - , , .
nil
, «void» («») (). , , , .
• pre-1.9: stdout, stderr ( ) - .
•
``
. .
• :
$1
,
$2
,…
• (
Array
,
Hash
) , . — .
class ThingLikeArray < Array; end
.
• , , ,
"foo" != :foo
, , , ,
HashWithIndifferentAccess
.
• . « , kEND, $end» « , '' , ».
• , , .
Flex/ActionScript
• String , , - String, , , startsWith hashCode, pass thrus String.
• , . ( , JavaScript).
• , .
• , .
• , , , - , - , . .
• .
• . . .
• .
• : isalnum, fprintf, fscanf ..
• .
• ? .
• … «» GNU .
• , .
• , - , .
qsort()
- . , - .
• (, , ) , ; , (nspr, apr, glib...).
• . (API) Berkeley, . , API Microsoft . O (1) API ; (select()
poll()
O(n)).
• , , « ».
• 99 ? ; MSVC, 2015 ( ), .
• 11 ? , , GCC , . , MSVC.
• , , , , : , . , , .
• malloc() ( ), calloc() — ( ).
• «Undefined behaviour» (« ») — . «» « , , , ». , « » - .
•int a = 0; f(a, ++a, ++a);
,f(0, 1, 2)
. .
• , «»:i[++a] = j[a];
, , .
• . .
• N intN_t .
•int *
float *
.memcpy()
.
• NULL . — !
• ; ( C, ).
•void (*)()
int (*)(int, const char *)
, , ? ! . , , ( ).
• - , ,FILE *
double *
, . .
• - .
• , , ; , , , , (C11, . ) . , , .
• , , ; , - , . , , — « ».
• , () .
++
.
• .
• , - C- C++.
• .
• C++ . , - , . [ .]
• : 1 000 .
• .
• . - .
• C++ ABI .
• 's' — ?
std::string s();
• : ; , ; , .
• 's' :
std::string s = s(); /* or */ std::string s{};
• try, finally.
• «», RAII, , C++. , RAII.
• Unicode.
• , , , .
• , C,strcat
.
•
catch (...)
.
•
throw
.
• :
NULL
C++. [ .]
•
mutable
, ,
const
, , , .
• - ( - ).
•[=]
, .
• C++ , , .
•
std::string::c_str()
std::string char*
. operator
const char* () const
.
• , , , , , inline () ; : , , . ? ?
• ,__forceinline
.
• , (), , , , .
• - ; , .
• , , , . , , — , - .
• ,
expor
, , . C ( C++) .
.NET
• SortedList « — ». .NET- , .
• - () , . , «foreach» , . , , , , , . () «for» «foreach».
• MSDN- () GetFrobnicationInterval , , (, ). , InvalidOperationException, . « », , , .
#
• ECMA ISO C# , C# 2.0; Microsoft.
• i++.ToString , ++i.ToString — . ( .)
• , , Visual Basic .NET.
• ( ).
• Pascal (SomeClass, SomeConstantVariable, SomeProperty).
• «extends» «implements» (IInterface).
• ( LINQ, ).
•«out»- ( ).
• , , , , . ( , . http://stackoverflow.com/questions/82437/why-is-it-impossible-to-override-a-getter-only-property-and-add-a-setter.)
• - ( ) (,
T plus<T>(T t1, T t2) { return t1+t2; }
.
• «foreach» (, foreach(int i in vec) { i = i+1; }.
• IDisposable . ( , , .)
VB.NET
• Strict Off: , , , ,
lang="text">Dim a As Integer = TextBox1.Text ' ( Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger)
.
• Explicit Off: Object , . Strict Off.
•
On Error Goto
On Error Resume Next
: — . , Try-Catch-Block ( -).
• , UBound(), MkDir(), Mid(),… Microsoft.VisualBasic .
• My-Namespace ( ) ( My.Resources My.Settings, ). , , My.Computer.FileSystem.WriteAllText vs System.IO.File.WriteAllText.
• , , .. , .
• .
• , ( Strict Off) . . StackOverflow.
• The Microsoft.VisualBasic.HideModuleNameAttribute. - .
• .
Form2.InstanceMethod()
Dim Form2Instance As New Form2 Form2Instance.InstanceMethod()
:
MyProject.Forms.Form2.InstanceMethod()
• + & &. + , Strict Off.
VBA
• , — .
• , .
• .
• .
• GoTo.
• `OnError Resume Next` — Yeah… , . ? ! .
• .
.
Dim myRange As Variant myRange = Range("A1") Set myRange = Range("A1")
`myRange` «A1», Range.
Objective-C
• - OS X iOS, C; , .
• Objective-C — ; GNUStep Fringe Linux, Windows, … , , .
• .
• « ».
• Smalltalk C .
• .
• ( @ , ?! , ?!? [methodName args];)
• http://fuckingblocksyntax.com
• , , . ( , , LLVM Apple), , , « ».
• SEL [4].
• . , , , .
• Objective-C++ , .
• Objective-C C++ .
• C++ , , Objective-C.
• C++ Objective-C C++; .
• C++ Objective-C .
• Objective-C , C++, … new.
• ( , ) , .
• Objective-C . Apple NS*.
• Apple Swift ( ) , Objective-C .
Java
• .
• Java ,
goto
const
.
• … . , BigInteger,
a.add(b.multiply(c))
, .
• ; , , .
• :
new T[42]
, , :
class GenSet<E> { Object[] a; E get(int i){return a[i];}}
• . 7-10 , .
• . .
• var ( C#). , . :
// Java ClassWithReallyLongNameAndTypeParameter<NamingContextExtPackage> foo = new ClassWithReallyLongNameAndTypeParameter<>(); // C# | : var foo = new ClassWithReallyLongNameAndTypeParameter<NamingContextExtPackage>(); // Java | : SomeTypeIHaveToLookUpFirstButIActuallyDontReallyCareAboutIt result = getTransactionResult();
• , Java IDE , , .
• . .
Pair
«» .
Java 7 (2011)
•
•
• .
• , .
•
int
Integer
,
float
Float
. - .
• , Number.
• Java 8 .
• , , :
•java.net
URLConnection
HttpURLConnection
:UrlConnection
HTTPURLConnection
HttpUrlConnection
?
•java.util
ZipOutputBuffer
GZIPOutputBuffer
:ZIPOutputBuffer
GnuZipOutputBuffer
GzipOutputBuffer
GZipOutputBuffer
?
• , , ; , 3 , , , ..RPGGame
,RpgGame
,TLSConnection
,Starttls
.
•
Cloneable
clone
.
• ,
.toString()
( , -)
.equals()
( , ).
• Java 8 , , , , .., Collection (), « »,
Collections
()
Arrays
().
•
Stack
— ,
Queue
— ?
•Stack
API, .Deque
()ArrayDeque
().
• . , , java.util.Date java.sql.Date ..
• (Date API) , . .
• Java 8 .
• Reflection API .
•
(a|[^d])
StackOverflowException .
• .
.
• , , , , , (?).
• ,
Serializable
RandomAccess
, : , , - .
• ( , ) .
• :
Object[] foo = new String[1]; foo[0] = new Integer(42);
, .
• Unicode , , , , : (1) \u000A ( ), ; (2) \u0022 ( ), , ; (3) - \u (, , «c:\unix\home»), , .
• (, max(float,float), max(double,double), max(long,long)).
Backbase
• , .
XML
• , , .
• , .
• , Git. , . ( , ), , , .
• .
• , , , .
• .
XSLT/XPath
• 1. * * , . XML DOM.
• XPath , , , , , -. , .
• - XPath, .
•test=""
<xsl:if>
<xsl:when>
.
•<xsl:sort>
.
• - ,
key()
, XML, . — !
select="key(...)"
. , , «key() » , , « ».
•
select=""
,
value=""
match=""
, , . ; , - , - . .
• - (,
str:replace ()
), (, ), , - . . - ? - , - , , , .
• , , . , list/array/tuple/dict/hash/set/iterable/collection.
• '-' , , 'minus' — . '-' , , , , '-' ,
[a-zA-Z_][a-zA-Z0-9_]*
. , , , .
$foo-100
, $foo — 100.
•$foo-bar
.
•$foo - 100
.
•$foo+100
$foo + 100
.
•$foo-100
.
• , , . . , , , . , , , , .
<xsl:sort select="count(*)"/> <!-- sorts like this: 10, 11, 1, 23, 20, 2, 37, 33, 31, 3, 4, 5, 6, 78, 7, 9 -->
• :
1. XML (, ..).
2. XSL (, , / , , , xsl:foo ..).
3. XSL ( ..).
4. XPath ( , ).
5. XPath.
CSS
• hsla(), hsva()?
• text-align:justify;, , « ». .
• vertical-align:middle; , . , display:table; display:table-cell;, , . !
• , , (margin: 0 auto;).
• . .
• float: ; . (, , , , .)
• clear:.
• . , , .
• . CSS3 calc CSS (CSS Values) (Units Module), - { width:50% — 2px; }.
• CSS :
• , , :
• ident {nmstart}{nmchar}*
• nmstart [a-zA-Z]|{nonascii}|{escape}
• nmchar [a-z0-9-]|{nonascii}|{escape}
• «4.1.3. » :
« CSS2 ( , ) [A-Za-z0-9] ISO 10646 161 , (-); .»
• , [a-zA-Z_][a-zA-Z0-9_]*, 1970- ?
• - -? Webkit , …
• . — Webkit — , .
• SASS, LESS Stylus. . CSS wtf ( , , ).
• , CSS3. , , , CSS4.
. «CSS » « , CSS».
CSS3
• ? ? Mac OS 1984. (CSS3 border-radius:)
• . (CSS3 )
• . (CSS3 background-size: background-clip:)
• . (CSS3 rotate)
Scala
•
scala.collection
.
• Monad Functor. Scalaz .
• , , .
• .
• .
Haskell
• ( ) . Haskell - , . , , - .
• .
• .
• Haskell, - Haskell, - Google.
• Haskell , , . .
Clojure
• Lisp , .. — .
• .
• Conj ( ).
Go
( )
• Go («nil») . void * — . «nil» («») , .
func randomNumber() *int { return nil } func main() { a := 1 b := randomNumber() fmt.Printf("%d\n", a+*b) // - () }
• , , -ASCII . «» ( ?) .
• , Go —
string
[]byte
.
string
[]byte
, Unicode ,
== > <
,
+
. , , ,
io.Writer
,
[]byte
.
• len , . , ,
utf8.RuneCountInString()
.
• Go
break
case
,
break
switch
. , ,
switch
.
• «n» :
slice = append(slice[:n], slice[n+1:]...)
• , , , .
• , , .
• Go , .
• Go .
• Go .
• Go .
• Go , , :
if v, err := otherFunc(); err != nil { return nil, err } else { return doSomethingWith(v), nil }
• , Go , . , Go . , « », , , , Go , , , .
• Go-
range
, / , , :
d := loadData() for i := range d { // "d" , "i" , // "d" , "i" // "i" // } for i, j := range d { // "d" , ! // , , , // , ) // "d" , "i" - , "j" - ( d[i]) // "i" / , "j" d[i] }
• Go , . , . , :
func foo1(i int) (r int) { if i != 0 { r := 12 fmt.Println(r) } return // 0 } func foo2(i int) (r int) { if i != 0 { r = 12 fmt.Println(r) return // 12 } return // 0 } func foo3(i int) (r int) { if i != 0 { r := 12 fmt.Println(r) return // : "r" } return }
• , , :
func dogma() (i int) { defer func() { i++ }() return 2 + 2 } func main() { fmt.Println(dogma) // 5 }
• , ** , . , Go-:
func returnsError() error { var p *MyError = nil if bad() { p = ErrBad } return p // " ". }
• ,
select
case
, , :
select { case <-chan1: doSomething() default: select { case <-chan1: doSomething() case <-chan2: doSomethingElse() } }
•
select
700 . .
• Go-, Go- , «» , .
• / , , «ddd» "%H" . Go , «1» , «5» — , «15» — , «6» — .. ( 2 2006 15:04:05 MST) : « , , , ». , , ; , .
• —
math/rand
crypto/rand
.
•
flag
, , POSIX- .
•
errors
, .. Go , .
• Go . Go- repository; github.com/user/package/package-{v1,v2,v3}.
• Go , .
• 1.5 C Go. , , .
• "-u", « ». , ,
unsafe
, , ; , , .
• , ** , Go
unsafe
.
• , , « ».
• , «WONTFIX» (« , »), , .
• , , . , , , , , .
• - Go 1. , Go 2.0, .
• 1.4, .
Rust
• borrowck .
• « » . , «» , ; , .
• borrowck, , ,
unsafe {}
; , , , ,
sliceable.unsafe_get(index)
. , , , , .
• , .
• , , , , [, ]?
• , , , , . — , - , - !
• Rust . , , . , , C++ ( C++, , , , Google).
• LLVM . , , , , « , ,» . , , .
, - , , , . , , . SEGV , CRIME, Rust . . , .
, «» Rust , - .
•
::
++. / .
• , .
#[allow(unrooted_must_root)] pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLIFrameElement> { let element = HTMLIFrameElement::new_inherited(localName, prefix, document); Node::reflect_node(Box::new(element), document, HTMLIFrameElementBinding::Wrap) }
#[allow(unrooted_must_root)] pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) { let element = HTMLIFrameElement::new_inherited(localName, prefix, document); Node::reflect_node(Box::new(element), document, HTMLIFrameElementBinding::Wrap); }
• , , , ,
impl
()
.
•
mut
, (mutable).
&Mutex
(mutable),
&mut str
— (immutable).
API
• , , , ,
Vec
Cell
.
• , Rust ( ++, , ; —
str
,
String
). :
str
,
String
,
CStr
,
CString
,
OsStr
OsString
. OsStr, OsString, CStr, CString (- Windows), CStr, CString, OsStr, OsString String str, .
• () , .
Vec<T>
,
&[T]
, ,
Vec<T>
&[T]
, , .
• () ,
&*some_var
( )
&some_var[..]
( — ,
Vec<T>
&[T]
String
&str
).
• , , , (, ,
()
, , ).
• -Sized . —
str
[T]
. ,
Sized
, ,
?Sized
. , Reddit, , str .
Box<str>
. Reddit; Reddit, , , -Sized .
• —
enum
. .
• , , . ( ) , .
• «». Rust (, , «, , , » ), . , , , Rust - Java!
• rustc .
• rustc. PIC. AVR. m68k. ARM, x86, MIPS, PowerPC NaCl. , .
• ? . — rustc .
• (, Go, ), , , .
• , . , , , .
• - , . , rustc .
• . «» , , , «ring» ( ) «serde» («serialization and deserialization» (« »), ?).
• jemalloc, «hello world» [ ].
• , , . , rustc ?
• , , ( , ++, ). , ?
• IDE. - C# VS Java Eclipse, 90-.
• IDE, , Eclipse? .
• ? , , , , « ». , , Racer, .
• ? , .