From e110db4db65b3a3dcc21b2088bf6278334279065 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 7 Aug 2014 17:53:03 +0400 Subject: 1 part of Russian translation. --- ru-ru/lua-ru.html.markdown | 422 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 422 insertions(+) create mode 100644 ru-ru/lua-ru.html.markdown diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown new file mode 100644 index 00000000..55fc7bb9 --- /dev/null +++ b/ru-ru/lua-ru.html.markdown @@ -0,0 +1,422 @@ +--- +language: lua +filename: learnlua-ru.lua +contributors: + - ["Tyler Neylon", "http://tylerneylon.com/"] +translators: + - ["Max Solomonov", "https://vk.com/solomonovmaksim"] +lang: ru-ru +--- + +```lua +-- Два дефиса начинают однострочный комментарий. + +--[[ + Добавление двух квадратных скобок + делает комментарий многострочным. +--]] +-------------------------------------------------------------------------------- +-- 1. Переменные, циклы и условия. +-------------------------------------------------------------------------------- + +num = 42 -- Все числа являются типом double. +--[[ + Не волнуйся, 64-битные double имеют 52 бита + для хранения именно целочисленных значений; + точность не является проблемой для + целочисленных значений, занимающих меньше + 52 бит. +--]] + +s = 'walternate' -- Неизменные строки как в Python. +t = "Двойные кавычки также приветствуются" +u = [[ Двойные квадратные скобки + начинают и заканчивают + многострочные значения.]] +t = nil -- Удаляет определение переменной t; Lua имеет мусорку. + +-- Циклы и условия имеют ключевые слова, такие как do/end: +while num < 50 do + num = num + 1 -- Здесь нет ++ или += операторов. +end + +-- Условие "если": +if num > 40 then + print('больше 40') +elseif s ~= 'walternate' then -- ~= обозначает "не равно". + -- Проверка равенства это == как в Python; ok для строк. + io.write('не больше 40\n') -- По умолчанию стандартный вывод. +else + -- По умолчанию переменные являются глобальными. + thisIsGlobal = 5 -- Стиль CamelСase является общим. + + -- Как сделать локальную переменную: + local line = io.read() -- Считывает введённую строку. + + -- Конкатенация строк использует .. оператор: + print('Зима пришла, ' .. line) +end + +-- Неопределённые переменные возвращают nil. +-- Этот пример не является ошибочным: +foo = anUnknownVariable -- Теперь foo = nil. + +aBoolValue = false + +-- Только значения nil и false являются ложными; 0 и '' являются истинными! +if not aBoolValue then print('это значение ложно') end + +--[[ + Для 'or' и 'and' действует принцип "какой оператор дальше, + тот и применается". Это действует аналогично a?b:c + операторам в C/js: +--]] +ans = aBoolValue and 'yes' or 'no' --> 'no' + +karlSum = 0 +for i = 1, 100 do -- The range includes both ends. + karlSum = karlSum + i +end + +-- Use "100, 1, -1" as the range to count down: +fredSum = 0 +for j = 100, 1, -1 do fredSum = fredSum + j end + +-- In general, the range is begin, end[, step]. + +-- Another loop construct: +repeat + print('the way of the future') + num = num - 1 +until num == 0 + +-------------------------------------------------------------------------------- +-- 2. Functions. +-------------------------------------------------------------------------------- + +function fib(n) + if n < 2 then return n end + return fib(n - 2) + fib(n - 1) +end + +-- Closures and anonymous functions are ok: +function adder(x) + -- The returned function is created when adder is called, and remembers the + -- value of x: + return function (y) return x + y end +end +a1 = adder(9) +a2 = adder(36) +print(a1(16)) --> 25 +print(a2(64)) --> 100 + +-- Returns, func calls, and assignments all work with lists that may be +-- mismatched in length. Unmatched receivers are nil; unmatched senders are +-- discarded. + +x, y, z = 1, 2, 3, 4 +-- Now x = 1, y = 2, z = 3, and 4 is thrown away. + +function bar(a, b, c) + print(a, b, c) + return 4, 8, 15, 16, 23, 42 +end + +x, y = bar('zaphod') --> prints "zaphod nil nil" +-- Now x = 4, y = 8, values 15..42 are discarded. + +-- Functions are first-class, may be local/global. These are the same: +function f(x) return x * x end +f = function (x) return x * x end + +-- And so are these: +local function g(x) return math.sin(x) end +local g = function(x) return math.sin(x) end +-- Equivalent to local function g(x)..., except referring to g in the function +-- body won't work as expected. +local g; g = function (x) return math.sin(x) end +-- the 'local g' decl makes g-self-references ok. + +-- Trig funcs work in radians, by the way. + +-- Calls with one string param don't need parens: +print 'hello' -- Works fine. + +-- Calls with one table param don't need parens either (more on tables below): +print {} -- Works fine too. + +-------------------------------------------------------------------------------- +-- 3. Tables. +-------------------------------------------------------------------------------- + +-- Tables = Lua's only compound data structure; they are associative arrays. +-- Similar to php arrays or js objects, they are hash-lookup dicts that can +-- also be used as lists. + +-- Using tables as dictionaries / maps: + +-- Dict literals have string keys by default: +t = {key1 = 'value1', key2 = false} + +-- String keys can use js-like dot notation: +print(t.key1) -- Prints 'value1'. +t.newKey = {} -- Adds a new key/value pair. +t.key2 = nil -- Removes key2 from the table. + +-- Literal notation for any (non-nil) value as key: +u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'} +print(u[6.28]) -- prints "tau" + +-- Key matching is basically by value for numbers and strings, but by identity +-- for tables. +a = u['@!#'] -- Now a = 'qbert'. +b = u[{}] -- We might expect 1729, but it's nil: +-- b = nil since the lookup fails. It fails because the key we used is not the +-- same object as the one used to store the original value. So strings & +-- numbers are more portable keys. + +-- A one-table-param function call needs no parens: +function h(x) print(x.key1) end +h{key1 = 'Sonmi~451'} -- Prints 'Sonmi~451'. + +for key, val in pairs(u) do -- Table iteration. + print(key, val) +end + +-- _G is a special table of all globals. +print(_G['_G'] == _G) -- Prints 'true'. + +-- Using tables as lists / arrays: + +-- List literals implicitly set up int keys: +v = {'value1', 'value2', 1.21, 'gigawatts'} +for i = 1, #v do -- #v is the size of v for lists. + print(v[i]) -- Indices start at 1 !! SO CRAZY! +end +-- A 'list' is not a real type. v is just a table with consecutive integer +-- keys, treated as a list. + +-------------------------------------------------------------------------------- +-- 3.1 Metatables and metamethods. +-------------------------------------------------------------------------------- + +-- A table can have a metatable that gives the table operator-overloadish +-- behavior. Later we'll see how metatables support js-prototypey behavior. + +f1 = {a = 1, b = 2} -- Represents the fraction a/b. +f2 = {a = 2, b = 3} + +-- This would fail: +-- s = f1 + f2 + +metafraction = {} +function metafraction.__add(f1, f2) + local sum = {} + sum.b = f1.b * f2.b + sum.a = f1.a * f2.b + f2.a * f1.b + return sum +end + +setmetatable(f1, metafraction) +setmetatable(f2, metafraction) + +s = f1 + f2 -- call __add(f1, f2) on f1's metatable + +-- f1, f2 have no key for their metatable, unlike prototypes in js, so you must +-- retrieve it as in getmetatable(f1). The metatable is a normal table with +-- keys that Lua knows about, like __add. + +-- But the next line fails since s has no metatable: +-- t = s + s +-- Class-like patterns given below would fix this. + +-- An __index on a metatable overloads dot lookups: +defaultFavs = {animal = 'gru', food = 'donuts'} +myFavs = {food = 'pizza'} +setmetatable(myFavs, {__index = defaultFavs}) +eatenBy = myFavs.animal -- works! thanks, metatable + +-------------------------------------------------------------------------------- +-- Direct table lookups that fail will retry using the metatable's __index +-- value, and this recurses. + +-- An __index value can also be a function(tbl, key) for more customized +-- lookups. + +-- Values of __index,add, .. are called metamethods. +-- Full list. Here a is a table with the metamethod. + +-- __add(a, b) for a + b +-- __sub(a, b) for a - b +-- __mul(a, b) for a * b +-- __div(a, b) for a / b +-- __mod(a, b) for a % b +-- __pow(a, b) for a ^ b +-- __unm(a) for -a +-- __concat(a, b) for a .. b +-- __len(a) for #a +-- __eq(a, b) for a == b +-- __lt(a, b) for a < b +-- __le(a, b) for a <= b +-- __index(a, b) for a.b +-- __newindex(a, b, c) for a.b = c +-- __call(a, ...) for a(...) + +-------------------------------------------------------------------------------- +-- 3.2 Class-like tables and inheritance. +-------------------------------------------------------------------------------- + +-- Classes aren't built in; there are different ways to make them using +-- tables and metatables. + +-- Explanation for this example is below it. + +Dog = {} -- 1. + +function Dog:new() -- 2. + local newObj = {sound = 'woof'} -- 3. + self.__index = self -- 4. + return setmetatable(newObj, self) -- 5. +end + +function Dog:makeSound() -- 6. + print('I say ' .. self.sound) +end + +mrDog = Dog:new() -- 7. +mrDog:makeSound() -- 'I say woof' -- 8. + +-- 1. Dog acts like a class; it's really a table. +-- 2. "function tablename:fn(...)" is the same as +-- "function tablename.fn(self, ...)", The : just adds a first arg called +-- self. Read 7 & 8 below for how self gets its value. +-- 3. newObj will be an instance of class Dog. +-- 4. "self" is the class being instantiated. Often self = Dog, but inheritance +-- can change it. newObj gets self's functions when we set both newObj's +-- metatable and self's __index to self. +-- 5. Reminder: setmetatable returns its first arg. +-- 6. The : works as in 2, but this time we expect self to be an instance +-- instead of a class. +-- 7. Same as Dog.new(Dog), so self = Dog in new(). +-- 8. Same as mrDog.makeSound(mrDog); self = mrDog. + +-------------------------------------------------------------------------------- + +-- Inheritance example: + +LoudDog = Dog:new() -- 1. + +function LoudDog:makeSound() + local s = self.sound .. ' ' -- 2. + print(s .. s .. s) +end + +seymour = LoudDog:new() -- 3. +seymour:makeSound() -- 'woof woof woof' -- 4. + +-------------------------------------------------------------------------------- +-- 1. LoudDog gets Dog's methods and variables. +-- 2. self has a 'sound' key from new(), see 3. +-- 3. Same as "LoudDog.new(LoudDog)", and converted to "Dog.new(LoudDog)" as +-- LoudDog has no 'new' key, but does have "__index = Dog" on its metatable. +-- Result: seymour's metatable is LoudDog, and "LoudDog.__index = Dog". So +-- seymour.key will equal seymour.key, LoudDog.key, Dog.key, whichever +-- table is the first with the given key. +-- 4. The 'makeSound' key is found in LoudDog; this is the same as +-- "LoudDog.makeSound(seymour)". + +-- If needed, a subclass's new() is like the base's: +function LoudDog:new() + local newObj = {} + -- set up newObj + self.__index = self + return setmetatable(newObj, self) +end + +-------------------------------------------------------------------------------- +-- 4. Modules. +-------------------------------------------------------------------------------- + + +--[[ I'm commenting out this section so the rest of this script remains +-- runnable. +``` + +```lua +-- Suppose the file mod.lua looks like this: +local M = {} + +local function sayMyName() + print('Hrunkner') +end + +function M.sayHello() + print('Why hello there') + sayMyName() +end + +return M + +-- Another file can use mod.lua's functionality: +local mod = require('mod') -- Run the file mod.lua. + +-- require is the standard way to include modules. +-- require acts like: (if not cached; see below) +local mod = (function () + +end)() +-- It's like mod.lua is a function body, so that locals inside mod.lua are +-- invisible outside it. + +-- This works because mod here = M in mod.lua: +mod.sayHello() -- Says hello to Hrunkner. + +-- This is wrong; sayMyName only exists in mod.lua: +mod.sayMyName() -- error + +-- require's return values are cached so a file is run at most once, even when +-- require'd many times. + +-- Suppose mod2.lua contains "print('Hi!')". +local a = require('mod2') -- Prints Hi! +local b = require('mod2') -- Doesn't print; a=b. + +-- dofile is like require without caching: +dofile('mod2') --> Hi! +dofile('mod2') --> Hi! (runs again, unlike require) + +-- loadfile loads a lua file but doesn't run it yet. +f = loadfile('mod2') -- Calling f() runs mod2.lua. + +-- loadstring is loadfile for strings. +g = loadstring('print(343)') -- Returns a function. +g() -- Prints out 343; nothing printed before now. + +--]] + +``` +## References + +I was excited to learn Lua so I could make games +with the Love 2D game engine. That's the why. + +I started with BlackBulletIV's Lua for programmers. +Next I read the official Programming in Lua book. +That's the how. + +It might be helpful to check out the Lua short +reference on lua-users.org. + +The main topics not covered are standard libraries: + +* string library +* table library +* math library +* io library +* os library + +By the way, the entire file is valid Lua; save it +as learn.lua and run it with "lua learn.lua" ! + +This was first written for tylerneylon.com, and is +also available as a github gist. Have fun with Lua! -- cgit v1.2.3 From 82eb0f99584eab17a96c210606a12732ba483422 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 7 Aug 2014 18:11:17 +0400 Subject: Fix of 1 mistake --- ru-ru/lua-ru.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 55fc7bb9..e94f4c00 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -68,7 +68,7 @@ if not aBoolValue then print('это значение ложно') end --[[ Для 'or' и 'and' действует принцип "какой оператор дальше, - тот и применается". Это действует аналогично a?b:c + тот и применяется". Это действует аналогично a?b:c операторам в C/js: --]] ans = aBoolValue and 'yes' or 'no' --> 'no' -- cgit v1.2.3 From 825a22f6fe34fa21dfaa677d93ae3ddf8e9857ee Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 7 Aug 2014 18:19:40 +0400 Subject: 2 part of Russian translation Full translation of 1st section and begin of 2nd. --- ru-ru/lua-ru.html.markdown | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index e94f4c00..72a3fd9f 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -74,24 +74,24 @@ if not aBoolValue then print('это значение ложно') end ans = aBoolValue and 'yes' or 'no' --> 'no' karlSum = 0 -for i = 1, 100 do -- The range includes both ends. +for i = 1, 100 do -- Здесь указан диапазон, ограниченный с двух сторон. karlSum = karlSum + i end --- Use "100, 1, -1" as the range to count down: +-- Используйте "100, 1, -1" как нисходящий диапазон: fredSum = 0 for j = 100, 1, -1 do fredSum = fredSum + j end --- In general, the range is begin, end[, step]. +-- В основном, диапазон устроен так: начало, конец[, шаг]. --- Another loop construct: +-- Другая конструкция цикла: repeat - print('the way of the future') + print('путь будущего') num = num - 1 until num == 0 -------------------------------------------------------------------------------- --- 2. Functions. +-- 2. Функции. -------------------------------------------------------------------------------- function fib(n) @@ -99,10 +99,10 @@ function fib(n) return fib(n - 2) + fib(n - 1) end --- Closures and anonymous functions are ok: +-- Вложенные и анонимные функции являются нормой: function adder(x) - -- The returned function is created when adder is called, and remembers the - -- value of x: + -- Возращаемая функция создаётся когда adder вызывается, тот в свою очередь + -- запоминает значение переменной x: return function (y) return x + y end end a1 = adder(9) -- cgit v1.2.3 From cbd804412a48a532e4f81ba781a8ed1a61acd0c7 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 7 Aug 2014 19:49:53 +0400 Subject: 3 part of Russian translation Little piece of translation. --- ru-ru/lua-ru.html.markdown | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 72a3fd9f..ee0fe870 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -5,6 +5,7 @@ contributors: - ["Tyler Neylon", "http://tylerneylon.com/"] translators: - ["Max Solomonov", "https://vk.com/solomonovmaksim"] + - ["Max Truhonin", "https://vk.com/maximmax42"] lang: ru-ru --- @@ -110,20 +111,20 @@ a2 = adder(36) print(a1(16)) --> 25 print(a2(64)) --> 100 --- Returns, func calls, and assignments all work with lists that may be --- mismatched in length. Unmatched receivers are nil; unmatched senders are --- discarded. +-- Возвраты, вызовы функций и присвоения, вся работа с перечисленным может иметь +-- неодинаковое кол-во аргументов/элементов. Неиспользуемые аргументы являются nil и +-- отбрасываются на приёме. x, y, z = 1, 2, 3, 4 --- Now x = 1, y = 2, z = 3, and 4 is thrown away. +-- Теперь x = 1, y = 2, z = 3, и 4 просто отбрасывается. function bar(a, b, c) print(a, b, c) return 4, 8, 15, 16, 23, 42 end -x, y = bar('zaphod') --> prints "zaphod nil nil" --- Now x = 4, y = 8, values 15..42 are discarded. +x, y = bar('zaphod') --> выводит "zaphod nil nil" +-- Теперь x = 4, y = 8, а значения 15..42 отбрасываются. -- Functions are first-class, may be local/global. These are the same: function f(x) return x * x end -- cgit v1.2.3 From d246b103a3ac48d6a8bf57f3931b07166dea1e80 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 10 Aug 2014 22:54:27 +0400 Subject: 4 part of Russian translation Other part of translation. --- ru-ru/lua-ru.html.markdown | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index ee0fe870..ebcd9a74 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -126,11 +126,11 @@ end x, y = bar('zaphod') --> выводит "zaphod nil nil" -- Теперь x = 4, y = 8, а значения 15..42 отбрасываются. --- Functions are first-class, may be local/global. These are the same: +-- Функции могут быть локальными и глобальными. Эти строки делают одно и то же: function f(x) return x * x end f = function (x) return x * x end --- And so are these: +-- Эти тоже: local function g(x) return math.sin(x) end local g = function(x) return math.sin(x) end -- Equivalent to local function g(x)..., except referring to g in the function @@ -140,17 +140,17 @@ local g; g = function (x) return math.sin(x) end -- Trig funcs work in radians, by the way. --- Calls with one string param don't need parens: -print 'hello' -- Works fine. +-- Вызов функции с одним текстовым параметром не требует круглых скобок: +print 'hello' -- Работает без ошибок. --- Calls with one table param don't need parens either (more on tables below): +-- Вызов функции с одним табличным параметром так же не требуют круглых скобок (про таблицы в след.части): print {} -- Works fine too. -------------------------------------------------------------------------------- --- 3. Tables. +-- 3. Таблицы. -------------------------------------------------------------------------------- --- Tables = Lua's only compound data structure; they are associative arrays. +-- Таблицы = структура данных, свойственная только для Lua; это ассоциативные массивы. -- Similar to php arrays or js objects, they are hash-lookup dicts that can -- also be used as lists. @@ -160,9 +160,9 @@ print {} -- Works fine too. t = {key1 = 'value1', key2 = false} -- String keys can use js-like dot notation: -print(t.key1) -- Prints 'value1'. -t.newKey = {} -- Adds a new key/value pair. -t.key2 = nil -- Removes key2 from the table. +print(t.key1) -- Печатает 'value1'. +t.newKey = {} -- Добавляет новую пару ключ-значение. +t.key2 = nil -- Удаляет key2 из таблицы. -- Literal notation for any (non-nil) value as key: u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'} @@ -170,7 +170,7 @@ print(u[6.28]) -- prints "tau" -- Key matching is basically by value for numbers and strings, but by identity -- for tables. -a = u['@!#'] -- Now a = 'qbert'. +a = u['@!#'] -- Теперь a = 'qbert'. b = u[{}] -- We might expect 1729, but it's nil: -- b = nil since the lookup fails. It fails because the key we used is not the -- same object as the one used to store the original value. So strings & @@ -180,7 +180,7 @@ b = u[{}] -- We might expect 1729, but it's nil: function h(x) print(x.key1) end h{key1 = 'Sonmi~451'} -- Prints 'Sonmi~451'. -for key, val in pairs(u) do -- Table iteration. +for key, val in pairs(u) do -- Итерация цикла с таблицей. print(key, val) end -- cgit v1.2.3 From 5b8f64f5bbb91ac094b95181b46c8220cbd657a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC?= Date: Tue, 12 Aug 2014 01:50:10 +0600 Subject: Update lua-ru.html.markdown --- ru-ru/lua-ru.html.markdown | 50 +++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index ebcd9a74..3fd478ef 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -144,7 +144,7 @@ local g; g = function (x) return math.sin(x) end print 'hello' -- Работает без ошибок. -- Вызов функции с одним табличным параметром так же не требуют круглых скобок (про таблицы в след.части): -print {} -- Works fine too. +print {} -- Тоже сработает. -------------------------------------------------------------------------------- -- 3. Таблицы. @@ -166,7 +166,7 @@ t.key2 = nil -- Удаляет key2 из таблицы. -- Literal notation for any (non-nil) value as key: u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'} -print(u[6.28]) -- prints "tau" +print(u[6.28]) -- пишет "tau" -- Key matching is basically by value for numbers and strings, but by identity -- for tables. @@ -178,14 +178,14 @@ b = u[{}] -- We might expect 1729, but it's nil: -- A one-table-param function call needs no parens: function h(x) print(x.key1) end -h{key1 = 'Sonmi~451'} -- Prints 'Sonmi~451'. +h{key1 = 'Sonmi~451'} -- Печатает 'Sonmi~451'. for key, val in pairs(u) do -- Итерация цикла с таблицей. print(key, val) end --- _G is a special table of all globals. -print(_G['_G'] == _G) -- Prints 'true'. +-- _G - это таблица со всеми глобалями. +print(_G['_G'] == _G) -- Печатает 'true'. -- Using tables as lists / arrays: @@ -198,7 +198,7 @@ end -- keys, treated as a list. -------------------------------------------------------------------------------- --- 3.1 Metatables and metamethods. +-- 3.1 Мета-таблицы и мета-методы. -------------------------------------------------------------------------------- -- A table can have a metatable that gives the table operator-overloadish @@ -207,7 +207,7 @@ end f1 = {a = 1, b = 2} -- Represents the fraction a/b. f2 = {a = 2, b = 3} --- This would fail: +-- Это не сработает: -- s = f1 + f2 metafraction = {} @@ -221,7 +221,7 @@ end setmetatable(f1, metafraction) setmetatable(f2, metafraction) -s = f1 + f2 -- call __add(f1, f2) on f1's metatable +s = f1 + f2 -- вызывает __add(f1, f2) на мета-таблице f1 -- f1, f2 have no key for their metatable, unlike prototypes in js, so you must -- retrieve it as in getmetatable(f1). The metatable is a normal table with @@ -235,7 +235,7 @@ s = f1 + f2 -- call __add(f1, f2) on f1's metatable defaultFavs = {animal = 'gru', food = 'donuts'} myFavs = {food = 'pizza'} setmetatable(myFavs, {__index = defaultFavs}) -eatenBy = myFavs.animal -- works! thanks, metatable +eatenBy = myFavs.animal -- работает! спасибо, мета-таблица. -------------------------------------------------------------------------------- -- Direct table lookups that fail will retry using the metatable's __index @@ -247,21 +247,21 @@ eatenBy = myFavs.animal -- works! thanks, metatable -- Values of __index,add, .. are called metamethods. -- Full list. Here a is a table with the metamethod. --- __add(a, b) for a + b --- __sub(a, b) for a - b --- __mul(a, b) for a * b --- __div(a, b) for a / b --- __mod(a, b) for a % b --- __pow(a, b) for a ^ b --- __unm(a) for -a --- __concat(a, b) for a .. b --- __len(a) for #a --- __eq(a, b) for a == b --- __lt(a, b) for a < b --- __le(a, b) for a <= b --- __index(a, b) for a.b --- __newindex(a, b, c) for a.b = c --- __call(a, ...) for a(...) +-- __add(a, b) для a + b +-- __sub(a, b) для a - b +-- __mul(a, b) для a * b +-- __div(a, b) для a / b +-- __mod(a, b) для a % b +-- __pow(a, b) для a ^ b +-- __unm(a) для -a +-- __concat(a, b) для a .. b +-- __len(a) для #a +-- __eq(a, b) для a == b +-- __lt(a, b) для a < b +-- __le(a, b) для a <= b +-- __index(a, b) для a.b +-- __newindex(a, b, c) для a.b = c +-- __call(a, ...) для a(...) -------------------------------------------------------------------------------- -- 3.2 Class-like tables and inheritance. @@ -335,7 +335,7 @@ function LoudDog:new() end -------------------------------------------------------------------------------- --- 4. Modules. +-- 4. Модули. -------------------------------------------------------------------------------- -- cgit v1.2.3 From 1482bfc52b65c028c364670ab9f2561e7660a932 Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Thu, 30 Oct 2014 18:04:56 +0300 Subject: Add not translated verson of javasript --- ru-ru/javascript-ru.html.markdown | 529 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 529 insertions(+) create mode 100644 ru-ru/javascript-ru.html.markdown diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown new file mode 100644 index 00000000..7e2c0cca --- /dev/null +++ b/ru-ru/javascript-ru.html.markdown @@ -0,0 +1,529 @@ +--- +language: javascript +contributors: + - ["Adam Brenecki", "http://adam.brenecki.id.au"] + - ["Ariel Krakowski", "http://www.learneroo.com"] +translators: + - ["--mynamehere--", "http://github.com/--mynamehere--"] +filename: javascript-ru.js +lang: ru-ru +--- + +JavaScript was created by Netscape's Brendan Eich in 1995. It was originally +intended as a simpler scripting language for websites, complementing the use of +Java for more complex web applications, but its tight integration with Web pages +and built-in support in browsers has caused it to become far more common than +Java in web frontends. + +JavaScript isn't just limited to web browsers, though: Node.js, a project that +provides a standalone runtime for Google Chrome's V8 JavaScript engine, is +becoming more and more popular. + +Feedback would be highly appreciated! You can reach me at +[@adambrenecki](https://twitter.com/adambrenecki), or +[adam@brenecki.id.au](mailto:adam@brenecki.id.au). + +```js +// Comments are like C. Single-line comments start with two slashes, +/* and multiline comments start with slash-star + and end with star-slash */ + +// Statements can be terminated by ; +doStuff(); + +// ... but they don't have to be, as semicolons are automatically inserted +// wherever there's a newline, except in certain cases. +doStuff() + +// Because those cases can cause unexpected results, we'll keep on using +// semicolons in this guide. + +/////////////////////////////////// +// 1. Numbers, Strings and Operators + +// JavaScript has one number type (which is a 64-bit IEEE 754 double). +// Doubles have a 52-bit mantissa, which is enough to store integers +// up to about 9✕10¹⁵ precisely. +3; // = 3 +1.5; // = 1.5 + +// Some basic arithmetic works as you'd expect. +1 + 1; // = 2 +.1 + .2; // = 0.30000000000000004 +8 - 1; // = 7 +10 * 2; // = 20 +35 / 5; // = 7 + +// Including uneven division. +5 / 2; // = 2.5 + +// Bitwise operations also work; when you perform a bitwise operation your float +// is converted to a signed int *up to* 32 bits. +1 << 2; // = 4 + +// Precedence is enforced with parentheses. +(1 + 3) * 2; // = 8 + +// There are three special not-a-real-number values: +Infinity; // result of e.g. 1/0 +-Infinity; // result of e.g. -1/0 +NaN; // result of e.g. 0/0 + +// There's also a boolean type. +true; +false; + +// Strings are created with ' or ". +'abc'; +"Hello, world"; + +// Negation uses the ! symbol +!true; // = false +!false; // = true + +// Equality is === +1 === 1; // = true +2 === 1; // = false + +// Inequality is !== +1 !== 1; // = false +2 !== 1; // = true + +// More comparisons +1 < 10; // = true +1 > 10; // = false +2 <= 2; // = true +2 >= 2; // = true + +// Strings are concatenated with + +"Hello " + "world!"; // = "Hello world!" + +// and are compared with < and > +"a" < "b"; // = true + +// Type coercion is performed for comparisons with double equals... +"5" == 5; // = true +null == undefined; // = true + +// ...unless you use === +"5" === 5; // = false +null === undefined; // = false + +// You can access characters in a string with charAt +"This is a string".charAt(0); // = 'T' + +// ...or use substring to get larger pieces +"Hello world".substring(0, 5); // = "Hello" + +// length is a property, so don't use () +"Hello".length; // = 5 + +// There's also null and undefined +null; // used to indicate a deliberate non-value +undefined; // used to indicate a value is not currently present (although + // undefined is actually a value itself) + +// false, null, undefined, NaN, 0 and "" are falsy; everything else is truthy. +// Note that 0 is falsy and "0" is truthy, even though 0 == "0". + +/////////////////////////////////// +// 2. Variables, Arrays and Objects + +// Variables are declared with the var keyword. JavaScript is dynamically typed, +// so you don't need to specify type. Assignment uses a single = character. +var someVar = 5; + +// if you leave the var keyword off, you won't get an error... +someOtherVar = 10; + +// ...but your variable will be created in the global scope, not in the scope +// you defined it in. + +// Variables declared without being assigned to are set to undefined. +var someThirdVar; // = undefined + +// There's shorthand for performing math operations on variables: +someVar += 5; // equivalent to someVar = someVar + 5; someVar is 10 now +someVar *= 10; // now someVar is 100 + +// and an even-shorter-hand for adding or subtracting 1 +someVar++; // now someVar is 101 +someVar--; // back to 100 + +// Arrays are ordered lists of values, of any type. +var myArray = ["Hello", 45, true]; + +// Their members can be accessed using the square-brackets subscript syntax. +// Array indices start at zero. +myArray[1]; // = 45 + +// Arrays are mutable and of variable length. +myArray.push("World"); +myArray.length; // = 4 + +// Add/Modify at specific index +myArray[3] = "Hello"; + +// JavaScript's objects are equivalent to 'dictionaries' or 'maps' in other +// languages: an unordered collection of key-value pairs. +var myObj = {key1: "Hello", key2: "World"}; + +// Keys are strings, but quotes aren't required if they're a valid +// JavaScript identifier. Values can be any type. +var myObj = {myKey: "myValue", "my other key": 4}; + +// Object attributes can also be accessed using the subscript syntax, +myObj["my other key"]; // = 4 + +// ... or using the dot syntax, provided the key is a valid identifier. +myObj.myKey; // = "myValue" + +// Objects are mutable; values can be changed and new keys added. +myObj.myThirdKey = true; + +// If you try to access a value that's not yet set, you'll get undefined. +myObj.myFourthKey; // = undefined + +/////////////////////////////////// +// 3. Logic and Control Structures + +// The syntax for this section is almost identical to Java's. + +// The if structure works as you'd expect. +var count = 1; +if (count == 3){ + // evaluated if count is 3 +} else if (count == 4){ + // evaluated if count is 4 +} else { + // evaluated if it's not either 3 or 4 +} + +// As does while. +while (true){ + // An infinite loop! +} + +// Do-while loops are like while loops, except they always run at least once. +var input +do { + input = getInput(); +} while (!isValid(input)) + +// the for loop is the same as C and Java: +// initialisation; continue condition; iteration. +for (var i = 0; i < 5; i++){ + // will run 5 times +} + +// && is logical and, || is logical or +if (house.size == "big" && house.colour == "blue"){ + house.contains = "bear"; +} +if (colour == "red" || colour == "blue"){ + // colour is either red or blue +} + +// && and || "short circuit", which is useful for setting default values. +var name = otherName || "default"; + + +// switch statement checks for equality with === +// use 'break' after each case +// or the cases after the correct one will be executed too. +grade = 'B'; +switch (grade) { + case 'A': + console.log("Great job"); + break; + case 'B': + console.log("OK job"); + break; + case 'C': + console.log("You can do better"); + break; + default: + console.log("Oy vey"); + break; +} + + +/////////////////////////////////// +// 4. Functions, Scope and Closures + +// JavaScript functions are declared with the function keyword. +function myFunction(thing){ + return thing.toUpperCase(); +} +myFunction("foo"); // = "FOO" + +// Note that the value to be returned must start on the same line as the +// 'return' keyword, otherwise you'll always return 'undefined' due to +// automatic semicolon insertion. Watch out for this when using Allman style. +function myFunction() +{ + return // <- semicolon automatically inserted here + { + thisIsAn: 'object literal' + } +} +myFunction(); // = undefined + +// JavaScript functions are first class objects, so they can be reassigned to +// different variable names and passed to other functions as arguments - for +// example, when supplying an event handler: +function myFunction(){ + // this code will be called in 5 seconds' time +} +setTimeout(myFunction, 5000); +// Note: setTimeout isn't part of the JS language, but is provided by browsers +// and Node.js. + +// Function objects don't even have to be declared with a name - you can write +// an anonymous function definition directly into the arguments of another. +setTimeout(function(){ + // this code will be called in 5 seconds' time +}, 5000); + +// JavaScript has function scope; functions get their own scope but other blocks +// do not. +if (true){ + var i = 5; +} +i; // = 5 - not undefined as you'd expect in a block-scoped language + +// This has led to a common pattern of "immediately-executing anonymous +// functions", which prevent temporary variables from leaking into the global +// scope. +(function(){ + var temporary = 5; + // We can access the global scope by assiging to the 'global object', which + // in a web browser is always 'window'. The global object may have a + // different name in non-browser environments such as Node.js. + window.permanent = 10; +})(); +temporary; // raises ReferenceError +permanent; // = 10 + +// One of JavaScript's most powerful features is closures. If a function is +// defined inside another function, the inner function has access to all the +// outer function's variables, even after the outer function exits. +function sayHelloInFiveSeconds(name){ + var prompt = "Hello, " + name + "!"; + // Inner functions are put in the local scope by default, as if they were + // declared with 'var'. + function inner(){ + alert(prompt); + } + setTimeout(inner, 5000); + // setTimeout is asynchronous, so the sayHelloInFiveSeconds function will + // exit immediately, and setTimeout will call inner afterwards. However, + // because inner is "closed over" sayHelloInFiveSeconds, inner still has + // access to the 'prompt' variable when it is finally called. +} +sayHelloInFiveSeconds("Adam"); // will open a popup with "Hello, Adam!" in 5s + +/////////////////////////////////// +// 5. More about Objects; Constructors and Prototypes + +// Objects can contain functions. +var myObj = { + myFunc: function(){ + return "Hello world!"; + } +}; +myObj.myFunc(); // = "Hello world!" + +// When functions attached to an object are called, they can access the object +// they're attached to using the this keyword. +myObj = { + myString: "Hello world!", + myFunc: function(){ + return this.myString; + } +}; +myObj.myFunc(); // = "Hello world!" + +// What this is set to has to do with how the function is called, not where +// it's defined. So, our function doesn't work if it isn't called in the +// context of the object. +var myFunc = myObj.myFunc; +myFunc(); // = undefined + +// Inversely, a function can be assigned to the object and gain access to it +// through this, even if it wasn't attached when it was defined. +var myOtherFunc = function(){ + return this.myString.toUpperCase(); +} +myObj.myOtherFunc = myOtherFunc; +myObj.myOtherFunc(); // = "HELLO WORLD!" + +// We can also specify a context for a function to execute in when we invoke it +// using 'call' or 'apply'. + +var anotherFunc = function(s){ + return this.myString + s; +} +anotherFunc.call(myObj, " And Hello Moon!"); // = "Hello World! And Hello Moon!" + +// The 'apply' function is nearly identical, but takes an array for an argument list. + +anotherFunc.apply(myObj, [" And Hello Sun!"]); // = "Hello World! And Hello Sun!" + +// This is useful when working with a function that accepts a sequence of arguments +// and you want to pass an array. + +Math.min(42, 6, 27); // = 6 +Math.min([42, 6, 27]); // = NaN (uh-oh!) +Math.min.apply(Math, [42, 6, 27]); // = 6 + +// But, 'call' and 'apply' are only temporary. When we want it to stick, we can use +// bind. + +var boundFunc = anotherFunc.bind(myObj); +boundFunc(" And Hello Saturn!"); // = "Hello World! And Hello Saturn!" + +// Bind can also be used to partially apply (curry) a function. + +var product = function(a, b){ return a * b; } +var doubler = product.bind(this, 2); +doubler(8); // = 16 + +// When you call a function with the new keyword, a new object is created, and +// made available to the function via the this keyword. Functions designed to be +// called like that are called constructors. + +var MyConstructor = function(){ + this.myNumber = 5; +} +myNewObj = new MyConstructor(); // = {myNumber: 5} +myNewObj.myNumber; // = 5 + +// Every JavaScript object has a 'prototype'. When you go to access a property +// on an object that doesn't exist on the actual object, the interpreter will +// look at its prototype. + +// Some JS implementations let you access an object's prototype on the magic +// property __proto__. While this is useful for explaining prototypes it's not +// part of the standard; we'll get to standard ways of using prototypes later. +var myObj = { + myString: "Hello world!" +}; +var myPrototype = { + meaningOfLife: 42, + myFunc: function(){ + return this.myString.toLowerCase() + } +}; + +myObj.__proto__ = myPrototype; +myObj.meaningOfLife; // = 42 + +// This works for functions, too. +myObj.myFunc(); // = "hello world!" + +// Of course, if your property isn't on your prototype, the prototype's +// prototype is searched, and so on. +myPrototype.__proto__ = { + myBoolean: true +}; +myObj.myBoolean; // = true + +// There's no copying involved here; each object stores a reference to its +// prototype. This means we can alter the prototype and our changes will be +// reflected everywhere. +myPrototype.meaningOfLife = 43; +myObj.meaningOfLife; // = 43 + +// We mentioned that __proto__ was non-standard, and there's no standard way to +// change the prototype of an existing object. However, there are two ways to +// create a new object with a given prototype. + +// The first is Object.create, which is a recent addition to JS, and therefore +// not available in all implementations yet. +var myObj = Object.create(myPrototype); +myObj.meaningOfLife; // = 43 + +// The second way, which works anywhere, has to do with constructors. +// Constructors have a property called prototype. This is *not* the prototype of +// the constructor function itself; instead, it's the prototype that new objects +// are given when they're created with that constructor and the new keyword. +MyConstructor.prototype = { + myNumber: 5, + getMyNumber: function(){ + return this.myNumber; + } +}; +var myNewObj2 = new MyConstructor(); +myNewObj2.getMyNumber(); // = 5 +myNewObj2.myNumber = 6 +myNewObj2.getMyNumber(); // = 6 + +// Built-in types like strings and numbers also have constructors that create +// equivalent wrapper objects. +var myNumber = 12; +var myNumberObj = new Number(12); +myNumber == myNumberObj; // = true + +// Except, they aren't exactly equivalent. +typeof myNumber; // = 'number' +typeof myNumberObj; // = 'object' +myNumber === myNumberObj; // = false +if (0){ + // This code won't execute, because 0 is falsy. +} +if (Number(0)){ + // This code *will* execute, because Number(0) is truthy. +} + +// However, the wrapper objects and the regular builtins share a prototype, so +// you can actually add functionality to a string, for instance. +String.prototype.firstCharacter = function(){ + return this.charAt(0); +} +"abc".firstCharacter(); // = "a" + +// This fact is often used in "polyfilling", which is implementing newer +// features of JavaScript in an older subset of JavaScript, so that they can be +// used in older environments such as outdated browsers. + +// For instance, we mentioned that Object.create isn't yet available in all +// implementations, but we can still use it with this polyfill: +if (Object.create === undefined){ // don't overwrite it if it exists + Object.create = function(proto){ + // make a temporary constructor with the right prototype + var Constructor = function(){}; + Constructor.prototype = proto; + // then use it to create a new, appropriately-prototyped object + return new Constructor(); + } +} +``` + +## Further Reading + +The [Mozilla Developer +Network](https://developer.mozilla.org/en-US/docs/Web/JavaScript) provides +excellent documentation for JavaScript as it's used in browsers. Plus, it's a +wiki, so as you learn more you can help others out by sharing your own +knowledge. + +MDN's [A re-introduction to +JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) +covers much of the concepts covered here in more detail. This guide has quite +deliberately only covered the JavaScript language itself; if you want to learn +more about how to use JavaScript in web pages, start by learning about the +[Document Object +Model](https://developer.mozilla.org/en-US/docs/Using_the_W3C_DOM_Level_1_Core) + +[Learn Javascript by Example and with Challenges](http://www.learneroo.com/modules/64/nodes/350) is a variant of this reference with built-in challenges. + +[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/) is an in-depth +guide of all the counter-intuitive parts of the language. + +[JavaScript: The Definitive Guide](http://www.amazon.com/gp/product/0596805527/) is a classic guide / reference book. + +In addition to direct contributors to this article, some content is adapted +from Louie Dinh's Python tutorial on this site, and the [JS +Tutorial](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) +on the Mozilla Developer Network. -- cgit v1.2.3 From 3c0733f45ce2de89888ea3dd2a16401df1a4a6b7 Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Thu, 30 Oct 2014 21:41:16 +0300 Subject: Translate preamble --- ru-ru/javascript-ru.html.markdown | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index 7e2c0cca..963805f9 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -9,16 +9,28 @@ filename: javascript-ru.js lang: ru-ru --- +Javascript был разработан Бренданом Айком из Netcape в 1995. Изначально +предполагалось, что он станет простым вариантом скриптового языка для сайтов, +дополняющий к Java, который в свою очередь использовался бы для более сложных +web-приложений. Но тонкая интегрированность javascript с web-страницей и +встроенная поддержка в браузерах привели к тому, чтобы он стал более +распространен в web-разработке, чем Java. JavaScript was created by Netscape's Brendan Eich in 1995. It was originally intended as a simpler scripting language for websites, complementing the use of Java for more complex web applications, but its tight integration with Web pages and built-in support in browsers has caused it to become far more common than Java in web frontends. +Использование Javascript не ограничивается браузерами. Проект Node.js, +предоставляющий независимую среду выполнения на движке Google Chrome V8 +JavaScript, становится все более популярным. JavaScript isn't just limited to web browsers, though: Node.js, a project that provides a standalone runtime for Google Chrome's V8 JavaScript engine, is becoming more and more popular. +Обратная связь важна и нужна! Вы можете написаться мне +на [@_remedy]() или +[mymail](). Feedback would be highly appreciated! You can reach me at [@adambrenecki](https://twitter.com/adambrenecki), or [adam@brenecki.id.au](mailto:adam@brenecki.id.au). -- cgit v1.2.3 From 89ac5d6b77e84517e8844d694676f9e25d171538 Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Thu, 30 Oct 2014 21:44:21 +0300 Subject: Translate 1st part --- ru-ru/javascript-ru.html.markdown | 56 ++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index 963805f9..aa1d1f3c 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -36,29 +36,43 @@ Feedback would be highly appreciated! You can reach me at [adam@brenecki.id.au](mailto:adam@brenecki.id.au). ```js +// Комментарии оформляются как в C. +// Обнострочнные комментарии начинаются с двух слешей, // Comments are like C. Single-line comments start with two slashes, +/* а многострочные с слеша и звездочки + и заканчиваются звездочеий и слешом */ /* and multiline comments start with slash-star and end with star-slash */ +// Выражения разделяются с помощью ; // Statements can be terminated by ; doStuff(); +// ... но этого можно и делать, разделители подставляются автоматически +// после перехода на новую строку за исключением особых случаев // ... but they don't have to be, as semicolons are automatically inserted // wherever there's a newline, except in certain cases. doStuff() +// Это может приводить к непредсказуемому результату и поэтому мы будем +// использовать разделители в этом туре. // Because those cases can cause unexpected results, we'll keep on using // semicolons in this guide. /////////////////////////////////// +// 1. Числа, Строки и Операторы // 1. Numbers, Strings and Operators +// В Javasript всего 1 числовой тип - 64-битное число с плавающей точкой стандарта +// IEEE 754) +// todo: сформулировать // JavaScript has one number type (which is a 64-bit IEEE 754 double). // Doubles have a 52-bit mantissa, which is enough to store integers // up to about 9✕10¹⁵ precisely. 3; // = 3 1.5; // = 1.5 +// В основном базовая арифметика работает предсказуемо // Some basic arithmetic works as you'd expect. 1 + 1; // = 2 .1 + .2; // = 0.30000000000000004 @@ -66,76 +80,92 @@ doStuff() 10 * 2; // = 20 35 / 5; // = 7 +// Включая нецелочисленное деление (todo:уточнить!) // Including uneven division. 5 / 2; // = 2.5 +// Двоичные операции тоже есть. Если применить двоичную операцию к float-числу, +// оно будет приведено к 32-битному целому со знаком. // Bitwise operations also work; when you perform a bitwise operation your float // is converted to a signed int *up to* 32 bits. 1 << 2; // = 4 +// (todo:перевести) // Precedence is enforced with parentheses. (1 + 3) * 2; // = 8 +// Есть три особых не реальных числовых значения: // There are three special not-a-real-number values: -Infinity; // result of e.g. 1/0 --Infinity; // result of e.g. -1/0 -NaN; // result of e.g. 0/0 +Infinity; // допустим, результат операции 1/0 +-Infinity; // допустим, результат операции -1/0 +NaN; // допустим, результат операции 0/0 +// Так же есть тип булевых данных. // There's also a boolean type. true; false; +// Строки создаются с помощью ' или ". // Strings are created with ' or ". 'abc'; "Hello, world"; -// Negation uses the ! symbol +// Оператор ! означает отрицание !true; // = false !false; // = true -// Equality is === +// Равество это === 1 === 1; // = true 2 === 1; // = false -// Inequality is !== +// Неравенство это !== 1 !== 1; // = false 2 !== 1; // = true -// More comparisons +// Еще сравнения 1 < 10; // = true 1 > 10; // = false 2 <= 2; // = true 2 >= 2; // = true -// Strings are concatenated with + +// Строки складываются с помощью + "Hello " + "world!"; // = "Hello world!" -// and are compared with < and > +// и сравниваются с помощью < и > "a" < "b"; // = true +// Приведение типов выполняется при сравнении с ==... // Type coercion is performed for comparisons with double equals... "5" == 5; // = true null == undefined; // = true -// ...unless you use === +// ...в отличие от === "5" === 5; // = false null === undefined; // = false +// Для доступа к конкретному символу строки используйте charAt // You can access characters in a string with charAt "This is a string".charAt(0); // = 'T' +// ... или используйте substring для получения подстроки // ...or use substring to get larger pieces "Hello world".substring(0, 5); // = "Hello" +// length(длина) - свойство, не используйте () // length is a property, so don't use () "Hello".length; // = 5 +// Есть null и undefined // There's also null and undefined -null; // used to indicate a deliberate non-value -undefined; // used to indicate a value is not currently present (although - // undefined is actually a value itself) +null; // используется что бы указать явно, что значения нет +undefined; // испрользуется чтобы показать, что значения не было установлено + // собственно, undefined так и переводится +// false, null, undefined, NaN, 0 и "" являются falsy-значениями(при приведении +// в булеву типу становятся false) // false, null, undefined, NaN, 0 and "" are falsy; everything else is truthy. +// Обратите внимание что 0 приводится к false, а "0" к true, не смотря на то, +// что "0"==0 // Note that 0 is falsy and "0" is truthy, even though 0 == "0". /////////////////////////////////// -- cgit v1.2.3 From 27825265f397087a60e597d5a0a1ae44d180ddc5 Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Thu, 30 Oct 2014 21:58:59 +0300 Subject: Translate part 3 --- ru-ru/javascript-ru.html.markdown | 41 +++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index aa1d1f3c..1369d0d7 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -9,6 +9,8 @@ filename: javascript-ru.js lang: ru-ru --- +todo: привести все названия языка к коректному написанию + Javascript был разработан Бренданом Айком из Netcape в 1995. Изначально предполагалось, что он станет простым вариантом скриптового языка для сайтов, дополняющий к Java, который в свою очередь использовался бы для более сложных @@ -169,60 +171,83 @@ undefined; // испрользуется чтобы показать, что з // Note that 0 is falsy and "0" is truthy, even though 0 == "0". /////////////////////////////////// -// 2. Variables, Arrays and Objects +// 2. Переменные, массивы и объекты +// Переменные объявляются ключевым словом var. Javascript динамически +// типизируемый, так что указывать тип не нужно. +// Присвоение значения описывается с помощью оператора = // Variables are declared with the var keyword. JavaScript is dynamically typed, // so you don't need to specify type. Assignment uses a single = character. var someVar = 5; +// если не указать ключевого слова var, ошибки не будет... // if you leave the var keyword off, you won't get an error... someOtherVar = 10; +// ...но переменная будет создана в глобальном контексте, в не области +// видимости, в которой она была объявлена. // ...but your variable will be created in the global scope, not in the scope // you defined it in. +// Переменные объявленные без присвоения значения, содержать undefined // Variables declared without being assigned to are set to undefined. var someThirdVar; // = undefined +// Для математических операций над числами есть короткая запись: // There's shorthand for performing math operations on variables: -someVar += 5; // equivalent to someVar = someVar + 5; someVar is 10 now -someVar *= 10; // now someVar is 100 +someVar += 5; // тоже что someVar = someVar + 5; someVar равно 10 теперь +someVar *= 10; // а теперь -- 100 -// and an even-shorter-hand for adding or subtracting 1 -someVar++; // now someVar is 101 -someVar--; // back to 100 +// еще более короткая запись для добавления и вычитания 1 +someVar++; // теперь someVar равно 101 +someVar--; // обратно к 100 +// Массивы -- упорядоченные списки значений любых типов. // Arrays are ordered lists of values, of any type. var myArray = ["Hello", 45, true]; +// Для доступу к элементам массивов используйте квадратные скобки. +// Индексы массивов начинаются с 0 // Their members can be accessed using the square-brackets subscript syntax. // Array indices start at zero. myArray[1]; // = 45 +// Массивы мутабельны(изменяемы) и имеют переменную длину. // Arrays are mutable and of variable length. -myArray.push("World"); +myArray.push("World"); // добавить элемент myArray.length; // = 4 -// Add/Modify at specific index +// Добавить или изменить значение по конкретному индексу myArray[3] = "Hello"; +// Объёкты javascript похожи на dictionary или map из других языков +// программирования. Это неупорядочнные коллекции пар ключ-значение. // JavaScript's objects are equivalent to 'dictionaries' or 'maps' in other // languages: an unordered collection of key-value pairs. var myObj = {key1: "Hello", key2: "World"}; +// Ключи -- это строки, но кавычки не требуются если названия явлюятся +// корректными javascript идентификаторами. Значения могут быть любого типа. // Keys are strings, but quotes aren't required if they're a valid // JavaScript identifier. Values can be any type. var myObj = {myKey: "myValue", "my other key": 4}; +// Доступ к атрибту объекта можно получить с помощью квадратных скобок // Object attributes can also be accessed using the subscript syntax, myObj["my other key"]; // = 4 +// ... или используя точечную нотацию, при условии что ключ является +// корректным идентификатором // ... or using the dot syntax, provided the key is a valid identifier. myObj.myKey; // = "myValue" +// Объекты мутабельны. В существуюещем объекте можно изменить значние +// или добавить новый атрибут // Objects are mutable; values can be changed and new keys added. myObj.myThirdKey = true; +// При попытке доступа к атрибуту, который до этого не был создан, будет +// возвращен undefined // If you try to access a value that's not yet set, you'll get undefined. myObj.myFourthKey; // = undefined -- cgit v1.2.3 From 4fefe7ac06d2cfc87c0de263ea87475daa96248e Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Sat, 1 Nov 2014 22:54:49 +0300 Subject: Translate Logic and Control Structures --- ru-ru/javascript-ru.html.markdown | 44 ++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index 1369d0d7..c0e4c0fa 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -252,65 +252,79 @@ myObj.myThirdKey = true; myObj.myFourthKey; // = undefined /////////////////////////////////// +// 3. Логика и управляющие структуры // 3. Logic and Control Structures +// +// Синтаксис управляющих структур очень похож на его реализацию в Java. // The syntax for this section is almost identical to Java's. +// if работает так как вы ожидаете. // The if structure works as you'd expect. var count = 1; if (count == 3){ - // evaluated if count is 3 + // выполнится, если значение count равно 3 } else if (count == 4){ - // evaluated if count is 4 + // выполнится, если значение count равно 4 } else { - // evaluated if it's not either 3 or 4 + // выполнится, если значение countне будет равно ни 3 ни 4 } -// As does while. +// Поведение while тоже вполне предсказуемо while (true){ - // An infinite loop! + // Бесконечный цикл } +// Циклы do-while похожи на while, но они всегда выполняются хотябы 1 раз. // Do-while loops are like while loops, except they always run at least once. var input do { input = getInput(); } while (!isValid(input)) +// Цикл for такой же как в C b Java: +// инициализация; условие продолжения; итерация // the for loop is the same as C and Java: // initialisation; continue condition; iteration. for (var i = 0; i < 5; i++){ + // выполнится 5 раз // will run 5 times } +// && - логическое и, || - логическое или // && is logical and, || is logical or -if (house.size == "big" && house.colour == "blue"){ +if (house.size == "big" && house.color == "blue"){ house.contains = "bear"; } -if (colour == "red" || colour == "blue"){ +if (color == "red" || color == "blue"){ + // если цвет или красный или синий // colour is either red or blue } +// && и || удобны для установки значений по умолчанию. // && and || "short circuit", which is useful for setting default values. var name = otherName || "default"; +// выражение switch проверяет равество с помощью === +// используйте 'break' после каждого case +// иначе помимо правильного case выполнятся и все последующие. // switch statement checks for equality with === // use 'break' after each case // or the cases after the correct one will be executed too. -grade = 'B'; +grade = '4'; // оценка switch (grade) { - case 'A': - console.log("Great job"); + case '5': + console.log("Великолепно"); break; - case 'B': - console.log("OK job"); + case '4': + console.log("Неплохо"); break; - case 'C': - console.log("You can do better"); + case '3': + console.log("Можно и лучше"); break; default: - console.log("Oy vey"); + console.log("Да уж."); break; } -- cgit v1.2.3 From b1ec17dae0827b4c17d18399d4bd666a9e617bc4 Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Sat, 1 Nov 2014 22:55:18 +0300 Subject: Fix grammar --- ru-ru/javascript-ru.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index c0e4c0fa..a22055ef 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -237,12 +237,12 @@ var myObj = {myKey: "myValue", "my other key": 4}; myObj["my other key"]; // = 4 // ... или используя точечную нотацию, при условии что ключ является -// корректным идентификатором +// корректным идентификатором. // ... or using the dot syntax, provided the key is a valid identifier. myObj.myKey; // = "myValue" // Объекты мутабельны. В существуюещем объекте можно изменить значние -// или добавить новый атрибут +// или добавить новый атрибут. // Objects are mutable; values can be changed and new keys added. myObj.myThirdKey = true; -- cgit v1.2.3 From 44615813763e218e4f1140ff6c9dbcdd6948d858 Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Sat, 1 Nov 2014 23:21:54 +0300 Subject: Translate 4. Functions, Scope and Closures --- ru-ru/javascript-ru.html.markdown | 50 ++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index a22055ef..b5556f49 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -330,79 +330,117 @@ switch (grade) { /////////////////////////////////// +// 4. Функции, Область видимости и Замыкания // 4. Functions, Scope and Closures +// Функции в JavaScript объявляются с помощью ключевого слова function. // JavaScript functions are declared with the function keyword. function myFunction(thing){ - return thing.toUpperCase(); + return thing.toUpperCase(); // приведение к верхнему регистру } myFunction("foo"); // = "FOO" +// Помните, что значение, которое должно быть возкращено должно начинаться +// на той же строке, где расположено ключевое слово 'return'. В противном случае +// будет возвращено undefined. Такое поведения объясняется автоматической +// вставкой разделителей ';'. Оглядывйтесь на этот факт, если используете +// BSD стиль оформления кода. // Note that the value to be returned must start on the same line as the // 'return' keyword, otherwise you'll always return 'undefined' due to // automatic semicolon insertion. Watch out for this when using Allman style. function myFunction() { - return // <- semicolon automatically inserted here + return // <- разделитель автоматически будет вставлен здесь { thisIsAn: 'object literal' } } myFunction(); // = undefined +// Функции в JavaScript являются объектами, поэтому их можно назначить в +// переменные с разными названиями и передавать в другие функции, как аргументы, +// на пример, при указании обработчика события. // JavaScript functions are first class objects, so they can be reassigned to // different variable names and passed to other functions as arguments - for // example, when supplying an event handler: function myFunction(){ + // этот фрагмент кода будет вызван через 5 секунд // this code will be called in 5 seconds' time } setTimeout(myFunction, 5000); +// Обратите внимание, что setTimeout не является частью языка, однако он +// доступен в API браузеров и Node.js. // Note: setTimeout isn't part of the JS language, but is provided by browsers // and Node.js. +// Объект функции на самом деле не обязательно объявлять с именем - можно +// создать анонимную функцию прямо в аргументах другой функции. // Function objects don't even have to be declared with a name - you can write // an anonymous function definition directly into the arguments of another. setTimeout(function(){ + // этот фрагмент кода будет вызван через 5 секунд // this code will be called in 5 seconds' time }, 5000); +// В JavaScript есть области видимости. У функций есть собственные области +// видимости, у других блоков их нет. // JavaScript has function scope; functions get their own scope but other blocks // do not. if (true){ var i = 5; } -i; // = 5 - not undefined as you'd expect in a block-scoped language +i; // = 5, а не undefined, как это было бы ожидаемо(todo: поправить) + // в языке, создающем области видисти для блоков " +// Это привело к появлению паттерна общего назначения "immediately-executing +// anonymous functions" (сразу выполняющиеся анонимные функции), который +// позволяет предотвратить запись временных переменных в общую облать видимости. // This has led to a common pattern of "immediately-executing anonymous // functions", which prevent temporary variables from leaking into the global // scope. (function(){ var temporary = 5; + // Для доступа к глобальной области видимости можно использовать запись в + // некоторый 'глобальный объект', для браузеров это 'window'. Глобальный + // объект может называться по-разному в небраузерных средах, таких Node.js. // We can access the global scope by assiging to the 'global object', which // in a web browser is always 'window'. The global object may have a // different name in non-browser environments such as Node.js. window.permanent = 10; })(); -temporary; // raises ReferenceError +temporary; // вызывает исключение ReferenceError permanent; // = 10 +// Одной из сильных сторон JavaScript являются замыкания. Если функция +// объявлена в вниутри другой функции, внутренняя функция имеет доступ ко всем +// переменным внешней функции, даже после того, как внешняя функции завершила +// свое выполнение // One of JavaScript's most powerful features is closures. If a function is // defined inside another function, the inner function has access to all the // outer function's variables, even after the outer function exits. function sayHelloInFiveSeconds(name){ - var prompt = "Hello, " + name + "!"; + var prompt = "Привет, " + name + "!"; + // Внутренние фунции помещаются в локальную область видимости, как-будто они + // объявлены с ключевым словом 'var'. // Inner functions are put in the local scope by default, as if they were // declared with 'var'. function inner(){ alert(prompt); } setTimeout(inner, 5000); + // setTimeout является асинхроннной, и поэтому функция sayHelloInFiveSeconds + // завершит свое выполнение сразу и setTimeout вызовет inner позже. + // Однако, так как inner "замкнута"(todo: уточнить "закрыта внутри") + // sayHelloInFiveSeconds, inner все еще будет иметь доступ к переменной + // prompt, когда будет вызвана. // setTimeout is asynchronous, so the sayHelloInFiveSeconds function will // exit immediately, and setTimeout will call inner afterwards. However, // because inner is "closed over" sayHelloInFiveSeconds, inner still has // access to the 'prompt' variable when it is finally called. } -sayHelloInFiveSeconds("Adam"); // will open a popup with "Hello, Adam!" in 5s +sayHelloInFiveSeconds("Вася"); // откроет модальное окно с сообщением + // "Привет, Вася" по истечении 5 секунд. + /////////////////////////////////// // 5. More about Objects; Constructors and Prototypes -- cgit v1.2.3 From 6e694a82b2503a2cce524df96c1c59af6d4ecdea Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Sun, 2 Nov 2014 01:12:22 +0300 Subject: Translate last chapter --- ru-ru/javascript-ru.html.markdown | 59 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index b5556f49..f0c91278 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -443,8 +443,10 @@ sayHelloInFiveSeconds("Вася"); // откроет модальное окно /////////////////////////////////// +// 5. Немного об Объектах. Конструкторы и Прототипы // 5. More about Objects; Constructors and Prototypes +// Объекты погут содержать функции // Objects can contain functions. var myObj = { myFunc: function(){ @@ -453,6 +455,8 @@ var myObj = { }; myObj.myFunc(); // = "Hello world!" +// Когда функции прикрепленные к объекту вызываются, они могут получить доступ +// к данным объекта, ипользую ключевое слово this. // When functions attached to an object are called, they can access the object // they're attached to using the this keyword. myObj = { @@ -463,12 +467,17 @@ myObj = { }; myObj.myFunc(); // = "Hello world!" +// Содержание this определяется исходя из того, как была вызвана функция, а +// не места её определения. По этой причине наша функция не будет работать вне +// контекста объекта. // What this is set to has to do with how the function is called, not where // it's defined. So, our function doesn't work if it isn't called in the // context of the object. var myFunc = myObj.myFunc; myFunc(); // = undefined +// И напротив, функция может быть присвоена объекту и получить доступ к нему +// через this, даже если она не была прикреплена к объекту в момент её создания. // Inversely, a function can be assigned to the object and gain access to it // through this, even if it wasn't attached when it was defined. var myOtherFunc = function(){ @@ -477,6 +486,7 @@ var myOtherFunc = function(){ myObj.myOtherFunc = myOtherFunc; myObj.myOtherFunc(); // = "HELLO WORLD!" +// Также можно указать контекс выполнения фунции с помощью 'call' или 'apply'. // We can also specify a context for a function to execute in when we invoke it // using 'call' or 'apply'. @@ -485,10 +495,13 @@ var anotherFunc = function(s){ } anotherFunc.call(myObj, " And Hello Moon!"); // = "Hello World! And Hello Moon!" +// Функция 'apply' очень похожа, но принимает массив со списком аргументов. // The 'apply' function is nearly identical, but takes an array for an argument list. anotherFunc.apply(myObj, [" And Hello Sun!"]); // = "Hello World! And Hello Sun!" +// Это может быть удобно, когда работаешь с фунцией принимающей на вход +// последовательность аргументов и нужно передать их в виде массива. // This is useful when working with a function that accepts a sequence of arguments // and you want to pass an array. @@ -496,18 +509,25 @@ Math.min(42, 6, 27); // = 6 Math.min([42, 6, 27]); // = NaN (uh-oh!) Math.min.apply(Math, [42, 6, 27]); // = 6 +// Однако, 'call' и 'apply' не имеют постоянного эффекта. Если вы хотите +// зафиксировать контекст для функции, используйте bind. // But, 'call' and 'apply' are only temporary. When we want it to stick, we can use // bind. var boundFunc = anotherFunc.bind(myObj); boundFunc(" And Hello Saturn!"); // = "Hello World! And Hello Saturn!" +// bind можно использовать чтобы частично передать аргументы в +// функцию (каррировать). // Bind can also be used to partially apply (curry) a function. var product = function(a, b){ return a * b; } var doubler = product.bind(this, 2); doubler(8); // = 16 +// Когда функция вызывается с ключевым словом new, создается новый объект. +// Данный объект становится доступным функции через ключевое слово this. +// Функции спроектированные вызываться таким способом называются конструкторами. // When you call a function with the new keyword, a new object is created, and // made available to the function via the this keyword. Functions designed to be // called like that are called constructors. @@ -518,10 +538,17 @@ var MyConstructor = function(){ myNewObj = new MyConstructor(); // = {myNumber: 5} myNewObj.myNumber; // = 5 +// Любой объект в JavaScript имеет 'прототип'. Когда выпытаетесь получить доступ +// к свойству не объявленному в данном объекте, интерпретатор будет искать его +// в прототипе. // Every JavaScript object has a 'prototype'. When you go to access a property // on an object that doesn't exist on the actual object, the interpreter will // look at its prototype. +// Некоторые реализации JS позволяют получить доступ к прототипу с помощью +// волшебного свойства __proto__. До момента пока оно не являются стандартным, +// __proto__ полезно лишь для изучения прототипов в JavaScript. Мы разберемся +// со стандартными способами работы с прототипом несколько позже. // Some JS implementations let you access an object's prototype on the magic // property __proto__. While this is useful for explaining prototypes it's not // part of the standard; we'll get to standard ways of using prototypes later. @@ -537,10 +564,10 @@ var myPrototype = { myObj.__proto__ = myPrototype; myObj.meaningOfLife; // = 42 - -// This works for functions, too. myObj.myFunc(); // = "hello world!" +// Естествно, если в свойства нет в прототипе, поиск будет продолжен в прототипе +// прототипа и так далее. // Of course, if your property isn't on your prototype, the prototype's // prototype is searched, and so on. myPrototype.__proto__ = { @@ -548,21 +575,32 @@ myPrototype.__proto__ = { }; myObj.myBoolean; // = true +// Ничего не копируется, каждый объект хранит ссылку на свой прототип. Если +// изменить прототип, все изменения отразятся во всех его потомках. // There's no copying involved here; each object stores a reference to its // prototype. This means we can alter the prototype and our changes will be // reflected everywhere. myPrototype.meaningOfLife = 43; myObj.meaningOfLife; // = 43 +// Как было сказано выше, __proto__ не является стандартом, и нет стандартного +// способа изменить прототип у созданного объекта. Однако, есть два способа +// создать объект с заданным прототипом. // We mentioned that __proto__ was non-standard, and there's no standard way to // change the prototype of an existing object. However, there are two ways to // create a new object with a given prototype. +// Первый способ - Object.create, был добавлен в JS относительно недавно, и +// потому не доступен в более ранних реализациях языка. // The first is Object.create, which is a recent addition to JS, and therefore // not available in all implementations yet. var myObj = Object.create(myPrototype); myObj.meaningOfLife; // = 43 +// Второй вариан доступен везде и связан с конструкторами. Конструкторы имеют +// свойство prototype. Это воовсе не прототип функции конструктора, напротив, +// это прототип, который присваевается новым объектам, созданным с этим +// конструктором с помощью ключевого слова new. // The second way, which works anywhere, has to do with constructors. // Constructors have a property called prototype. This is *not* the prototype of // the constructor function itself; instead, it's the prototype that new objects @@ -578,23 +616,30 @@ myNewObj2.getMyNumber(); // = 5 myNewObj2.myNumber = 6 myNewObj2.getMyNumber(); // = 6 +// У встроенных типов таких, как строки и числа, тоже есть конструкторы, +// создающие эквивалентные объекты-обертки. // Built-in types like strings and numbers also have constructors that create // equivalent wrapper objects. var myNumber = 12; var myNumberObj = new Number(12); myNumber == myNumberObj; // = true +// Правда, они не совсем эквивалентны. // Except, they aren't exactly equivalent. typeof myNumber; // = 'number' typeof myNumberObj; // = 'object' myNumber === myNumberObj; // = false if (0){ + // Этот фрагмент кода не будет выпонен, так как 0 приводится к false // This code won't execute, because 0 is falsy. } if (Number(0)){ + // Этот фрагмент кода *будет* выпонен, так как Number(0) приводится к true. // This code *will* execute, because Number(0) is truthy. } +// Однако, оберточные объекты и обычные встроенные типы имеют общие прототипы, +// следовательно вы можете расширить функциональность строки, например. // However, the wrapper objects and the regular builtins share a prototype, so // you can actually add functionality to a string, for instance. String.prototype.firstCharacter = function(){ @@ -602,17 +647,23 @@ String.prototype.firstCharacter = function(){ } "abc".firstCharacter(); // = "a" +// Этот факт часто используется для создания полифилов(polyfill) - реализации +// новых возможностей JS в его болле старых версиях для того чтобы их можно было +// использовать в устаревших браузерах. // This fact is often used in "polyfilling", which is implementing newer // features of JavaScript in an older subset of JavaScript, so that they can be // used in older environments such as outdated browsers. +// Например, мы упомянули, что Object.create не доступен во всех версиях +// JavaScript, но мы може создать полифилл. // For instance, we mentioned that Object.create isn't yet available in all // implementations, but we can still use it with this polyfill: -if (Object.create === undefined){ // don't overwrite it if it exists +if (Object.create === undefined){ // не переопределяем если есть Object.create = function(proto){ - // make a temporary constructor with the right prototype + // создаем временный конструктор с заданным прототипом var Constructor = function(){}; Constructor.prototype = proto; + // создаём новый объект с правильным прототипом // then use it to create a new, appropriately-prototyped object return new Constructor(); } -- cgit v1.2.3 From 821880e95f4b61cdb89eebc7d0077a069b43a2a6 Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Thu, 13 Nov 2014 11:32:51 +0300 Subject: =?UTF-8?q?=C2=A0Add=20Further=20Reading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ru-ru/javascript-ru.html.markdown | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index f0c91278..1f0cfb3f 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -655,7 +655,7 @@ String.prototype.firstCharacter = function(){ // used in older environments such as outdated browsers. // Например, мы упомянули, что Object.create не доступен во всех версиях -// JavaScript, но мы може создать полифилл. +// JavaScript, но мы можем создать полифилл. // For instance, we mentioned that Object.create isn't yet available in all // implementations, but we can still use it with this polyfill: if (Object.create === undefined){ // не переопределяем если есть @@ -670,30 +670,23 @@ if (Object.create === undefined){ // не переопределяем если } ``` -## Further Reading +## Что еще почитать -The [Mozilla Developer -Network](https://developer.mozilla.org/en-US/docs/Web/JavaScript) provides -excellent documentation for JavaScript as it's used in browsers. Plus, it's a -wiki, so as you learn more you can help others out by sharing your own -knowledge. +[Современный учебник JavaScript](http://learn.javascript.ru/) от Ильи Кантора +является довольно качественным и глубоким учебным материалом, освещающим все +особенности современного языка. Помимо учебника на том же домене можно найти +[перевод спецификации ECMAScript 5.1](http://es5.javascript.ru/) и справочник по +возможностям языка. -MDN's [A re-introduction to -JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) -covers much of the concepts covered here in more detail. This guide has quite -deliberately only covered the JavaScript language itself; if you want to learn -more about how to use JavaScript in web pages, start by learning about the -[Document Object -Model](https://developer.mozilla.org/en-US/docs/Using_the_W3C_DOM_Level_1_Core) +[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/ru/) позволяет +довольно быстро изучить основные тонкие места в работе с JS, но фокусируется +только на таких моментах -[Learn Javascript by Example and with Challenges](http://www.learneroo.com/modules/64/nodes/350) is a variant of this reference with built-in challenges. +[Справочник](https://developer.mozilla.org/ru/docs/JavaScript) от MDN +(Mozilla Development Network) содержит информацию о возможностях языка на +английском. -[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/) is an in-depth -guide of all the counter-intuitive parts of the language. +Название проекта ["Принципы написания консистентного, идиоматического кода на +JavaScript"](https://github.com/rwaldron/idiomatic.js/tree/master/translations/ru_RU) +говорит само за себя. -[JavaScript: The Definitive Guide](http://www.amazon.com/gp/product/0596805527/) is a classic guide / reference book. - -In addition to direct contributors to this article, some content is adapted -from Louie Dinh's Python tutorial on this site, and the [JS -Tutorial](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) -on the Mozilla Developer Network. -- cgit v1.2.3 From 958ba0d69e9c4ac21a39d37b61f7dea1b5a155de Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Thu, 13 Nov 2014 12:28:49 +0300 Subject: Remove comments with english + fix some typo --- ru-ru/javascript-ru.html.markdown | 235 +++++++------------------------------- 1 file changed, 44 insertions(+), 191 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index 1f0cfb3f..abbafc8d 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -4,7 +4,7 @@ contributors: - ["Adam Brenecki", "http://adam.brenecki.id.au"] - ["Ariel Krakowski", "http://www.learneroo.com"] translators: - - ["--mynamehere--", "http://github.com/--mynamehere--"] + - ["Maxim Koretskiy", "http://github.com/maximkoretskiy"] filename: javascript-ru.js lang: ru-ru --- @@ -13,47 +13,30 @@ todo: привести все названия языка к коректном Javascript был разработан Бренданом Айком из Netcape в 1995. Изначально предполагалось, что он станет простым вариантом скриптового языка для сайтов, -дополняющий к Java, который в свою очередь использовался бы для более сложных +дополняющий к Java, который бы в свою очередь использовался для более сложных web-приложений. Но тонкая интегрированность javascript с web-страницей и встроенная поддержка в браузерах привели к тому, чтобы он стал более -распространен в web-разработке, чем Java. -JavaScript was created by Netscape's Brendan Eich in 1995. It was originally -intended as a simpler scripting language for websites, complementing the use of -Java for more complex web applications, but its tight integration with Web pages -and built-in support in browsers has caused it to become far more common than -Java in web frontends. - -Использование Javascript не ограничивается браузерами. Проект Node.js, +распространен в frontend-разработке, чем Java. + +Использование JavaScript не ограничивается браузерами. Проект Node.js, предоставляющий независимую среду выполнения на движке Google Chrome V8 JavaScript, становится все более популярным. -JavaScript isn't just limited to web browsers, though: Node.js, a project that -provides a standalone runtime for Google Chrome's V8 JavaScript engine, is -becoming more and more popular. Обратная связь важна и нужна! Вы можете написаться мне -на [@_remedy]() или -[mymail](). -Feedback would be highly appreciated! You can reach me at -[@adambrenecki](https://twitter.com/adambrenecki), or +на [@adambrenecki](https://twitter.com/adambrenecki) или [adam@brenecki.id.au](mailto:adam@brenecki.id.au). ```js // Комментарии оформляются как в C. -// Обнострочнные комментарии начинаются с двух слешей, -// Comments are like C. Single-line comments start with two slashes, +// Однострочнные коментарии начинаются с двух слешей, /* а многострочные с слеша и звездочки и заканчиваются звездочеий и слешом */ -/* and multiline comments start with slash-star - and end with star-slash */ // Выражения разделяются с помощью ; -// Statements can be terminated by ; doStuff(); -// ... но этого можно и делать, разделители подставляются автоматически +// ... но этого можно и не делать, разделители подставляются автоматически // после перехода на новую строку за исключением особых случаев -// ... but they don't have to be, as semicolons are automatically inserted -// wherever there's a newline, except in certain cases. doStuff() // Это может приводить к непредсказуемому результату и поэтому мы будем @@ -65,50 +48,41 @@ doStuff() // 1. Числа, Строки и Операторы // 1. Numbers, Strings and Operators -// В Javasript всего 1 числовой тип - 64-битное число с плавающей точкой стандарта -// IEEE 754) -// todo: сформулировать -// JavaScript has one number type (which is a 64-bit IEEE 754 double). -// Doubles have a 52-bit mantissa, which is enough to store integers -// up to about 9✕10¹⁵ precisely. +// В Javasript всего 1 числовой тип - 64-битное число с плавающей точкой +// стандарта IEEE 754) +// Числа имеют 52-битную мантиссу, чего достаточно для хранения хранения целых +// чисел до 9✕10¹⁵ приблизительно. 3; // = 3 1.5; // = 1.5 // В основном базовая арифметика работает предсказуемо -// Some basic arithmetic works as you'd expect. 1 + 1; // = 2 .1 + .2; // = 0.30000000000000004 8 - 1; // = 7 10 * 2; // = 20 35 / 5; // = 7 -// Включая нецелочисленное деление (todo:уточнить!) -// Including uneven division. +// Включая нецелочисленное деление 5 / 2; // = 2.5 // Двоичные операции тоже есть. Если применить двоичную операцию к float-числу, // оно будет приведено к 32-битному целому со знаком. -// Bitwise operations also work; when you perform a bitwise operation your float -// is converted to a signed int *up to* 32 bits. 1 << 2; // = 4 // (todo:перевести) -// Precedence is enforced with parentheses. +// Приоритет выполнения операций можно менять с помощью скобок. (1 + 3) * 2; // = 8 // Есть три особых не реальных числовых значения: -// There are three special not-a-real-number values: Infinity; // допустим, результат операции 1/0 -Infinity; // допустим, результат операции -1/0 NaN; // допустим, результат операции 0/0 // Так же есть тип булевых данных. -// There's also a boolean type. true; false; // Строки создаются с помощью ' или ". -// Strings are created with ' or ". 'abc'; "Hello, world"; @@ -137,7 +111,6 @@ false; "a" < "b"; // = true // Приведение типов выполняется при сравнении с ==... -// Type coercion is performed for comparisons with double equals... "5" == 5; // = true null == undefined; // = true @@ -146,29 +119,23 @@ null == undefined; // = true null === undefined; // = false // Для доступа к конкретному символу строки используйте charAt -// You can access characters in a string with charAt "This is a string".charAt(0); // = 'T' // ... или используйте substring для получения подстроки -// ...or use substring to get larger pieces "Hello world".substring(0, 5); // = "Hello" // length(длина) - свойство, не используйте () -// length is a property, so don't use () "Hello".length; // = 5 // Есть null и undefined -// There's also null and undefined null; // используется что бы указать явно, что значения нет undefined; // испрользуется чтобы показать, что значения не было установлено // собственно, undefined так и переводится // false, null, undefined, NaN, 0 и "" являются falsy-значениями(при приведении // в булеву типу становятся false) -// false, null, undefined, NaN, 0 and "" are falsy; everything else is truthy. -// Обратите внимание что 0 приводится к false, а "0" к true, не смотря на то, -// что "0"==0 -// Note that 0 is falsy and "0" is truthy, even though 0 == "0". +// Обратите внимание что 0 приводится к false, а "0" к true, +// не смотря на то, что "0"==0 /////////////////////////////////// // 2. Переменные, массивы и объекты @@ -176,25 +143,18 @@ undefined; // испрользуется чтобы показать, что з // Переменные объявляются ключевым словом var. Javascript динамически // типизируемый, так что указывать тип не нужно. // Присвоение значения описывается с помощью оператора = -// Variables are declared with the var keyword. JavaScript is dynamically typed, -// so you don't need to specify type. Assignment uses a single = character. var someVar = 5; // если не указать ключевого слова var, ошибки не будет... -// if you leave the var keyword off, you won't get an error... someOtherVar = 10; // ...но переменная будет создана в глобальном контексте, в не области // видимости, в которой она была объявлена. -// ...but your variable will be created in the global scope, not in the scope -// you defined it in. // Переменные объявленные без присвоения значения, содержать undefined -// Variables declared without being assigned to are set to undefined. var someThirdVar; // = undefined -// Для математических операций над числами есть короткая запись: -// There's shorthand for performing math operations on variables: +// Для математических операций над переменными есть короткая запись: someVar += 5; // тоже что someVar = someVar + 5; someVar равно 10 теперь someVar *= 10; // а теперь -- 100 @@ -203,71 +163,55 @@ someVar++; // теперь someVar равно 101 someVar--; // обратно к 100 // Массивы -- упорядоченные списки значений любых типов. -// Arrays are ordered lists of values, of any type. var myArray = ["Hello", 45, true]; // Для доступу к элементам массивов используйте квадратные скобки. // Индексы массивов начинаются с 0 -// Their members can be accessed using the square-brackets subscript syntax. -// Array indices start at zero. myArray[1]; // = 45 // Массивы мутабельны(изменяемы) и имеют переменную длину. -// Arrays are mutable and of variable length. myArray.push("World"); // добавить элемент myArray.length; // = 4 // Добавить или изменить значение по конкретному индексу myArray[3] = "Hello"; -// Объёкты javascript похожи на dictionary или map из других языков +// Объекты javascript похожи на dictionary или map из других языков // программирования. Это неупорядочнные коллекции пар ключ-значение. -// JavaScript's objects are equivalent to 'dictionaries' or 'maps' in other -// languages: an unordered collection of key-value pairs. var myObj = {key1: "Hello", key2: "World"}; // Ключи -- это строки, но кавычки не требуются если названия явлюятся // корректными javascript идентификаторами. Значения могут быть любого типа. -// Keys are strings, but quotes aren't required if they're a valid -// JavaScript identifier. Values can be any type. var myObj = {myKey: "myValue", "my other key": 4}; // Доступ к атрибту объекта можно получить с помощью квадратных скобок -// Object attributes can also be accessed using the subscript syntax, myObj["my other key"]; // = 4 // ... или используя точечную нотацию, при условии что ключ является // корректным идентификатором. -// ... or using the dot syntax, provided the key is a valid identifier. myObj.myKey; // = "myValue" // Объекты мутабельны. В существуюещем объекте можно изменить значние // или добавить новый атрибут. -// Objects are mutable; values can be changed and new keys added. myObj.myThirdKey = true; // При попытке доступа к атрибуту, который до этого не был создан, будет // возвращен undefined -// If you try to access a value that's not yet set, you'll get undefined. myObj.myFourthKey; // = undefined /////////////////////////////////// -// 3. Логика и управляющие структуры -// 3. Logic and Control Structures +// 3. Логика и Управляющие структуры -// // Синтаксис управляющих структур очень похож на его реализацию в Java. -// The syntax for this section is almost identical to Java's. // if работает так как вы ожидаете. -// The if structure works as you'd expect. var count = 1; if (count == 3){ // выполнится, если значение count равно 3 } else if (count == 4){ // выполнится, если значение count равно 4 } else { - // выполнится, если значение countне будет равно ни 3 ни 4 + // выполнится, если значение count не будет равно ни 3 ни 4 } // Поведение while тоже вполне предсказуемо @@ -282,36 +226,27 @@ do { input = getInput(); } while (!isValid(input)) -// Цикл for такой же как в C b Java: +// Цикл for такой же как в C и Java: // инициализация; условие продолжения; итерация -// the for loop is the same as C and Java: -// initialisation; continue condition; iteration. for (var i = 0; i < 5; i++){ // выполнится 5 раз - // will run 5 times } // && - логическое и, || - логическое или -// && is logical and, || is logical or if (house.size == "big" && house.color == "blue"){ house.contains = "bear"; } if (color == "red" || color == "blue"){ // если цвет или красный или синий - // colour is either red or blue } // && и || удобны для установки значений по умолчанию. // && and || "short circuit", which is useful for setting default values. var name = otherName || "default"; - -// выражение switch проверяет равество с помощью === -// используйте 'break' после каждого case +// выражение switch проверяет равество с помощью === +// используйте 'break' после каждого case, // иначе помимо правильного case выполнятся и все последующие. -// switch statement checks for equality with === -// use 'break' after each case -// or the cases after the correct one will be executed too. grade = '4'; // оценка switch (grade) { case '5': @@ -331,10 +266,8 @@ switch (grade) { /////////////////////////////////// // 4. Функции, Область видимости и Замыкания -// 4. Functions, Scope and Closures // Функции в JavaScript объявляются с помощью ключевого слова function. -// JavaScript functions are declared with the function keyword. function myFunction(thing){ return thing.toUpperCase(); // приведение к верхнему регистру } @@ -343,7 +276,7 @@ myFunction("foo"); // = "FOO" // Помните, что значение, которое должно быть возкращено должно начинаться // на той же строке, где расположено ключевое слово 'return'. В противном случае // будет возвращено undefined. Такое поведения объясняется автоматической -// вставкой разделителей ';'. Оглядывйтесь на этот факт, если используете +// вставкой разделителей ';'. Помните этот факт, если используете // BSD стиль оформления кода. // Note that the value to be returned must start on the same line as the // 'return' keyword, otherwise you'll always return 'undefined' due to @@ -360,94 +293,66 @@ myFunction(); // = undefined // Функции в JavaScript являются объектами, поэтому их можно назначить в // переменные с разными названиями и передавать в другие функции, как аргументы, // на пример, при указании обработчика события. -// JavaScript functions are first class objects, so they can be reassigned to -// different variable names and passed to other functions as arguments - for -// example, when supplying an event handler: function myFunction(){ // этот фрагмент кода будет вызван через 5 секунд - // this code will be called in 5 seconds' time } setTimeout(myFunction, 5000); // Обратите внимание, что setTimeout не является частью языка, однако он // доступен в API браузеров и Node.js. -// Note: setTimeout isn't part of the JS language, but is provided by browsers -// and Node.js. // Объект функции на самом деле не обязательно объявлять с именем - можно // создать анонимную функцию прямо в аргументах другой функции. -// Function objects don't even have to be declared with a name - you can write -// an anonymous function definition directly into the arguments of another. setTimeout(function(){ // этот фрагмент кода будет вызван через 5 секунд - // this code will be called in 5 seconds' time }, 5000); // В JavaScript есть области видимости. У функций есть собственные области // видимости, у других блоков их нет. -// JavaScript has function scope; functions get their own scope but other blocks -// do not. if (true){ var i = 5; } -i; // = 5, а не undefined, как это было бы ожидаемо(todo: поправить) - // в языке, создающем области видисти для блоков " +i; // = 5, а не undefined, как это было бы в языке, создающем + // области видисти для блоков кода // Это привело к появлению паттерна общего назначения "immediately-executing // anonymous functions" (сразу выполняющиеся анонимные функции), который // позволяет предотвратить запись временных переменных в общую облать видимости. -// This has led to a common pattern of "immediately-executing anonymous -// functions", which prevent temporary variables from leaking into the global -// scope. (function(){ var temporary = 5; // Для доступа к глобальной области видимости можно использовать запись в // некоторый 'глобальный объект', для браузеров это 'window'. Глобальный // объект может называться по-разному в небраузерных средах, таких Node.js. - // We can access the global scope by assiging to the 'global object', which - // in a web browser is always 'window'. The global object may have a - // different name in non-browser environments such as Node.js. window.permanent = 10; })(); temporary; // вызывает исключение ReferenceError permanent; // = 10 // Одной из сильных сторон JavaScript являются замыкания. Если функция -// объявлена в вниутри другой функции, внутренняя функция имеет доступ ко всем +// объявлена в внутри другой функции, внутренняя функция имеет доступ ко всем // переменным внешней функции, даже после того, как внешняя функции завершила -// свое выполнение -// One of JavaScript's most powerful features is closures. If a function is -// defined inside another function, the inner function has access to all the -// outer function's variables, even after the outer function exits. +// свое выполнение. function sayHelloInFiveSeconds(name){ var prompt = "Привет, " + name + "!"; - // Внутренние фунции помещаются в локальную область видимости, как-будто они - // объявлены с ключевым словом 'var'. - // Inner functions are put in the local scope by default, as if they were - // declared with 'var'. + // Внутренние функции помещаются в локальную область видимости, как-будто + // они объявлены с ключевым словом 'var'. function inner(){ alert(prompt); } setTimeout(inner, 5000); // setTimeout является асинхроннной, и поэтому функция sayHelloInFiveSeconds // завершит свое выполнение сразу и setTimeout вызовет inner позже. - // Однако, так как inner "замкнута"(todo: уточнить "закрыта внутри") + // Однако, так как inner "закрыта внутри" или "замкнута в" // sayHelloInFiveSeconds, inner все еще будет иметь доступ к переменной // prompt, когда будет вызвана. - // setTimeout is asynchronous, so the sayHelloInFiveSeconds function will - // exit immediately, and setTimeout will call inner afterwards. However, - // because inner is "closed over" sayHelloInFiveSeconds, inner still has - // access to the 'prompt' variable when it is finally called. } sayHelloInFiveSeconds("Вася"); // откроет модальное окно с сообщением // "Привет, Вася" по истечении 5 секунд. /////////////////////////////////// -// 5. Немного об Объектах. Конструкторы и Прототипы -// 5. More about Objects; Constructors and Prototypes +// 5. Немного еще об Объектах. Конструкторы и Прототипы -// Объекты погут содержать функции -// Objects can contain functions. +// Объекты могут содержать функции var myObj = { myFunc: function(){ return "Hello world!"; @@ -456,9 +361,7 @@ var myObj = { myObj.myFunc(); // = "Hello world!" // Когда функции прикрепленные к объекту вызываются, они могут получить доступ -// к данным объекта, ипользую ключевое слово this. -// When functions attached to an object are called, they can access the object -// they're attached to using the this keyword. +// к данным объекта, ипользуя ключевое слово this. myObj = { myString: "Hello world!", myFunc: function(){ @@ -470,16 +373,11 @@ myObj.myFunc(); // = "Hello world!" // Содержание this определяется исходя из того, как была вызвана функция, а // не места её определения. По этой причине наша функция не будет работать вне // контекста объекта. -// What this is set to has to do with how the function is called, not where -// it's defined. So, our function doesn't work if it isn't called in the -// context of the object. var myFunc = myObj.myFunc; myFunc(); // = undefined // И напротив, функция может быть присвоена объекту и получить доступ к нему // через this, даже если она не была прикреплена к объекту в момент её создания. -// Inversely, a function can be assigned to the object and gain access to it -// through this, even if it wasn't attached when it was defined. var myOtherFunc = function(){ return this.myString.toUpperCase(); } @@ -487,23 +385,17 @@ myObj.myOtherFunc = myOtherFunc; myObj.myOtherFunc(); // = "HELLO WORLD!" // Также можно указать контекс выполнения фунции с помощью 'call' или 'apply'. -// We can also specify a context for a function to execute in when we invoke it -// using 'call' or 'apply'. - var anotherFunc = function(s){ return this.myString + s; } anotherFunc.call(myObj, " And Hello Moon!"); // = "Hello World! And Hello Moon!" // Функция 'apply' очень похожа, но принимает массив со списком аргументов. -// The 'apply' function is nearly identical, but takes an array for an argument list. anotherFunc.apply(myObj, [" And Hello Sun!"]); // = "Hello World! And Hello Sun!" // Это может быть удобно, когда работаешь с фунцией принимающей на вход // последовательность аргументов и нужно передать их в виде массива. -// This is useful when working with a function that accepts a sequence of arguments -// and you want to pass an array. Math.min(42, 6, 27); // = 6 Math.min([42, 6, 27]); // = NaN (uh-oh!) @@ -511,15 +403,12 @@ Math.min.apply(Math, [42, 6, 27]); // = 6 // Однако, 'call' и 'apply' не имеют постоянного эффекта. Если вы хотите // зафиксировать контекст для функции, используйте bind. -// But, 'call' and 'apply' are only temporary. When we want it to stick, we can use -// bind. var boundFunc = anotherFunc.bind(myObj); boundFunc(" And Hello Saturn!"); // = "Hello World! And Hello Saturn!" -// bind можно использовать чтобы частично передать аргументы в +// bind также можно использовать чтобы частично передать аргументы в // функцию (каррировать). -// Bind can also be used to partially apply (curry) a function. var product = function(a, b){ return a * b; } var doubler = product.bind(this, 2); @@ -528,9 +417,6 @@ doubler(8); // = 16 // Когда функция вызывается с ключевым словом new, создается новый объект. // Данный объект становится доступным функции через ключевое слово this. // Функции спроектированные вызываться таким способом называются конструкторами. -// When you call a function with the new keyword, a new object is created, and -// made available to the function via the this keyword. Functions designed to be -// called like that are called constructors. var MyConstructor = function(){ this.myNumber = 5; @@ -538,20 +424,14 @@ var MyConstructor = function(){ myNewObj = new MyConstructor(); // = {myNumber: 5} myNewObj.myNumber; // = 5 -// Любой объект в JavaScript имеет 'прототип'. Когда выпытаетесь получить доступ -// к свойству не объявленному в данном объекте, интерпретатор будет искать его -// в прототипе. -// Every JavaScript object has a 'prototype'. When you go to access a property -// on an object that doesn't exist on the actual object, the interpreter will -// look at its prototype. +// Любой объект в JavaScript имеет 'прототип'. Когда вы пытаетесь получить +// доступ к свойству не объявленному в данном объекте, интерпретатор будет +// искать его в прототипе. // Некоторые реализации JS позволяют получить доступ к прототипу с помощью -// волшебного свойства __proto__. До момента пока оно не являются стандартным, +// "волшебного" свойства __proto__. До момента пока оно не являются стандартным, // __proto__ полезно лишь для изучения прототипов в JavaScript. Мы разберемся // со стандартными способами работы с прототипом несколько позже. -// Some JS implementations let you access an object's prototype on the magic -// property __proto__. While this is useful for explaining prototypes it's not -// part of the standard; we'll get to standard ways of using prototypes later. var myObj = { myString: "Hello world!" }; @@ -566,10 +446,8 @@ myObj.__proto__ = myPrototype; myObj.meaningOfLife; // = 42 myObj.myFunc(); // = "hello world!" -// Естествно, если в свойства нет в прототипе, поиск будет продолжен в прототипе -// прототипа и так далее. -// Of course, if your property isn't on your prototype, the prototype's -// prototype is searched, and so on. +// Естественно, если в свойства нет в прототипе, поиск будет продолжен в +// прототипе прототипа и так далее. myPrototype.__proto__ = { myBoolean: true }; @@ -577,34 +455,22 @@ myObj.myBoolean; // = true // Ничего не копируется, каждый объект хранит ссылку на свой прототип. Если // изменить прототип, все изменения отразятся во всех его потомках. -// There's no copying involved here; each object stores a reference to its -// prototype. This means we can alter the prototype and our changes will be -// reflected everywhere. myPrototype.meaningOfLife = 43; myObj.meaningOfLife; // = 43 // Как было сказано выше, __proto__ не является стандартом, и нет стандартного // способа изменить прототип у созданного объекта. Однако, есть два способа // создать объект с заданным прототипом. -// We mentioned that __proto__ was non-standard, and there's no standard way to -// change the prototype of an existing object. However, there are two ways to -// create a new object with a given prototype. // Первый способ - Object.create, был добавлен в JS относительно недавно, и // потому не доступен в более ранних реализациях языка. -// The first is Object.create, which is a recent addition to JS, and therefore -// not available in all implementations yet. var myObj = Object.create(myPrototype); myObj.meaningOfLife; // = 43 // Второй вариан доступен везде и связан с конструкторами. Конструкторы имеют -// свойство prototype. Это воовсе не прототип функции конструктора, напротив, +// свойство prototype. Это вовсе не прототип функции конструктора, напротив, // это прототип, который присваевается новым объектам, созданным с этим // конструктором с помощью ключевого слова new. -// The second way, which works anywhere, has to do with constructors. -// Constructors have a property called prototype. This is *not* the prototype of -// the constructor function itself; instead, it's the prototype that new objects -// are given when they're created with that constructor and the new keyword. MyConstructor.prototype = { myNumber: 5, getMyNumber: function(){ @@ -618,53 +484,40 @@ myNewObj2.getMyNumber(); // = 6 // У встроенных типов таких, как строки и числа, тоже есть конструкторы, // создающие эквивалентные объекты-обертки. -// Built-in types like strings and numbers also have constructors that create -// equivalent wrapper objects. var myNumber = 12; var myNumberObj = new Number(12); myNumber == myNumberObj; // = true // Правда, они не совсем эквивалентны. -// Except, they aren't exactly equivalent. typeof myNumber; // = 'number' typeof myNumberObj; // = 'object' myNumber === myNumberObj; // = false if (0){ // Этот фрагмент кода не будет выпонен, так как 0 приводится к false - // This code won't execute, because 0 is falsy. } if (Number(0)){ // Этот фрагмент кода *будет* выпонен, так как Number(0) приводится к true. - // This code *will* execute, because Number(0) is truthy. } // Однако, оберточные объекты и обычные встроенные типы имеют общие прототипы, // следовательно вы можете расширить функциональность строки, например. -// However, the wrapper objects and the regular builtins share a prototype, so -// you can actually add functionality to a string, for instance. String.prototype.firstCharacter = function(){ return this.charAt(0); } "abc".firstCharacter(); // = "a" // Этот факт часто используется для создания полифилов(polyfill) - реализации -// новых возможностей JS в его болле старых версиях для того чтобы их можно было +// новых возможностей JS в его более старых версиях для того чтобы их можно было // использовать в устаревших браузерах. -// This fact is often used in "polyfilling", which is implementing newer -// features of JavaScript in an older subset of JavaScript, so that they can be -// used in older environments such as outdated browsers. // Например, мы упомянули, что Object.create не доступен во всех версиях // JavaScript, но мы можем создать полифилл. -// For instance, we mentioned that Object.create isn't yet available in all -// implementations, but we can still use it with this polyfill: -if (Object.create === undefined){ // не переопределяем если есть +if (Object.create === undefined){ // не переопределяем, если есть Object.create = function(proto){ // создаем временный конструктор с заданным прототипом var Constructor = function(){}; Constructor.prototype = proto; // создаём новый объект с правильным прототипом - // then use it to create a new, appropriately-prototyped object return new Constructor(); } } -- cgit v1.2.3 From c689f9f8218dfa95fe655364301326f8dbd369b7 Mon Sep 17 00:00:00 2001 From: Maksim Koretskiy Date: Thu, 13 Nov 2014 12:34:19 +0300 Subject: Remove todos --- ru-ru/javascript-ru.html.markdown | 2 -- 1 file changed, 2 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index abbafc8d..ad66b501 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -9,8 +9,6 @@ filename: javascript-ru.js lang: ru-ru --- -todo: привести все названия языка к коректному написанию - Javascript был разработан Бренданом Айком из Netcape в 1995. Изначально предполагалось, что он станет простым вариантом скриптового языка для сайтов, дополняющий к Java, который бы в свою очередь использовался для более сложных -- cgit v1.2.3 From 337fb88da9b5e4009c95c818cef0610da0d841db Mon Sep 17 00:00:00 2001 From: CoolDark Date: Sat, 15 Nov 2014 22:12:40 +0300 Subject: Update --- ru-ru/lua-ru.html.markdown | 51 ++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 3fd478ef..c7d6a121 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -45,7 +45,7 @@ end if num > 40 then print('больше 40') elseif s ~= 'walternate' then -- ~= обозначает "не равно". - -- Проверка равенства это == как в Python; ok для строк. + -- Проверка равенства это == как в Python; работает для строк. io.write('не больше 40\n') -- По умолчанию стандартный вывод. else -- По умолчанию переменные являются глобальными. @@ -54,7 +54,7 @@ else -- Как сделать локальную переменную: local line = io.read() -- Считывает введённую строку. - -- Конкатенация строк использует .. оператор: + -- Для конкатенации строк используется оператор .. : print('Зима пришла, ' .. line) end @@ -133,10 +133,10 @@ f = function (x) return x * x end -- Эти тоже: local function g(x) return math.sin(x) end local g = function(x) return math.sin(x) end --- Equivalent to local function g(x)..., except referring to g in the function --- body won't work as expected. +-- Эквивалентно для local function g(x)..., кроме ссылки на g в теле функции +-- не будет работать как ожидалось. local g; g = function (x) return math.sin(x) end --- the 'local g' decl makes g-self-references ok. +-- 'local g' будет прототипом функции. -- Trig funcs work in radians, by the way. @@ -151,32 +151,34 @@ print {} -- Тоже сработает. -------------------------------------------------------------------------------- -- Таблицы = структура данных, свойственная только для Lua; это ассоциативные массивы. --- Similar to php arrays or js objects, they are hash-lookup dicts that can --- also be used as lists. +-- Похоже на массивы в PHP или объекты в JS +-- Так же может использоваться как список. --- Using tables as dictionaries / maps: --- Dict literals have string keys by default: +-- Использование словарей: + +-- Литералы имеют ключ по умолчанию: t = {key1 = 'value1', key2 = false} --- String keys can use js-like dot notation: +-- Строковые ключи выглядят как точечная нотация в JS: print(t.key1) -- Печатает 'value1'. t.newKey = {} -- Добавляет новую пару ключ-значение. t.key2 = nil -- Удаляет key2 из таблицы. --- Literal notation for any (non-nil) value as key: +-- Литеральная нотация для любого (не пустой) значения ключа: u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'} print(u[6.28]) -- пишет "tau" --- Key matching is basically by value for numbers and strings, but by identity --- for tables. +-- Ключ соответствует нужен не только для значения чисел и строк, но и для +-- идентификации таблиц. a = u['@!#'] -- Теперь a = 'qbert'. -b = u[{}] -- We might expect 1729, but it's nil: --- b = nil since the lookup fails. It fails because the key we used is not the --- same object as the one used to store the original value. So strings & --- numbers are more portable keys. +b = u[{}] -- Мы ожидали 1729, но получили nil: +-- b = nil вышла неудача. Потому что за ключ мы использовали +-- не тот же объект, который использовали в оригинальном значении. +-- Поэтому строки и числа больше подходят под ключ. --- A one-table-param function call needs no parens: +-- Вызов фукцнии с одной таблицей в качестве аргумента +-- не нуждается в кавычках: function h(x) print(x.key1) end h{key1 = 'Sonmi~451'} -- Печатает 'Sonmi~451'. @@ -187,15 +189,16 @@ end -- _G - это таблица со всеми глобалями. print(_G['_G'] == _G) -- Печатает 'true'. --- Using tables as lists / arrays: +-- Использование таблиц как списков / массивов: --- List literals implicitly set up int keys: +-- Список значений с неявно заданными целочисленными ключами: v = {'value1', 'value2', 1.21, 'gigawatts'} -for i = 1, #v do -- #v is the size of v for lists. - print(v[i]) -- Indices start at 1 !! SO CRAZY! +for i = 1, #v do -- #v это размер списка v. + print(v[i]) -- Начинается с ОДНОГО! end --- A 'list' is not a real type. v is just a table with consecutive integer --- keys, treated as a list. + +-- Список это таблица. v Это таблица с последовательными целочисленными +-- ключами, созданными в списке. -------------------------------------------------------------------------------- -- 3.1 Мета-таблицы и мета-методы. -- cgit v1.2.3 From 423d6373820896083160686cc9ced1cf842b6daa Mon Sep 17 00:00:00 2001 From: CoolDark Date: Sun, 16 Nov 2014 11:27:29 +0300 Subject: Translate 3 part --- ru-ru/lua-ru.html.markdown | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index c7d6a121..6ff6ddd7 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -138,7 +138,7 @@ local g = function(x) return math.sin(x) end local g; g = function (x) return math.sin(x) end -- 'local g' будет прототипом функции. --- Trig funcs work in radians, by the way. +-- Так же тригонометрические функции работсют с радианами. -- Вызов функции с одним текстовым параметром не требует круглых скобок: print 'hello' -- Работает без ошибок. @@ -204,10 +204,10 @@ end -- 3.1 Мета-таблицы и мета-методы. -------------------------------------------------------------------------------- --- A table can have a metatable that gives the table operator-overloadish --- behavior. Later we'll see how metatables support js-prototypey behavior. - -f1 = {a = 1, b = 2} -- Represents the fraction a/b. +-- Таблицы могут быть метатаблицами, что дает им поведение +-- перегрузки-оператора. Позже мы увидим, что метатаблицы поддерживают поведение +-- js-прототипов. +f1 = {a = 1, b = 2} -- Представляет фракцию a/b. f2 = {a = 2, b = 3} -- Это не сработает: @@ -226,29 +226,29 @@ setmetatable(f2, metafraction) s = f1 + f2 -- вызывает __add(f1, f2) на мета-таблице f1 --- f1, f2 have no key for their metatable, unlike prototypes in js, so you must --- retrieve it as in getmetatable(f1). The metatable is a normal table with --- keys that Lua knows about, like __add. +-- f1, f2 не имеют ключей для своих метатаблиц в отличии от прототипов в js, поэтому +-- ты можешь извлечь данные через getmetatable(f1). Метатаблицы это обычные таблицы с +-- ключем, который в Lua известен как __add. --- But the next line fails since s has no metatable: +-- Но следущая строка будет ошибочной т.к s не мета-таблица: -- t = s + s --- Class-like patterns given below would fix this. +-- Шаблоны классов приведенные ниже смогут это исправить. --- An __index on a metatable overloads dot lookups: +-- __index перегружет в мета-таблице просмотр через точку: defaultFavs = {animal = 'gru', food = 'donuts'} myFavs = {food = 'pizza'} setmetatable(myFavs, {__index = defaultFavs}) eatenBy = myFavs.animal -- работает! спасибо, мета-таблица. -------------------------------------------------------------------------------- --- Direct table lookups that fail will retry using the metatable's __index --- value, and this recurses. +-- Прямой табличный поиск не будет пытаться передавать с помощью __index +-- значения, и её рекурсии. --- An __index value can also be a function(tbl, key) for more customized --- lookups. +-- __index значения так же могут быть function(tbl, key) для настроенного +-- просмотра. --- Values of __index,add, .. are called metamethods. --- Full list. Here a is a table with the metamethod. +-- Значения типа __index,add, ... называются метаметодами. +-- Полный список. Здесь таблицы с метаметодами. -- __add(a, b) для a + b -- __sub(a, b) для a - b -- cgit v1.2.3 From a281e7d0ffa57e0ee11b5980adc41a58b10c50a0 Mon Sep 17 00:00:00 2001 From: CoolDark Date: Sun, 16 Nov 2014 12:48:02 +0300 Subject: Full --- ru-ru/lua-ru.html.markdown | 134 ++++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 6ff6ddd7..7b0946e3 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -267,13 +267,14 @@ eatenBy = myFavs.animal -- работает! спасибо, мета-табл -- __call(a, ...) для a(...) -------------------------------------------------------------------------------- --- 3.2 Class-like tables and inheritance. +-- 3.2 Классы и наследования. -------------------------------------------------------------------------------- --- Classes aren't built in; there are different ways to make them using --- tables and metatables. +-- В Lua нет поддержки классов на уровне языка; +-- Однако существуют разные способы их создания с помощью +-- таблиц и метатаблиц. --- Explanation for this example is below it. +-- Пример классам находится ниже. Dog = {} -- 1. @@ -290,23 +291,22 @@ end mrDog = Dog:new() -- 7. mrDog:makeSound() -- 'I say woof' -- 8. --- 1. Dog acts like a class; it's really a table. --- 2. "function tablename:fn(...)" is the same as --- "function tablename.fn(self, ...)", The : just adds a first arg called --- self. Read 7 & 8 below for how self gets its value. --- 3. newObj will be an instance of class Dog. --- 4. "self" is the class being instantiated. Often self = Dog, but inheritance --- can change it. newObj gets self's functions when we set both newObj's --- metatable and self's __index to self. --- 5. Reminder: setmetatable returns its first arg. --- 6. The : works as in 2, but this time we expect self to be an instance --- instead of a class. --- 7. Same as Dog.new(Dog), so self = Dog in new(). --- 8. Same as mrDog.makeSound(mrDog); self = mrDog. - +-- 1. Dog похоже на класс; но это таблица. +-- 2. "function tablename:fn(...)" как и +-- "function tablename.fn(self, ...)", Просто : добавляет первый аргумент +-- перед собой. Читай 7 и 8 чтоб понять как self получает значение. +-- 3. newObj это экземпляр класса Dog. +-- 4. "self" есть класс являющийся экземпляром. Зачастую self = Dog, но экземляр +-- может поменять это. newObj получит свои функции, когда мы установим newObj как +-- метатаблицу и __index на себя. +-- 5. Помни: setmetatable возвращает первый аргумент. +-- 6. ":" Работает в 2 стороны, но в этот раз мы ожидмаем, что self будет экземпляром +-- а не классом. +-- 7. Dog.new(Dog), тоже самое что self = Dog in new(). +-- 8. mrDog.makeSound(mrDog) будет self = mrDog. -------------------------------------------------------------------------------- --- Inheritance example: +-- Пример наследования: LoudDog = Dog:new() -- 1. @@ -319,17 +319,16 @@ seymour = LoudDog:new() -- 3. seymour:makeSound() -- 'woof woof woof' -- 4. -------------------------------------------------------------------------------- --- 1. LoudDog gets Dog's methods and variables. --- 2. self has a 'sound' key from new(), see 3. --- 3. Same as "LoudDog.new(LoudDog)", and converted to "Dog.new(LoudDog)" as --- LoudDog has no 'new' key, but does have "__index = Dog" on its metatable. --- Result: seymour's metatable is LoudDog, and "LoudDog.__index = Dog". So --- seymour.key will equal seymour.key, LoudDog.key, Dog.key, whichever --- table is the first with the given key. --- 4. The 'makeSound' key is found in LoudDog; this is the same as --- "LoudDog.makeSound(seymour)". - --- If needed, a subclass's new() is like the base's: +-- 1. LoudDog получит методы и переменные класса Dog. +-- 2. self будет 'sound' ключ для new(), смотри 3й пункт. +-- 3. Так же как "LoudDog.new(LoudDog)" и переделанный в "Dog.new(LoudDog)" +-- LoudDog не имеет ключ 'new', но может выполнить "__index = Dog" в этой метатаблице +-- Результат: Метатаблица seymour стала LoudDog и "LoudDog.__index = Dog" +-- Так же seymour.key будет равна seymour.key, LoudDog.key, Dog.key, +-- в зависимости от того какая таблица будет с первым ключем. +-- 4. 'makeSound' ключ найден в LoudDog; и выглдяит как "LoudDog.makeSound(seymour)". + +-- При необходимости, подкласс new() будет базовым. function LoudDog:new() local newObj = {} -- set up newObj @@ -342,12 +341,12 @@ end -------------------------------------------------------------------------------- ---[[ I'm commenting out this section so the rest of this script remains --- runnable. +--[[ Я закомментировал этот раздел так как часть скрипта остается +-- работоспособной. ``` ```lua --- Suppose the file mod.lua looks like this: +-- Предположим файл mod.lua будет выглядеть так: local M = {} local function sayMyName() @@ -361,57 +360,55 @@ end return M --- Another file can use mod.lua's functionality: -local mod = require('mod') -- Run the file mod.lua. +-- Иные файлы могут использовать функционал mod.lua: +local mod = require('mod') -- Запустим файл mod.lua. --- require is the standard way to include modules. --- require acts like: (if not cached; see below) +-- require - подключает модули. +-- require выглядит так: (если не кешируется; смотри ниже) local mod = (function () end)() --- It's like mod.lua is a function body, so that locals inside mod.lua are --- invisible outside it. +-- Тело функции mod.lua является локальным, поэтому +-- содержимое не видимо за телом функции. --- This works because mod here = M in mod.lua: -mod.sayHello() -- Says hello to Hrunkner. +-- Это работает так как mod здесь = M в mod.lua: +mod.sayHello() -- Скажет слово Hrunkner. --- This is wrong; sayMyName only exists in mod.lua: -mod.sayMyName() -- error +-- Это будет ошибочным; sayMyName доступен только в mod.lua: +mod.sayMyName() -- ошибка --- require's return values are cached so a file is run at most once, even when --- require'd many times. +-- require возвращает значения кеша файла вызванного не более одного раза, даже когда +-- требуется много раз. --- Suppose mod2.lua contains "print('Hi!')". -local a = require('mod2') -- Prints Hi! -local b = require('mod2') -- Doesn't print; a=b. +-- Предположим mod2.lua содержит "print('Hi!')". +local a = require('mod2') -- Напишет Hi! +local b = require('mod2') -- Не напишет; a=b. --- dofile is like require without caching: +-- dofile работает без кэша: dofile('mod2') --> Hi! -dofile('mod2') --> Hi! (runs again, unlike require) +dofile('mod2') --> Hi! (напишет снова) --- loadfile loads a lua file but doesn't run it yet. -f = loadfile('mod2') -- Calling f() runs mod2.lua. +-- loadfile загружает lua файл, но не запускает его. +f = loadfile('mod2') -- Вызовет f() запустит mod2.lua. --- loadstring is loadfile for strings. -g = loadstring('print(343)') -- Returns a function. -g() -- Prints out 343; nothing printed before now. +-- loadstring это loadfile для строк. +g = loadstring('print(343)') -- Вернет функцию. +g() -- Напишет 343. --]] ``` -## References +## Примечание (от автора) -I was excited to learn Lua so I could make games -with the Love 2D game engine. That's the why. +Я был взволнован, когда узнал что с Lua я могу делать игры при помощи Love 2D game engine. Вот почему. -I started with BlackBulletIV's Lua for programmers. -Next I read the official Programming in Lua book. -That's the how. +Я начинал с BlackBulletIV's Lua for programmers. +Затем я прочитал официальную Документацию по Lua. -It might be helpful to check out the Lua short -reference on lua-users.org. +Так же может быть полезнымLua short +reference на lua-users.org. -The main topics not covered are standard libraries: +Основные темы не охваченные стандартной библиотекой: * string library * table library @@ -419,8 +416,9 @@ The main topics not covered are standard libraries: * io library * os library -By the way, the entire file is valid Lua; save it -as learn.lua and run it with "lua learn.lua" ! +Весь файл написан на Lua; сохрани его как learn.lua и запусти при помощи "lua learn.lua" ! + +Это была моя первая статья для tylerneylon.com, которая так же доступна тут github gist. + +Удачи с Lua! -This was first written for tylerneylon.com, and is -also available as a github gist. Have fun with Lua! -- cgit v1.2.3 From 3c9988a7e437eb4368a22525f49dfb14aaa5f127 Mon Sep 17 00:00:00 2001 From: CoolDark Date: Sun, 16 Nov 2014 12:50:41 +0300 Subject: oops --- ru-ru/lua-ru.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 7b0946e3..50aa5910 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -405,7 +405,7 @@ g() -- Напишет 343. Я начинал с BlackBulletIV's Lua for programmers. Затем я прочитал официальную Документацию по Lua. -Так же может быть полезнымLua short +Так же может быть полезным Lua short reference на lua-users.org. Основные темы не охваченные стандартной библиотекой: -- cgit v1.2.3 From 9e811629c263c3d04ae39a9d69d8b2de8a0bd7f7 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 16 Nov 2014 12:59:08 +0300 Subject: Update lua-ru.html.markdown --- ru-ru/lua-ru.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 50aa5910..7f30edbd 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -6,6 +6,7 @@ contributors: translators: - ["Max Solomonov", "https://vk.com/solomonovmaksim"] - ["Max Truhonin", "https://vk.com/maximmax42"] + - ["Konstantin Gromyko", "https://vk.com/id0x1765d79"] lang: ru-ru --- -- cgit v1.2.3 From dd76dc0c491b080e94c770698ab0dbd913dfe890 Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Sun, 16 Nov 2014 20:02:27 +0700 Subject: Fix some translation mistakes --- ru-ru/lua-ru.html.markdown | 274 ++++++++++++++++++++++----------------------- 1 file changed, 135 insertions(+), 139 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 7f30edbd..b9af61b4 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -5,8 +5,9 @@ contributors: - ["Tyler Neylon", "http://tylerneylon.com/"] translators: - ["Max Solomonov", "https://vk.com/solomonovmaksim"] - - ["Max Truhonin", "https://vk.com/maximmax42"] + - ["Max Truhonin", "https://vk.com/maximmax42"] - ["Konstantin Gromyko", "https://vk.com/id0x1765d79"] + - ["Stanislav Gromov", "https://vk.com/id156354391"] lang: ru-ru --- @@ -21,33 +22,30 @@ lang: ru-ru -- 1. Переменные, циклы и условия. -------------------------------------------------------------------------------- -num = 42 -- Все числа являются типом double. ---[[ - Не волнуйся, 64-битные double имеют 52 бита - для хранения именно целочисленных значений; - точность не является проблемой для - целочисленных значений, занимающих меньше - 52 бит. ---]] +num = 42 -- Все числа имеют тип double. +-- Не волнуйтесь, в 64-битных double 52 бита +-- отведено под хранение целой части числа; +-- точность не является проблемой для +-- целочисленных значений, занимающих меньше 52 бит. -s = 'walternate' -- Неизменные строки как в Python. +s = 'walternate' -- Неизменные строки, как в Python. t = "Двойные кавычки также приветствуются" u = [[ Двойные квадратные скобки начинают и заканчивают многострочные значения.]] -t = nil -- Удаляет определение переменной t; Lua имеет мусорку. +t = nil -- Удаляет определение переменной t; в Lua есть сборка мусора. --- Циклы и условия имеют ключевые слова, такие как do/end: +-- Блоки обозначаются ключевыми слоавми, такими как do/end: while num < 50 do num = num + 1 -- Здесь нет ++ или += операторов. end --- Условие "если": +-- Ветвление "если": if num > 40 then print('больше 40') elseif s ~= 'walternate' then -- ~= обозначает "не равно". -- Проверка равенства это == как в Python; работает для строк. - io.write('не больше 40\n') -- По умолчанию стандартный вывод. + io.write('не больше 40\n') -- По умолчанию вывод в stdout. else -- По умолчанию переменные являются глобальными. thisIsGlobal = 5 -- Стиль CamelСase является общим. @@ -68,11 +66,8 @@ aBoolValue = false -- Только значения nil и false являются ложными; 0 и '' являются истинными! if not aBoolValue then print('это значение ложно') end ---[[ - Для 'or' и 'and' действует принцип "какой оператор дальше, - тот и применяется". Это действует аналогично a?b:c - операторам в C/js: ---]] +-- Для 'or' и 'and' действует принцип "какой оператор дальше, +-- тот и применяется". Это действует аналогично оператору a?b:c в C/js: ans = aBoolValue and 'yes' or 'no' --> 'no' karlSum = 0 @@ -103,8 +98,8 @@ end -- Вложенные и анонимные функции являются нормой: function adder(x) - -- Возращаемая функция создаётся когда adder вызывается, тот в свою очередь - -- запоминает значение переменной x: + -- Возращаемая функция создаётся, когда вызывается функция adder, + -- и запоминает значение переменной x: return function (y) return x + y end end a1 = adder(9) @@ -112,12 +107,11 @@ a2 = adder(36) print(a1(16)) --> 25 print(a2(64)) --> 100 --- Возвраты, вызовы функций и присвоения, вся работа с перечисленным может иметь --- неодинаковое кол-во аргументов/элементов. Неиспользуемые аргументы являются nil и --- отбрасываются на приёме. +-- Возвраты, вызовы функций и присвоения работают со списками, которые могут иметь разную длину. +-- Лишние получатели принимают значение nil, а лишние значения игнорируются. x, y, z = 1, 2, 3, 4 --- Теперь x = 1, y = 2, z = 3, и 4 просто отбрасывается. +-- Теперь x = 1, y = 2, z = 3, а 4 просто отбрасывается. function bar(a, b, c) print(a, b, c) @@ -134,12 +128,12 @@ f = function (x) return x * x end -- Эти тоже: local function g(x) return math.sin(x) end local g = function(x) return math.sin(x) end --- Эквивалентно для local function g(x)..., кроме ссылки на g в теле функции --- не будет работать как ожидалось. +-- Эквивалентно для local function g(x)..., однако ссылки на g +-- в теле функции не будут работать, как ожидалось. local g; g = function (x) return math.sin(x) end -- 'local g' будет прототипом функции. --- Так же тригонометрические функции работсют с радианами. +-- Кстати, тригонометрические функции работают с радианами. -- Вызов функции с одним текстовым параметром не требует круглых скобок: print 'hello' -- Работает без ошибок. @@ -151,9 +145,10 @@ print {} -- Тоже сработает. -- 3. Таблицы. -------------------------------------------------------------------------------- --- Таблицы = структура данных, свойственная только для Lua; это ассоциативные массивы. --- Похоже на массивы в PHP или объекты в JS --- Так же может использоваться как список. +-- Таблица = единственная составная структура данных в Lua; +-- представляет собой ассоциативный массив. +-- Похоже на массивы в PHP или объекты в JS. +-- Также может использоваться, как список. -- Использование словарей: @@ -161,53 +156,54 @@ print {} -- Тоже сработает. -- Литералы имеют ключ по умолчанию: t = {key1 = 'value1', key2 = false} --- Строковые ключи выглядят как точечная нотация в JS: +-- Строковые ключи используются, как в точечной нотации в JS: print(t.key1) -- Печатает 'value1'. -t.newKey = {} -- Добавляет новую пару ключ-значение. +t.newKey = {} -- Добавляет новую пару ключ/значение. t.key2 = nil -- Удаляет key2 из таблицы. --- Литеральная нотация для любого (не пустой) значения ключа: +-- Литеральная нотация для любого значения ключа (кроме nil): u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'} print(u[6.28]) -- пишет "tau" --- Ключ соответствует нужен не только для значения чисел и строк, но и для --- идентификации таблиц. +-- Ключ соответствует значению для чисел и строк, но при +-- использовании таблицы в качестве ключа берётся её экземпляр. a = u['@!#'] -- Теперь a = 'qbert'. -b = u[{}] -- Мы ожидали 1729, но получили nil: --- b = nil вышла неудача. Потому что за ключ мы использовали --- не тот же объект, который использовали в оригинальном значении. --- Поэтому строки и числа больше подходят под ключ. +b = u[{}] -- Вы могли ожидать 1729, но получится nil: +-- b = nil, т.к. ключ не будет найден. +-- Это произойдёт, потому что за ключ мы использовали не тот же самый объект, +-- который использовали для сохранения оригинального значения. +-- Поэтому строки и числа удобнее использовать в качестве ключей. --- Вызов фукцнии с одной таблицей в качестве аргумента +-- Вызов функции с одной таблицей в качестве аргумента -- не нуждается в кавычках: function h(x) print(x.key1) end h{key1 = 'Sonmi~451'} -- Печатает 'Sonmi~451'. -for key, val in pairs(u) do -- Итерация цикла с таблицей. +for key, val in pairs(u) do -- Цикл по таблице. print(key, val) end -- _G - это таблица со всеми глобалями. print(_G['_G'] == _G) -- Печатает 'true'. --- Использование таблиц как списков / массивов: +-- Использование таблиц, как списков / массивов: -- Список значений с неявно заданными целочисленными ключами: v = {'value1', 'value2', 1.21, 'gigawatts'} for i = 1, #v do -- #v это размер списка v. - print(v[i]) -- Начинается с ОДНОГО! + print(v[i]) -- Нумерация начинается с ОДНОГО !! end --- Список это таблица. v Это таблица с последовательными целочисленными --- ключами, созданными в списке. +-- Список не является отдельным типом. v - всего лишь таблица +-- с последовательными целочисленными ключами, воспринимаемая как список. -------------------------------------------------------------------------------- --- 3.1 Мета-таблицы и мета-методы. +-- 3.1 Метатаблицы и метаметоды. -------------------------------------------------------------------------------- --- Таблицы могут быть метатаблицами, что дает им поведение --- перегрузки-оператора. Позже мы увидим, что метатаблицы поддерживают поведение --- js-прототипов. +-- Таблицу можно связать с метатаблицей, задав ей поведение, как при +-- перегрузке операторов. Позже мы увидим, что метатаблицы поддерживают поведение, +-- как в js-прототипах. f1 = {a = 1, b = 2} -- Представляет фракцию a/b. f2 = {a = 2, b = 3} @@ -225,57 +221,57 @@ end setmetatable(f1, metafraction) setmetatable(f2, metafraction) -s = f1 + f2 -- вызывает __add(f1, f2) на мета-таблице f1 +s = f1 + f2 -- вызвать __add(f1, f2) на метатаблице от f1 --- f1, f2 не имеют ключей для своих метатаблиц в отличии от прототипов в js, поэтому --- ты можешь извлечь данные через getmetatable(f1). Метатаблицы это обычные таблицы с --- ключем, который в Lua известен как __add. +-- f1, f2 не имеют ключа для своих метатаблиц в отличии от прототипов в js, поэтому +-- нужно получить его через getmetatable(f1). Метатаблица - обычная таблица +-- с ключами, известными для Lua (например, __add). --- Но следущая строка будет ошибочной т.к s не мета-таблица: +-- Но следущая строка будет ошибочной т.к в s нет метатаблицы: -- t = s + s --- Шаблоны классов приведенные ниже смогут это исправить. +-- Похожий на классы подход, приведенный ниже, поможет это исправить. --- __index перегружет в мета-таблице просмотр через точку: +-- __index перегружет в метатаблице просмотр через точку: defaultFavs = {animal = 'gru', food = 'donuts'} myFavs = {food = 'pizza'} setmetatable(myFavs, {__index = defaultFavs}) eatenBy = myFavs.animal -- работает! спасибо, мета-таблица. -------------------------------------------------------------------------------- --- Прямой табличный поиск не будет пытаться передавать с помощью __index --- значения, и её рекурсии. - --- __index значения так же могут быть function(tbl, key) для настроенного --- просмотра. - --- Значения типа __index,add, ... называются метаметодами. --- Полный список. Здесь таблицы с метаметодами. - --- __add(a, b) для a + b --- __sub(a, b) для a - b --- __mul(a, b) для a * b --- __div(a, b) для a / b --- __mod(a, b) для a % b --- __pow(a, b) для a ^ b --- __unm(a) для -a --- __concat(a, b) для a .. b --- __len(a) для #a --- __eq(a, b) для a == b --- __lt(a, b) для a < b --- __le(a, b) для a <= b --- __index(a, b) для a.b --- __newindex(a, b, c) для a.b = c --- __call(a, ...) для a(...) +-- При неудаче прямой табличный поиск попытается использовать +-- значение __index в метатаблице, причём это рекурсивно. + +-- Значение __index также может быть функцией +-- function(tbl, key) для настраиваемого поиска. + +-- Значения типа __index, __add, ... называются метаметодами. +-- Ниже приведён полный список метаметодов. + +-- __add(a, b) для a + b +-- __sub(a, b) для a - b +-- __mul(a, b) для a * b +-- __div(a, b) для a / b +-- __mod(a, b) для a % b +-- __pow(a, b) для a ^ b +-- __unm(a) для -a +-- __concat(a, b) для a .. b +-- __len(a) для #a +-- __eq(a, b) для a == b +-- __lt(a, b) для a < b +-- __le(a, b) для a <= b +-- __index(a, b) <функция или таблица> для a.b +-- __newindex(a, b, c) для a.b = c +-- __call(a, ...) для a(...) -------------------------------------------------------------------------------- --- 3.2 Классы и наследования. +-- 3.2 Классоподобные таблицы и наследование. -------------------------------------------------------------------------------- --- В Lua нет поддержки классов на уровне языка; --- Однако существуют разные способы их создания с помощью +-- В Lua нет поддержки классов на уровне языка, +-- однако существуют разные способы их создания с помощью -- таблиц и метатаблиц. --- Пример классам находится ниже. +-- Ниже приведён один из таких способов. Dog = {} -- 1. @@ -292,19 +288,19 @@ end mrDog = Dog:new() -- 7. mrDog:makeSound() -- 'I say woof' -- 8. --- 1. Dog похоже на класс; но это таблица. --- 2. "function tablename:fn(...)" как и --- "function tablename.fn(self, ...)", Просто : добавляет первый аргумент --- перед собой. Читай 7 и 8 чтоб понять как self получает значение. --- 3. newObj это экземпляр класса Dog. --- 4. "self" есть класс являющийся экземпляром. Зачастую self = Dog, но экземляр --- может поменять это. newObj получит свои функции, когда мы установим newObj как --- метатаблицу и __index на себя. --- 5. Помни: setmetatable возвращает первый аргумент. --- 6. ":" Работает в 2 стороны, но в этот раз мы ожидмаем, что self будет экземпляром --- а не классом. --- 7. Dog.new(Dog), тоже самое что self = Dog in new(). --- 8. mrDog.makeSound(mrDog) будет self = mrDog. +-- 1. Dog похоже на класс, но на самом деле это таблица. +-- 2. "function tablename:fn(...)" - то же самое, что и +-- "function tablename.fn(self, ...)", просто : добавляет первый аргумент +-- перед собой. См. пункты 7 и 8, чтобы понять, как self получает значение. +-- 3. newObj - это экземпляр класса Dog. +-- 4. "self" - экземпляр класса. Зачастую self = Dog, но с помощью наследования +-- это можно изменить. newObj получит свои функции, когда мы установим +-- метатаблицу для newObj и __index для self на саму себя. +-- 5. Напоминание: setmetatable возвращает первый аргумент. +-- 6. : работает, как в пункте 2, но в этот раз мы ожидмаем, +-- что self будет экземпляром, а не классом. +-- 7. То же самое, что и Dog.new(Dog), поэтому self = Dog в new(). +-- 8. То же самое, что mrDog.makeSound(mrDog); self = mrDog. -------------------------------------------------------------------------------- -- Пример наследования: @@ -321,18 +317,19 @@ seymour:makeSound() -- 'woof woof woof' -- 4. -------------------------------------------------------------------------------- -- 1. LoudDog получит методы и переменные класса Dog. --- 2. self будет 'sound' ключ для new(), смотри 3й пункт. --- 3. Так же как "LoudDog.new(LoudDog)" и переделанный в "Dog.new(LoudDog)" --- LoudDog не имеет ключ 'new', но может выполнить "__index = Dog" в этой метатаблице --- Результат: Метатаблица seymour стала LoudDog и "LoudDog.__index = Dog" --- Так же seymour.key будет равна seymour.key, LoudDog.key, Dog.key, --- в зависимости от того какая таблица будет с первым ключем. +-- 2. В self будет ключ 'sound' из new(), см. пункт 3. +-- 3. То же самое, что и "LoudDog.new(LoudDog)", конвертированное в "Dog.new(LoudDog)", +-- поскольку в LoudDog нет ключа 'new', но в его метатаблице есть "__index = Dog". +-- Результат: Метатаблицей для seymour стала LoudDog и "LoudDog.__index = Dog", +-- поэтому seymour.key будет равно seymour.key, LoudDog.key, Dog.key, +-- в зависимости от того какая таблица будет первой с заданным ключом. -- 4. 'makeSound' ключ найден в LoudDog; и выглдяит как "LoudDog.makeSound(seymour)". --- При необходимости, подкласс new() будет базовым. +-- При необходимости функция new() в подклассе +-- может быть похожа на аналог в базовом классе. function LoudDog:new() local newObj = {} - -- set up newObj + -- установить newObj self.__index = self return setmetatable(newObj, self) end @@ -342,12 +339,12 @@ end -------------------------------------------------------------------------------- ---[[ Я закомментировал этот раздел так как часть скрипта остается +--[[ Я закомментировал этот раздел, чтобы остальная часть скрипта осталась -- работоспособной. ``` ```lua --- Предположим файл mod.lua будет выглядеть так: +-- Предположим, файл mod.lua будет выглядеть так: local M = {} local function sayMyName() @@ -355,44 +352,44 @@ local function sayMyName() end function M.sayHello() - print('Why hello there') + print('Привет, ') sayMyName() end return M --- Иные файлы могут использовать функционал mod.lua: +-- Другой файл может использовать функционал mod.lua: local mod = require('mod') -- Запустим файл mod.lua. --- require - подключает модули. --- require выглядит так: (если не кешируется; смотри ниже) +-- require - стандартный способ подключения модулей. +-- require ведёт себя так: (если не кешировано, см. ниже) local mod = (function () - + <содержимое mod.lua> end)() --- Тело функции mod.lua является локальным, поэтому --- содержимое не видимо за телом функции. +-- Файл mod.lua воспринимается, как тело функции, поэтому +-- все локальные переменные и функции внутри него не видны за его пределами. --- Это работает так как mod здесь = M в mod.lua: -mod.sayHello() -- Скажет слово Hrunkner. +-- Это работает, так как здесь mod = M в mod.lua: +mod.sayHello() -- Выведет "Привет, Hrunkner". --- Это будет ошибочным; sayMyName доступен только в mod.lua: +-- Это будет ошибочным; sayMyName доступна только в mod.lua: mod.sayMyName() -- ошибка --- require возвращает значения кеша файла вызванного не более одного раза, даже когда --- требуется много раз. +-- Значения, возвращаемые require, кэшируются, поэтому содержимое файла +-- выполняется только 1 раз, даже если он подключается с помощью require много раз. --- Предположим mod2.lua содержит "print('Hi!')". -local a = require('mod2') -- Напишет Hi! -local b = require('mod2') -- Не напишет; a=b. +-- Предположим, mod2.lua содержит "print('Hi!')". +local a = require('mod2') -- Выведет "Hi!" +local b = require('mod2') -- Ничего не выведет; a=b. --- dofile работает без кэша: +-- dofile, в отличии от require, работает без кэширования: dofile('mod2') --> Hi! -dofile('mod2') --> Hi! (напишет снова) +dofile('mod2') --> Hi! (запустится снова) --- loadfile загружает lua файл, но не запускает его. -f = loadfile('mod2') -- Вызовет f() запустит mod2.lua. +-- loadfile загружает файл, но не запускает его. +f = loadfile('mod2') -- Вызов f() запустит содержимое mod2.lua. --- loadstring это loadfile для строк. +-- loadstring - это loadfile для строк. g = loadstring('print(343)') -- Вернет функцию. g() -- Напишет 343. @@ -401,25 +398,24 @@ g() -- Напишет 343. ``` ## Примечание (от автора) -Я был взволнован, когда узнал что с Lua я могу делать игры при помощи Love 2D game engine. Вот почему. +Мне было интересно изучить Lua, чтобы делать игры при помощи Love 2D game engine. Я начинал с BlackBulletIV's Lua for programmers. Затем я прочитал официальную Документацию по Lua. -Так же может быть полезным Lua short -reference на lua-users.org. +Так же может быть полезным Краткая справка по Lua на lua-users.org. -Основные темы не охваченные стандартной библиотекой: +Основные темы, не охваченные стандартной библиотекой: -* string library -* table library -* math library -* io library -* os library +* библиотека string +* библиотека table +* библиотека math +* библиотека io +* библиотека os -Весь файл написан на Lua; сохрани его как learn.lua и запусти при помощи "lua learn.lua" ! +Весь файл написан на Lua; сохраните его, как learn.lua, и запустите при помощи "lua learn.lua" ! -Это была моя первая статья для tylerneylon.com, которая так же доступна тут github gist. +Это была моя первая статья для tylerneylon.com, которая также доступна как github gist. Удачи с Lua! -- cgit v1.2.3 From 41633c28aab59a9ddcbfdddbd59f284140142f46 Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Tue, 18 Nov 2014 01:54:01 +0700 Subject: Another portion of fixes --- ru-ru/lua-ru.html.markdown | 58 +++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index b9af61b4..89d0c8d7 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -37,20 +37,20 @@ t = nil -- Удаляет определение переменной t; в Lua -- Блоки обозначаются ключевыми слоавми, такими как do/end: while num < 50 do - num = num + 1 -- Здесь нет ++ или += операторов. + num = num + 1 -- Операторов ++ и += нет. end -- Ветвление "если": if num > 40 then print('больше 40') elseif s ~= 'walternate' then -- ~= обозначает "не равно". - -- Проверка равенства это == как в Python; работает для строк. + -- Проверка равенства это ==, как в Python; работает для строк. io.write('не больше 40\n') -- По умолчанию вывод в stdout. else -- По умолчанию переменные являются глобальными. thisIsGlobal = 5 -- Стиль CamelСase является общим. - -- Как сделать локальную переменную: + -- Как сделать переменную локальной: local line = io.read() -- Считывает введённую строку. -- Для конкатенации строк используется оператор .. : @@ -107,7 +107,8 @@ a2 = adder(36) print(a1(16)) --> 25 print(a2(64)) --> 100 --- Возвраты, вызовы функций и присвоения работают со списками, которые могут иметь разную длину. +-- Возвраты, вызовы функций и присвоения работают со списками, +-- которые могут иметь разную длину. -- Лишние получатели принимают значение nil, а лишние значения игнорируются. x, y, z = 1, 2, 3, 4 @@ -135,10 +136,11 @@ local g; g = function (x) return math.sin(x) end -- Кстати, тригонометрические функции работают с радианами. --- Вызов функции с одним текстовым параметром не требует круглых скобок: +-- Вызов функции с одним строковым параметром не требует круглых скобок: print 'hello' -- Работает без ошибок. --- Вызов функции с одним табличным параметром так же не требуют круглых скобок (про таблицы в след.части): +-- Вызов функции с одним табличным параметром так же +-- не требует круглых скобок (про таблицы в след.части): print {} -- Тоже сработает. -------------------------------------------------------------------------------- @@ -147,8 +149,8 @@ print {} -- Тоже сработает. -- Таблица = единственная составная структура данных в Lua; -- представляет собой ассоциативный массив. --- Похоже на массивы в PHP или объекты в JS. --- Также может использоваться, как список. +-- Подобно массивам в PHP или объектам в JS, они представляют собой +-- хеш-таблицы, которые также можно использовать в качестве списков. -- Использование словарей: @@ -170,12 +172,12 @@ print(u[6.28]) -- пишет "tau" a = u['@!#'] -- Теперь a = 'qbert'. b = u[{}] -- Вы могли ожидать 1729, но получится nil: -- b = nil, т.к. ключ не будет найден. --- Это произойдёт, потому что за ключ мы использовали не тот же самый объект, --- который использовали для сохранения оригинального значения. +-- Это произойдёт потому, что за ключ мы использовали не тот же самый объект, +-- который был использован для сохранения оригинального значения. -- Поэтому строки и числа удобнее использовать в качестве ключей. -- Вызов функции с одной таблицей в качестве аргумента --- не нуждается в кавычках: +-- не требует круглых скобок: function h(x) print(x.key1) end h{key1 = 'Sonmi~451'} -- Печатает 'Sonmi~451'. @@ -190,8 +192,8 @@ print(_G['_G'] == _G) -- Печатает 'true'. -- Список значений с неявно заданными целочисленными ключами: v = {'value1', 'value2', 1.21, 'gigawatts'} -for i = 1, #v do -- #v это размер списка v. - print(v[i]) -- Нумерация начинается с ОДНОГО !! +for i = 1, #v do -- #v - размер списка v. + print(v[i]) -- Нумерация начинается с 1 !! end -- Список не является отдельным типом. v - всего лишь таблица @@ -202,8 +204,8 @@ end -------------------------------------------------------------------------------- -- Таблицу можно связать с метатаблицей, задав ей поведение, как при --- перегрузке операторов. Позже мы увидим, что метатаблицы поддерживают поведение, --- как в js-прототипах. +-- перегрузке операторов. Позже мы увидим, что метатаблицы поддерживают +-- поведение, как в js-прототипах. f1 = {a = 1, b = 2} -- Представляет фракцию a/b. f2 = {a = 2, b = 3} @@ -223,9 +225,9 @@ setmetatable(f2, metafraction) s = f1 + f2 -- вызвать __add(f1, f2) на метатаблице от f1 --- f1, f2 не имеют ключа для своих метатаблиц в отличии от прототипов в js, поэтому +-- f1, f2 не имеют ключа для своих метатаблиц в отличии от прототипов в js, -- нужно получить его через getmetatable(f1). Метатаблица - обычная таблица --- с ключами, известными для Lua (например, __add). +-- поэтому с ключами, известными для Lua (например, __add). -- Но следущая строка будет ошибочной т.к в s нет метатаблицы: -- t = s + s @@ -318,12 +320,15 @@ seymour:makeSound() -- 'woof woof woof' -- 4. -------------------------------------------------------------------------------- -- 1. LoudDog получит методы и переменные класса Dog. -- 2. В self будет ключ 'sound' из new(), см. пункт 3. --- 3. То же самое, что и "LoudDog.new(LoudDog)", конвертированное в "Dog.new(LoudDog)", --- поскольку в LoudDog нет ключа 'new', но в его метатаблице есть "__index = Dog". --- Результат: Метатаблицей для seymour стала LoudDog и "LoudDog.__index = Dog", --- поэтому seymour.key будет равно seymour.key, LoudDog.key, Dog.key, --- в зависимости от того какая таблица будет первой с заданным ключом. --- 4. 'makeSound' ключ найден в LoudDog; и выглдяит как "LoudDog.makeSound(seymour)". +-- 3. То же самое, что и "LoudDog.new(LoudDog)", конвертированное +-- в "Dog.new(LoudDog)", поскольку в LoudDog нет ключа 'new', +-- но в его метатаблице есть "__index = Dog". +-- Результат: Метатаблицей для seymour стала LoudDog, +-- а "LoudDog.__index = Dog". Поэтому seymour.key будет равно +-- seymour.key, LoudDog.key, Dog.key, в зависимости от того, +-- какая таблица будет первой с заданным ключом. +-- 4. Ключ 'makeSound' находится в LoudDog; +-- то же самое, что и "LoudDog.makeSound(seymour)". -- При необходимости функция new() в подклассе -- может быть похожа на аналог в базовом классе. @@ -375,8 +380,9 @@ mod.sayHello() -- Выведет "Привет, Hrunkner". -- Это будет ошибочным; sayMyName доступна только в mod.lua: mod.sayMyName() -- ошибка --- Значения, возвращаемые require, кэшируются, поэтому содержимое файла --- выполняется только 1 раз, даже если он подключается с помощью require много раз. +-- Значения, возвращаемые require, кэшируются, +-- поэтому содержимое файла выполняется только 1 раз, +-- даже если он подключается с помощью require много раз. -- Предположим, mod2.lua содержит "print('Hi!')". local a = require('mod2') -- Выведет "Hi!" @@ -403,7 +409,7 @@ g() -- Напишет 343. Я начинал с BlackBulletIV's Lua for programmers. Затем я прочитал официальную Документацию по Lua. -Так же может быть полезным Краткая справка по Lua на lua-users.org. +Также может быть полезной Краткая справка по Lua на lua-users.org. Основные темы, не охваченные стандартной библиотекой: -- cgit v1.2.3 From fa2a8209062a3005744a17f3d0912981b43f8942 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Thu, 27 Nov 2014 00:38:54 -0700 Subject: Implicits --- scala.html.markdown | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/scala.html.markdown b/scala.html.markdown index 529347be..f481f04f 100644 --- a/scala.html.markdown +++ b/scala.html.markdown @@ -507,7 +507,60 @@ for { n <- s; nSquared = n * n if nSquared < 10} yield nSquared // 8. Implicits ///////////////////////////////////////////////// -// Coming soon! +/* WARNING WARNING: Implicits are a set of powerful features of Scala, and + * therefore it is easy to abuse them. Beginners to Scala should resist the + * temptation to use them until they understand not only how they work, but also + * best practices around them. We only include this section in the tutorial + * because they are so commonplace in Scala libraries that it is impossible to + * do anything meaningful without using a library that has implicits. This is + * meant for you to understand and work with implicts, not declare your own. + */ + +// Any value (vals, functions, objects, etc) can be declared to be implicit by +// using the, you guessed it, "implicit" keyword. Note we are using the Dog +// class from section 5 in these examples. +implicit val myImplicitInt = 100 +implicit def myImplicitFunction(breed: String) = new Dog("Golden " + breed) + +// By itself, implicit keyword doesn't change the behavior of the value, so +// above values can be used as usual. +myImplicitInt + 2 // => 102 +myImplicitFunction("Pitbull").breed // => "Golden Pitbull" + +// The difference is that these values are now elligible to be used when another +// piece of code "needs" an implicit value. One such situation is implicit +// function arguments: +def sendGreetings(toWhom: String)(implicit howMany: Int) = + s"Hello $toWhom, $howMany blessings to you and yours!" + +// If we supply a value for "howMany", the function behaves as usual +sendGreetings("John")(1000) // => "Hello John, 1000 blessings to you and yours!" + +// But if we omit the implicit parameter, an implicit value of the same type is +// used, in this case, "myImplicitInt": +sendGreetings("Jane") // => "Hello Jane, 100 blessings to you and yours!" + +// Implicit function parameters enable us to simulate type classes in other +// functional languages. It is so often used that it gets its own shorthand. The +// following two lines mean the same thing: +def foo[T](implicit c: C[T]) = ... +def foo[T : C] = ... + + +// Another situation in which the compiler looks for an implicit is if you have +// obj.method(...) +// but "obj" doesn't have "method" as a method. In this case, if there is an +// implicit conversion of type A => B, where A is the type of obj, and B has a +// method called "method", that conversion is applied. So having +// myImplicitFunction above in scope, we can say: +"Retriever".breed // => "Golden Retriever" +"Sheperd".bark // => "Woof, woof!" + +// Here the String is first converted to Dog using our function above, and then +// the appropriate method is called. This is an extremely powerful feature, but +// again, it is not to be used lightly. In fact, when you defined the implicit +// function above, your compiler should have given you a warning, that you +// shouldn't do this unless you really know what you're doing. ///////////////////////////////////////////////// -- cgit v1.2.3 From 448aee0ed7b68d1ad029d78f3ac157eeba8c3555 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Thu, 27 Nov 2014 00:40:32 -0700 Subject: Fix a typo --- scala.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scala.html.markdown b/scala.html.markdown index f481f04f..5a478f2a 100644 --- a/scala.html.markdown +++ b/scala.html.markdown @@ -527,7 +527,7 @@ implicit def myImplicitFunction(breed: String) = new Dog("Golden " + breed) myImplicitInt + 2 // => 102 myImplicitFunction("Pitbull").breed // => "Golden Pitbull" -// The difference is that these values are now elligible to be used when another +// The difference is that these values are now eligible to be used when another // piece of code "needs" an implicit value. One such situation is implicit // function arguments: def sendGreetings(toWhom: String)(implicit howMany: Int) = -- cgit v1.2.3 From 8ea39ded5c746628ae74ad3706752410de5273cd Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Mon, 1 Dec 2014 21:39:49 -0700 Subject: Reassignment to reference doesn't cause error --- c++.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/c++.html.markdown b/c++.html.markdown index 9f357b08..d81ca4fc 100644 --- a/c++.html.markdown +++ b/c++.html.markdown @@ -238,7 +238,7 @@ string& fooRef = foo; // This creates a reference to foo. fooRef += ". Hi!"; // Modifies foo through the reference cout << fooRef; // Prints "I am foo. Hi!" -fooRef = bar; // Error: references cannot be reassigned. +fooRef = bar; // Doesn't reassign `fooRef`. This is the same as `foo = bar` const string& barRef = bar; // Create a const reference to bar. // Like C, const values (and pointers and references) cannot be modified. -- cgit v1.2.3 From bf493c07ed519cc3d41198a0720a5919f67f3ff0 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Mon, 1 Dec 2014 21:39:49 -0700 Subject: Reassignment to reference doesn't cause error --- c++.html.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/c++.html.markdown b/c++.html.markdown index 9f357b08..5f80f26f 100644 --- a/c++.html.markdown +++ b/c++.html.markdown @@ -238,7 +238,10 @@ string& fooRef = foo; // This creates a reference to foo. fooRef += ". Hi!"; // Modifies foo through the reference cout << fooRef; // Prints "I am foo. Hi!" -fooRef = bar; // Error: references cannot be reassigned. +// Doesn't reassign "fooRef". This is the same as "foo = bar", and +// foo == "I am bar" +// after this line. +fooRef = bar; const string& barRef = bar; // Create a const reference to bar. // Like C, const values (and pointers and references) cannot be modified. -- cgit v1.2.3 From 493812180f1e368ec8788cc02620bcd1f10e290e Mon Sep 17 00:00:00 2001 From: Mariane Siqueira Machado Date: Thu, 4 Dec 2014 14:38:45 -0200 Subject: Clojure translation into pt-br --- pt-br/clojure-pt.html.markdown | 381 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 381 insertions(+) create mode 100644 pt-br/clojure-pt.html.markdown diff --git a/pt-br/clojure-pt.html.markdown b/pt-br/clojure-pt.html.markdown new file mode 100644 index 00000000..a2b53726 --- /dev/null +++ b/pt-br/clojure-pt.html.markdown @@ -0,0 +1,381 @@ +--- +language: clojure +filename: learnclojure-pt.clj +contributors: + - ["Adam Bard", "http://adambard.com/"] +translators: + - ["Mariane Siqueira Machado", "https://twitter.com/mariane_sm"] +lang: pt-br +--- + +Clojure é uma linguagem da família do Lisp desenvolvida para a JVM (máquina virtual Java). Possui uma ênfase muito mais forte em [programação funcional] (https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional) pura do que Common Lisp, mas inclui diversas utilidades [STM](https://en.wikipedia.org/wiki/Software_transactional_memory) para lidar com estado a medida que isso se torna necessário. + +Essa combinação permite gerenciar processamento concorrente de maneira muito simples e frequentemente de maneira automática. + +(Sua versão de clojure precisa ser pelo menos 1.2) + + +```clojure +; Comentários começam por ponto e vírgula + +; Clojure é escrito em "forms" (padrões), os quais são simplesmente +; listas de coisas dentro de parênteses, separados por espaços em branco. + +; O "reader" (leitor) de clojure presume que o primeiro elemento de +; uma par de parênteses é uma função ou macro, e que os resto são argumentos. + +: A primeira chamada de um arquivo deve ser ns, para configurar o namespace (espaço de nomes) +(ns learnclojure) + +; Alguns exemplos básicos: + +; str cria uma string concatenando seus argumentos +(str "Hello" " " "World") ; => "Hello World" + +; Math é direta e intuitiva +(+ 1 1) ; => 2 +(- 2 1) ; => 1 +(* 1 2) ; => 2 +(/ 2 1) ; => 2 + +; Igualdade é = +(= 1 1) ; => true +(= 2 1) ; => false + +; Negação para operações lógicas +(not true) ; => false + +; Aninhar forms (padrões) funciona como esperado +(+ 1 (- 3 2)) ; = 1 + (3 - 2) => 2 + +; Tipos +;;;;;;;;;;;;; + +; Clojure usa os tipos de objetos de Java para booleanos, strings e números. +; Use `class` para inspecioná-los +(class 1) ; Literais Integer são java.lang.Long por padrão +(class 1.); Literais Float são java.lang.Double +(class ""); Strings são sempre com aspas duplas, e são java.lang.String +(class false) ; Booleanos são java.lang.Boolean +(class nil); O valor "null" é chamado nil + +; Se você quiser criar um lista de literais, use aspa simples para +; ela não ser avaliada +'(+ 1 2) ; => (+ 1 2) +; (que é uma abreviação de (quote (+ 1 2))) + +; É possível avaliar uma lista com aspa simples +(eval '(+ 1 2)) ; => 3 + +; Coleções e sequências +;;;;;;;;;;;;;;;;;;; + +; Listas são estruturas encadeadas, enquanto vetores são implementados como arrays. +; Listas e Vetores são classes Java também! +(class [1 2 3]); => clojure.lang.PersistentVector +(class '(1 2 3)); => clojure.lang.PersistentList + +; Uma lista é escrita como (1 2 3), mas temos que colocar a aspa +; simples para impedir o leitor (reader) de pensar que é uma função. +; Também, (list 1 2 3) é o mesmo que '(1 2 3) + +; "Coleções" são apenas grupos de dados +; Listas e vetores são ambos coleções: +(coll? '(1 2 3)) ; => true +(coll? [1 2 3]) ; => true + +; "Sequências" (seqs) são descrições abstratas de listas de dados. +; Apenas listas são seqs. +(seq? '(1 2 3)) ; => true +(seq? [1 2 3]) ; => false + +; Um seq precisa apenas prover uma entrada quando é acessada. +; Portanto, já que seqs podem ser avaliadas sob demanda (lazy) -- elas podem definir séries infinitas: +(range 4) ; => (0 1 2 3) +(range) ; => (0 1 2 3 4 ...) (uma série infinita) +(take 4 (range)) ; (0 1 2 3) + +; Use cons para adicionar um item no início de uma lista ou vetor +(cons 4 [1 2 3]) ; => (4 1 2 3) +(cons 4 '(1 2 3)) ; => (4 1 2 3) + +; Conj adiciona um item em uma coleção sempre do jeito mais eficiente. +; Para listas, elas inserem no início. Para vetores, é inserido no final. +(conj [1 2 3] 4) ; => [1 2 3 4] +(conj '(1 2 3) 4) ; => (4 1 2 3) + +; Use concat para concatenar listas e vetores +(concat [1 2] '(3 4)) ; => (1 2 3 4) + +; Use filter, map para interagir com coleções +(map inc [1 2 3]) ; => (2 3 4) +(filter even? [1 2 3]) ; => (2) + +; Use reduce para reduzi-los +(reduce + [1 2 3 4]) +; = (+ (+ (+ 1 2) 3) 4) +; => 10 + +; Reduce pode receber um argumento para o valor inicial +(reduce conj [] '(3 2 1)) +; = (conj (conj (conj [] 3) 2) 1) +; => [3 2 1] + +; Funções +;;;;;;;;;;;;;;;;;;;;; + +; Use fn para criar novas funções. Uma função sempre retorna +; sua última expressão. +(fn [] "Hello World") ; => fn + +; (É necessário colocar parênteses para chamá-los) +((fn [] "Hello World")) ; => "Hello World" + +; Você pode criar variáveis (var) usando def +(def x 1) +x ; => 1 + +; Atribua uma função para uma var +(def hello-world (fn [] "Hello World")) +(hello-world) ; => "Hello World" + +; Você pode abreviar esse processo usando defn +(defn hello-world [] "Hello World") + +; O [] é uma lista de argumentos para um função. +(defn hello [name] + (str "Hello " name)) +(hello "Steve") ; => "Hello Steve" + +; Você pode ainda usar essa abreviação para criar funcões: +(def hello2 #(str "Hello " %1)) +(hello2 "Fanny") ; => "Hello Fanny" + +; Vocé pode ter funções multi-variadic, isto é, com um número variável de argumentos +(defn hello3 + ([] "Hello World") + ([name] (str "Hello " name))) +(hello3 "Jake") ; => "Hello Jake" +(hello3) ; => "Hello World" + +; Funções podem agrupar argumentos extras em uma seq +(defn count-args [& args] + (str "You passed " (count args) " args: " args)) +(count-args 1 2 3) ; => "You passed 3 args: (1 2 3)" + +; Você pode misturar argumentos regulares e argumentos em seq +(defn hello-count [name & args] + (str "Hello " name ", you passed " (count args) " extra args")) +(hello-count "Finn" 1 2 3) +; => "Hello Finn, you passed 3 extra args" + + +; Mapas +;;;;;;;;;; + +; Hash maps e array maps compartilham uma mesma interface. Hash maps são mais +; rápidos para pesquisa mas não mantém a ordem da chave. +(class {:a 1 :b 2 :c 3}) ; => clojure.lang.PersistentArrayMap +(class (hash-map :a 1 :b 2 :c 3)) ; => clojure.lang.PersistentHashMap + +; Arraymaps pode automaticamente se tornar hashmaps através da maioria das +; operações se eles ficarem grandes o suficiente, portanto não há necessida de +; se preocupar com isso. + +; Maps podem usar qualquer tipo "hasheavel" como chave, mas normalmente +; keywords (palavras chave) são melhores. +; Keywords são como strings mas com algumas vantagens. +(class :a) ; => clojure.lang.Keyword + +(def stringmap {"a" 1, "b" 2, "c" 3}) +stringmap ; => {"a" 1, "b" 2, "c" 3} + +(def keymap {:a 1, :b 2, :c 3}) +keymap ; => {:a 1, :c 3, :b 2} + +; A propósito, vírgulas são sempre tratadas como espaçoes em branco e não fazem nada. + +; Recupere o valor de um mapa chamando ele como uma função +(stringmap "a") ; => 1 +(keymap :a) ; => 1 + +; Uma palavra chave pode ser usada pra recuperar os valores de um mapa +(:b keymap) ; => 2 + +; Não tente isso com strings +;("a" stringmap) +; => Exception: java.lang.String cannot be cast to clojure.lang.IFn + +; Buscar uma chave não presente retorna nil +(stringmap "d") ; => nil + +; Use assoc para adicionar novas chaves para hash-maps +(def newkeymap (assoc keymap :d 4)) +newkeymap ; => {:a 1, :b 2, :c 3, :d 4} + +; Mas lembre-se, tipos em clojure são sempre imutáveis! +keymap ; => {:a 1, :b 2, :c 3} + +; Use dissoc para remover chaves +(dissoc keymap :a :b) ; => {:c 3} + +; Conjuntos +;;;;;; + +(class #{1 2 3}) ; => clojure.lang.PersistentHashSet +(set [1 2 3 1 2 3 3 2 1 3 2 1]) ; => #{1 2 3} + +; Adicione um membro com conj +(conj #{1 2 3} 4) ; => #{1 2 3 4} + +; Remove um com disj +(disj #{1 2 3} 1) ; => #{2 3} + +; Test por existência usando set como função: +(#{1 2 3} 1) ; => 1 +(#{1 2 3} 4) ; => nil + +; Existem muitas outras funções no namespace clojure.sets + +; Forms (padrões) úteis +;;;;;;;;;;;;;;;;; + +; Construções lógicas em clojure são como macros, e +; se parecem com as demais +(if false "a" "b") ; => "b" +(if false "a") ; => nil + +; Use let para criar amarramentos (bindings) temporários +(let [a 1 b 2] + (> a b)) ; => false + +; Agrupe comandos juntos com do +(do + (print "Hello") + "World") ; => "World" (prints "Hello") + +; Funções tem um do implícito +(defn print-and-say-hello [name] + (print "Saying hello to " name) + (str "Hello " name)) +(print-and-say-hello "Jeff") ;=> "Hello Jeff" (prints "Saying hello to Jeff") + +; Assim como let +(let [name "Urkel"] + (print "Saying hello to " name) + (str "Hello " name)) ; => "Hello Urkel" (prints "Saying hello to Urkel") + +; Módulos +;;;;;;;;;;;;;;; + +; Use "use" para poder usar todas as funções de um modulo +(use 'clojure.set) + +; Agora nós podemos usar operações com conjuntos +(intersection #{1 2 3} #{2 3 4}) ; => #{2 3} +(difference #{1 2 3} #{2 3 4}) ; => #{1} + +; Você pode escolher um subconjunto de funções para importar +(use '[clojure.set :only [intersection]]) + +; Use require para importar um módulo +(require 'clojure.string) + +; USe / para chamar funções de um módulo +; Aqui, o módulo é clojure.string e a função é blank? +(clojure.string/blank? "") ; => true + +; Você pode dar para um módulo um nome mais curto no import +(require '[clojure.string :as str]) +(str/replace "This is a test." #"[a-o]" str/upper-case) ; => "THIs Is A tEst." +; (#"" denota uma expressão regular literal) + +; Você pode usar require (e até "use", mas escolha require) de um namespace utilizando :require. +; Não é necessário usar aspa simples nos seus módulos se você usar desse jeito. +(ns test + (:require + [clojure.string :as str] + [clojure.set :as set])) + +; Java +;;;;;;;;;;;;;;;;; + +; Java tem uma biblioteca padrão enorme e muito útil, +; portanto é importante aprender como utiliza-la. + +; Use import para carregar um modulo java +(import java.util.Date) + +; Você pode importar usando ns também. +(ns test + (:import java.util.Date + java.util.Calendar)) + +; Use o nome da clase com um "." no final para criar uma nova instância +(Date.) ; + +; Use . para chamar métodos. Ou, use o atalho ".method" +(. (Date.) getTime) ; +(.getTime (Date.)) ; exactly the same thing. + +; Use / para chamar métodos estáticos +(System/currentTimeMillis) ; (system is always present) + +; Use doto para pode lidar com classe (mutáveis) de forma mais tolerável +(import java.util.Calendar) +(doto (Calendar/getInstance) + (.set 2000 1 1 0 0 0) + .getTime) ; => A Date. set to 2000-01-01 00:00:00 + +; STM +;;;;;;;;;;;;;;;;; + +; Software Transactional Memory é o mecanismo que clojure usa para gerenciar +; estado persistente. Tem algumas construções em clojure que o utilizam. + +; O atom é o mais simples. Passe pra ele um valor inicial +(def my-atom (atom {})) + +; Atualize o atom com um swap!. +; swap! pega uma funçnao and chama ela com o valor atual do atom +; como primeiro argumento, e qualquer argumento restante como o segundo +(swap! my-atom assoc :a 1) ; Sets my-atom to the result of (assoc {} :a 1) +(swap! my-atom assoc :b 2) ; Sets my-atom to the result of (assoc {:a 1} :b 2) + +; Use '@' para desreferenciar um atom e acessar seu valor +my-atom ;=> Atom<#...> (Retorna o objeto do Atom) +@my-atom ; => {:a 1 :b 2} + +; Abaixo um contador simples usando um atom +(def counter (atom 0)) +(defn inc-counter [] + (swap! counter inc)) + +(inc-counter) +(inc-counter) +(inc-counter) +(inc-counter) +(inc-counter) + +@counter ; => 5 + +; Outras construção STM são refs e agents. +; Refs: http://clojure.org/refs +; Agents: http://clojure.org/agents +``` + +### Leitura adicional + +Esse tutorial está longe de ser exaustivo, mas deve ser suficiente para que você possa começar. + +Clojure.org tem vários artigos: +[http://clojure.org/](http://clojure.org/) + +Clojuredocs.org tem documentação com exemplos para quase todas as funções principais (pertecentes ao core): +[http://clojuredocs.org/quickref/Clojure%20Core](http://clojuredocs.org/quickref/Clojure%20Core) + +4Clojure é um grande jeito de aperfeiçoar suas habilidades em Clojure/Programação Funcional: +[http://www.4clojure.com/](http://www.4clojure.com/) + +Clojure-doc.org tem um bom número de artigos para iniciantes: +[http://clojure-doc.org/](http://clojure-doc.org/) -- cgit v1.2.3 From 283973e99da0dee0bc811b62280d1a3db77b0b52 Mon Sep 17 00:00:00 2001 From: Mariane Siqueira Machado Date: Thu, 4 Dec 2014 19:43:12 -0200 Subject: Swift translation to pt-br --- pt-br/swift-pt.html.markdown | 500 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 500 insertions(+) create mode 100644 pt-br/swift-pt.html.markdown diff --git a/pt-br/swift-pt.html.markdown b/pt-br/swift-pt.html.markdown new file mode 100644 index 00000000..a29490b0 --- /dev/null +++ b/pt-br/swift-pt.html.markdown @@ -0,0 +1,500 @@ +--- +language: swift +contributors: + - ["Grant Timmerman", "http://github.com/grant"], + - ["Christopher Bess", "http://github.com/cbess"] +translators: + - ["Mariane Siqueira Machado", "https://twitter.com/mariane_sm"] +lang: pt-br +filename: learnswift.swift +--- + +Swift é uma linguagem de programação para desenvolvimento de aplicações no iOS e OS X criada pela Apple. Criada para +coexistir com Objective-C e para ser mais resiliente a código com erros, Swift foi apresentada em 2014 na Apple's +developer conference WWDC. Foi construída com o compilador LLVM já incluído no Xcode 6 beta. + +O livro oficial [Swift Programming Language] (https://itunes.apple.com/us/book/swift-programming-language/id881256329) da +Apple já está disponível via IBooks (apenas em inglês). + +Confira também o tutorial completo de Swift da Apple [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html), também disponível apenas em inglês. + +```swift +// importa um módulo +import UIKit + +// +// MARK: Noções básicas +// + +// Xcode supporta anotações para seu código e lista elas na barra de atalhos +// MARK: Marca uma sessão +// TODO: Faça algo logo +// FIXME: Conserte esse código + +println("Hello, world") + +// Valores em variáveis (var) podem ter seu valor alterado depois de declarados. +// Valores em constantes (let) NÃO podem ser alterados depois de declarados. + +var myVariable = 42 +let øπΩ = "value" // nomes de variáveis em unicode +let π = 3.1415926 +let convenience = "keyword" // nome de variável contextual +let weak = "keyword"; let override = "another keyword" // comandos podem ser separados por uma ponto e vírgula +let `class` = "keyword" // Crases permitem que palavras-chave seja usadas como nome de variáveis +let explicitDouble: Double = 70 +let intValue = 0007 // 7 +let largeIntValue = 77_000 // 77000 +let label = "some text " + String(myVariable) // Coerção +let piText = "Pi = \(π), Pi 2 = \(π * 2)" // Interpolação de strings + +// Constrói valores específicos +// Utiliza configuração de build -D +#if false + println("Not printed") + let buildValue = 3 +#else + let buildValue = 7 +#endif +println("Build value: \(buildValue)") // Build value: 7 + +/* + Optionals fazem parte da linguagem e permitem que você armazene um + valor `Some` (algo) ou `None` (nada). + + Como Swift requer que todas as propriedades tenham valores, até mesmo nil deve + ser explicitamente armazenado como um valor Optional. + + Optional é uma enum. +*/ +var someOptionalString: String? = "optional" // Pode ser nil +// o mesmo acima, mas ? é um operador pós-fixado (açúcar sintático) +var someOptionalString2: Optional = "optional" + +if someOptionalString != nil { + // Eu não sou nil + if someOptionalString!.hasPrefix("opt") { + println("has the prefix") + } + + let empty = someOptionalString?.isEmpty +} +someOptionalString = nil + +// Optional implicitamente desempacotado (unwrapped) +var unwrappedString: String! = "Valor é esperado." +// o mesmo acima, mas ? é um operador pósfixado (açúcar sintático) +var unwrappedString2: ImplicitlyUnwrappedOptional = "Valor é esperado." + +if let someOptionalStringConstant = someOptionalString { + // Tem `Some` (algum) valor, não nil + if !someOptionalStringConstant.hasPrefix("ok") { + // não possui o prefixo + } +} + +// Swift tem suporte para armazenar um valor de qualquer tipo. +// AnyObject == id +// Ao contrário de Objective-C `id`, AnyObject funciona com qualquer valor (Class, Int, struct, etc) +var anyObjectVar: AnyObject = 7 +anyObjectVar = "Mudou o valor para string, não é uma boa prática, mas é possível." + +/* +Comentário aqui + /* + Comentários aninhados também são suportados + */ +*/ + +// +// MARK: Coleções +// + +/* + Tipos Array e Dicionário são structs. Portanto `let` e `var` + também indicam se são mutáveis (var) ou imutáveis (let) quando declarados + com esses tipos. +*/ + +// Array +var shoppingList = ["catfish", "water", "lemons"] +shoppingList[1] = "bottle of water" +let emptyArray = [String]() // imutável +var emptyMutableArray = [String]() // mutável + + +// Dicionário +var occupations = [ + "Malcolm": "Captain", + "kaylee": "Mechanic" +] +occupations["Jayne"] = "Public Relations" +let emptyDictionary = [String: Float]() // imutável +var emptyMutableDictionary = [String: Float]() // mutável + + +// +// MARK: Controle de fluxo +// + +// laço for (array) +let myArray = [1, 1, 2, 3, 5] +for value in myArray { + if value == 1 { + println("One!") + } else { + println("Not one!") + } +} + +// laço for (dicionário) +var dict = ["one": 1, "two": 2] +for (key, value) in dict { + println("\(key): \(value)") +} + +// laço for (alcance) +for i in -1...shoppingList.count { + println(i) +} +shoppingList[1...2] = ["steak", "peacons"] +// use ..< para excluir o último número + +// laço while (enquanto) +var i = 1 +while i < 1000 { + i *= 2 +} + +// laço do-while +do { + println("hello") +} while 1 == 2 + +// Switch +let vegetable = "red pepper" +switch vegetable { +case "celery": + let vegetableComment = "Add some raisins and make ants on a log." +case "cucumber", "watercress": + let vegetableComment = "That would make a good tea sandwich." +case let x where x.hasSuffix("pepper"): + let vegetableComment = "Is it a spicy \(x)?" +default: // required (in order to cover all possible input) + let vegetableComment = "Everything tastes good in soup." +} + + +// +// MARK: Funções +// + +// Funções são tipos de primeira classe, o que significa que eles podem ser aninhados +// em funções e podem ser passados como parâmetros + +// Funções Swift com cabeçalhos doc (formato como reStructedText) +/** +Uma operação de saudação + +- Um bullet em documentos +- Outro bullet + +:param: nome A nome +:param: dia A dia +:returns: Uma string contendo o nome e o dia. +*/ +func greet(name: String, day: String) -> String { + return "Hello \(name), today is \(day)." +} +greet("Bob", "Tuesday") + +// Função que retorna múltiplos items em uma tupla +func getGasPrices() -> (Double, Double, Double) { + return (3.59, 3.69, 3.79) +} +let pricesTuple = getGasPrices() +let price = pricesTuple.2 // 3.79 +// Ignore valores de Tuplas (ou outros valores) usando _ (underscore) +let (_, price1, _) = pricesTuple // price1 == 3.69 +println(price1 == pricesTuple.1) // true +println("Gas price: \(price)") + +// Número variável de argumentos +func setup(numbers: Int...) { + // its an array + let number = numbers[0] + let argCount = numbers.count +} + +// Passando e retornando funções +func makeIncrementer() -> (Int -> Int) { + func addOne(number: Int) -> Int { + return 1 + number + } + return addOne +} +var increment = makeIncrementer() +increment(7) + +// passagem por referência +func swapTwoInts(inout a: Int, inout b: Int) { + let tempA = a + a = b + b = tempA +} +var someIntA = 7 +var someIntB = 3 +swapTwoInts(&someIntA, &someIntB) +println(someIntB) // 7 + + +// +// MARK: Closures +// +var numbers = [1, 2, 6] + +// Funções são casos especiais de closures ({}) + +// Exemplo de closure. +// `->` separa argumentos e tipo de retorno +// `in` separa o cabeçalho do closure do seu corpo +numbers.map({ + (number: Int) -> Int in + let result = 3 * number + return result +}) + +// Quando o tipo é conhecido, como abaixo, nós podemos fazer o seguinte +numbers = numbers.map({ number in 3 * number }) +// Ou até mesmo isso +//numbers = numbers.map({ $0 * 3 }) + +print(numbers) // [3, 6, 18] + +// Closure restante +numbers = sorted(numbers) { $0 > $1 } + +print(numbers) // [18, 6, 3] + +// Super atalho, já que o operador < infere os tipos + +numbers = sorted(numbers, < ) + +print(numbers) // [3, 6, 18] + +// +// MARK: Estruturas +// + +// Estruturas e classes tem funcionalidades muito similares +struct NamesTable { + let names: [String] + + // Custom subscript + subscript(index: Int) -> String { + return names[index] + } +} + +// Estruturas possuem um inicializador auto-gerado automático (implícito) +let namesTable = NamesTable(names: ["Me", "Them"]) +//let name = namesTable[2] +//println("Name is \(name)") // Name is Them + +// +// MARK: Classes +// + +// Classes, Estruturas e seus membros possuem três níveis de modificadores de acesso +// Eles são: internal (default), public, private + +public class Shape { + public func getArea() -> Int { + return 0; + } +} + +// Todos os métodos e propriedades de uma classe são públicos. +// Se você só precisa armazenar dados em um objeto estruturado, use `struct` + +internal class Rect: Shape { + var sideLength: Int = 1 + + // Getter e setter personalizado + private var perimeter: Int { + get { + return 4 * sideLength + } + set { + // `newValue` é uma variável implicita disponível para os setters + sideLength = newValue / 4 + } + } + + // Carregue uma propriedade sob demanda (lazy) + // subShape permanece nil (não inicializado) até seu getter ser chamado + lazy var subShape = Rect(sideLength: 4) + + // Se você não precisa de um getter e setter personalizado, + // mas ainda quer roda código antes e depois de configurar + // uma propriedade, você pode usar `willSet` e `didSet` + var identifier: String = "defaultID" { + // o argumento `willSet` será o nome da variável para o novo valor + willSet(someIdentifier) { + print(someIdentifier) + } + } + + init(sideLength: Int) { + self.sideLength = sideLength + // sempre chame super.init por último quand inicializar propriedades personalizadas (custom) + super.init() + } + + func shrink() { + if sideLength > 0 { + --sideLength + } + } + + override func getArea() -> Int { + return sideLength * sideLength + } +} + +// Uma classe básica `Square` que estende `Rect` +class Square: Rect { + convenience init() { + self.init(sideLength: 5) + } +} + +var mySquare = Square() +print(mySquare.getArea()) // 25 +mySquare.shrink() +print(mySquare.sideLength) // 4 + +// Compara instâncias, não é o mesmo que == o qual compara objetos +if mySquare === mySquare { + println("Yep, it's mySquare") +} + + +// +// MARK: Enums +// + +// Enums podem opcionalmente ser de um tipo específico ou não. +// Podem conter métodos do mesmo jeito que classes. + +enum Suit { + case Spades, Hearts, Diamonds, Clubs + func getIcon() -> String { + switch self { + case .Spades: return "♤" + case .Hearts: return "♡" + case .Diamonds: return "♢" + case .Clubs: return "♧" + } + } +} + + +// +// MARK: Protocolos +// + +// `protocol` pode requerer que os tipos que se adequam tenham +// propriedades de instância, métodos, operadores e subscripts. +protocol ShapeGenerator { + var enabled: Bool { get set } + func buildShape() -> Shape +} + +// Protocolos declarados com @objc permitem funções opcionais, +// que permitem verificar a confomidade +@objc protocol TransformShape { + optional func reshaped() + optional func canReshape() -> Bool +} + +class MyShape: Rect { + var delegate: TransformShape? + + func grow() { + sideLength += 2 + + if let allow = self.delegate?.canReshape?() { + // test for delegate then for method + // testa por delegação e então por método + self.delegate?.reshaped?() + } + } +} + + +// +// MARK: Outros +// + +// `extension`s: Adicionam uma funcionalidade extra para um tipo já existente. + +// Square agora "segue" o protocolo `Printable` +extension Square: Printable { + var description: String { + return "Area: \(self.getArea()) - ID: \(self.identifier)" + } +} + +println("Square: \(mySquare)") + +// Você pode também estender tipos embutidos (built-in) +extension Int { + var customProperty: String { + return "This is \(self)" + } + + func multiplyBy(num: Int) -> Int { + return num * self + } +} + +println(7.customProperty) // "This is 7" +println(14.multiplyBy(2)) // 42 + +// Generics: Similar com Java e C#. Use a palavra-chave `where` para +// especificar os requisitos do generics. + +func findIndex(array: [T], valueToFind: T) -> Int? { + for (index, value) in enumerate(array) { + if value == valueToFind { + return index + } + } + return nil +} +let foundAtIndex = findIndex([1, 2, 3, 4], 3) +println(foundAtIndex == 2) // true + +// Operadores: +// Operadores personalizados (custom) podem começar com os seguintes caracteres: +// / = - + * % < > ! & | ^ . ~ +// ou +// Unicode math, símbolo, seta, e caracteres tipográficos ou de desenho. +prefix operator !!! {} + +// Um operador de prefixo que triplica o comprimento do lado do quadrado +// quando usado +prefix func !!! (inout shape: Square) -> Square { + shape.sideLength *= 3 + return shape +} + +// valor atual +println(mySquare.sideLength) // 4 + +// Troca o comprimento do lado usando um operador personalizado !!!, aumenta o lado por 3 +!!!mySquare +println(mySquare.sideLength) // 12 + +``` -- cgit v1.2.3 From acaefff543c04e9cf3f63625193c1383254b6ee3 Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Fri, 5 Dec 2014 17:59:04 +0700 Subject: And the last(?) one --- ru-ru/lua-ru.html.markdown | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 89d0c8d7..99607ebc 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -35,7 +35,7 @@ u = [[ Двойные квадратные скобки многострочные значения.]] t = nil -- Удаляет определение переменной t; в Lua есть сборка мусора. --- Блоки обозначаются ключевыми слоавми, такими как do/end: +-- Блоки обозначаются ключевыми словами, такими как do/end: while num < 50 do num = num + 1 -- Операторов ++ и += нет. end @@ -139,8 +139,8 @@ local g; g = function (x) return math.sin(x) end -- Вызов функции с одним строковым параметром не требует круглых скобок: print 'hello' -- Работает без ошибок. --- Вызов функции с одним табличным параметром так же --- не требует круглых скобок (про таблицы в след.части): +-- Вызов функции с одним табличным параметром также +-- не требует круглых скобок (про таблицы в след. части): print {} -- Тоже сработает. -------------------------------------------------------------------------------- @@ -206,7 +206,7 @@ end -- Таблицу можно связать с метатаблицей, задав ей поведение, как при -- перегрузке операторов. Позже мы увидим, что метатаблицы поддерживают -- поведение, как в js-прототипах. -f1 = {a = 1, b = 2} -- Представляет фракцию a/b. +f1 = {a = 1, b = 2} -- Представляет дробь a/b. f2 = {a = 2, b = 3} -- Это не сработает: @@ -233,7 +233,7 @@ s = f1 + f2 -- вызвать __add(f1, f2) на метатаблице от f1 -- t = s + s -- Похожий на классы подход, приведенный ниже, поможет это исправить. --- __index перегружет в метатаблице просмотр через точку: +-- __index перегружает в метатаблице просмотр через точку: defaultFavs = {animal = 'gru', food = 'donuts'} myFavs = {food = 'pizza'} setmetatable(myFavs, {__index = defaultFavs}) @@ -299,7 +299,7 @@ mrDog:makeSound() -- 'I say woof' -- 8. -- это можно изменить. newObj получит свои функции, когда мы установим -- метатаблицу для newObj и __index для self на саму себя. -- 5. Напоминание: setmetatable возвращает первый аргумент. --- 6. : работает, как в пункте 2, но в этот раз мы ожидмаем, +-- 6. : работает, как в пункте 2, но в этот раз мы ожидаем, -- что self будет экземпляром, а не классом. -- 7. То же самое, что и Dog.new(Dog), поэтому self = Dog в new(). -- 8. То же самое, что mrDog.makeSound(mrDog); self = mrDog. @@ -367,7 +367,7 @@ return M local mod = require('mod') -- Запустим файл mod.lua. -- require - стандартный способ подключения модулей. --- require ведёт себя так: (если не кешировано, см. ниже) +-- require ведёт себя так: (если не кэшировано, см. ниже) local mod = (function () <содержимое mod.lua> end)() @@ -404,14 +404,14 @@ g() -- Напишет 343. ``` ## Примечание (от автора) -Мне было интересно изучить Lua, чтобы делать игры при помощи Love 2D game engine. +Мне было интересно изучить Lua, чтобы делать игры при помощи игрового движка LÖVE. Я начинал с BlackBulletIV's Lua for programmers. Затем я прочитал официальную Документацию по Lua. Также может быть полезной Краткая справка по Lua на lua-users.org. -Основные темы, не охваченные стандартной библиотекой: +Ещё из основных тем не охвачены стандартные библиотеки: * библиотека string * библиотека table @@ -419,9 +419,7 @@ g() -- Напишет 343. * библиотека io * библиотека os -Весь файл написан на Lua; сохраните его, как learn.lua, и запустите при помощи "lua learn.lua" ! - -Это была моя первая статья для tylerneylon.com, которая также доступна как github gist. - -Удачи с Lua! +Кстати, весь файл написан на Lua; сохраните его, как learn.lua, и запустите при помощи "lua learn.lua" ! +Изначально эта статья была написана для tylerneylon.com. +Также она доступна как github gist. Удачи с Lua! -- cgit v1.2.3 From d3d7a7c76288318f5be62690b74776ff0e9a1c0e Mon Sep 17 00:00:00 2001 From: Daniel-Cortez Date: Fri, 5 Dec 2014 18:37:50 +0700 Subject: Forgot to remove commas --- ru-ru/lua-ru.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru-ru/lua-ru.html.markdown b/ru-ru/lua-ru.html.markdown index 99607ebc..6f515975 100644 --- a/ru-ru/lua-ru.html.markdown +++ b/ru-ru/lua-ru.html.markdown @@ -419,7 +419,7 @@ g() -- Напишет 343. * библиотека io * библиотека os -Кстати, весь файл написан на Lua; сохраните его, как learn.lua, и запустите при помощи "lua learn.lua" ! +Кстати, весь файл написан на Lua; сохраните его как learn.lua и запустите при помощи "lua learn.lua" ! Изначально эта статья была написана для tylerneylon.com. Также она доступна как github gist. Удачи с Lua! -- cgit v1.2.3 From c5723d5e2a6302b3047569aa94c7974cad868287 Mon Sep 17 00:00:00 2001 From: Adam Bard Date: Fri, 5 Dec 2014 22:45:17 +0100 Subject: Fixes #882 --- fr-fr/brainfuck-fr.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fr-fr/brainfuck-fr.html.markdown b/fr-fr/brainfuck-fr.html.markdown index 3882734d..545e407e 100644 --- a/fr-fr/brainfuck-fr.html.markdown +++ b/fr-fr/brainfuck-fr.html.markdown @@ -13,7 +13,7 @@ Brainfuck (sans majuscule à part au début d’une phrase) est un langage Turing-complet extrêmement simple avec seulement 8 commandes. ``` -Tout caractère en dehors de "><+-.,[]" (en dehors des guillements) est ignoré. +Tout caractère en dehors de "><+-.,[]" (en dehors des guillemets) est ignoré. Brainfuck est représenté par un tableau de 30 000 cellules initialisées à 0 et un pointeur de données pointant sur la cellule courante. -- cgit v1.2.3 From b3e0d276987dca1cb97aad2b39999ce7e63da6be Mon Sep 17 00:00:00 2001 From: Mariane Siqueira Machado Date: Fri, 5 Dec 2014 20:15:08 -0200 Subject: Improving a little bit more --- pt-br/clojure-pt.html.markdown | 49 ++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/pt-br/clojure-pt.html.markdown b/pt-br/clojure-pt.html.markdown index a2b53726..7e8b3f7b 100644 --- a/pt-br/clojure-pt.html.markdown +++ b/pt-br/clojure-pt.html.markdown @@ -10,7 +10,7 @@ lang: pt-br Clojure é uma linguagem da família do Lisp desenvolvida para a JVM (máquina virtual Java). Possui uma ênfase muito mais forte em [programação funcional] (https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional) pura do que Common Lisp, mas inclui diversas utilidades [STM](https://en.wikipedia.org/wiki/Software_transactional_memory) para lidar com estado a medida que isso se torna necessário. -Essa combinação permite gerenciar processamento concorrente de maneira muito simples e frequentemente de maneira automática. +Essa combinação permite gerenciar processamento concorrente de maneira muito simples, e frequentemente de maneira automática. (Sua versão de clojure precisa ser pelo menos 1.2) @@ -18,10 +18,10 @@ Essa combinação permite gerenciar processamento concorrente de maneira muito s ```clojure ; Comentários começam por ponto e vírgula -; Clojure é escrito em "forms" (padrões), os quais são simplesmente +; Clojure é escrito em "forms", os quais são simplesmente ; listas de coisas dentro de parênteses, separados por espaços em branco. -; O "reader" (leitor) de clojure presume que o primeiro elemento de +; O "reader" (leitor) de Clojure presume que o primeiro elemento de ; uma par de parênteses é uma função ou macro, e que os resto são argumentos. : A primeira chamada de um arquivo deve ser ns, para configurar o namespace (espaço de nomes) @@ -32,20 +32,20 @@ Essa combinação permite gerenciar processamento concorrente de maneira muito s ; str cria uma string concatenando seus argumentos (str "Hello" " " "World") ; => "Hello World" -; Math é direta e intuitiva +; Cálculos são feitos de forma direta e intuitiva (+ 1 1) ; => 2 (- 2 1) ; => 1 (* 1 2) ; => 2 (/ 2 1) ; => 2 -; Igualdade é = +; Você pode comparar igualdade utilizando = (= 1 1) ; => true (= 2 1) ; => false ; Negação para operações lógicas (not true) ; => false -; Aninhar forms (padrões) funciona como esperado +; Aninhar "forms" funciona como esperado (+ 1 (- 3 2)) ; = 1 + (3 - 2) => 2 ; Tipos @@ -131,7 +131,7 @@ Essa combinação permite gerenciar processamento concorrente de maneira muito s ; (É necessário colocar parênteses para chamá-los) ((fn [] "Hello World")) ; => "Hello World" -; Você pode criar variáveis (var) usando def +; Você pode atribuir valores a variáveis utilizando def (def x 1) x ; => 1 @@ -182,8 +182,11 @@ x ; => 1 ; operações se eles ficarem grandes o suficiente, portanto não há necessida de ; se preocupar com isso. -; Maps podem usar qualquer tipo "hasheavel" como chave, mas normalmente -; keywords (palavras chave) são melhores. +;Mapas podem usar qualquer valor que se pode derivar um hash como chave + + +; Mapas podem usar qualquer valor em que se pode derivar um hash como chave, +; mas normalmente palavras-chave (keywords) são melhores. ; Keywords são como strings mas com algumas vantagens. (class :a) ; => clojure.lang.Keyword @@ -199,7 +202,7 @@ keymap ; => {:a 1, :c 3, :b 2} (stringmap "a") ; => 1 (keymap :a) ; => 1 -; Uma palavra chave pode ser usada pra recuperar os valores de um mapa +; Uma palavra-chave pode ser usada pra recuperar os valores de um mapa (:b keymap) ; => 2 ; Não tente isso com strings @@ -213,7 +216,7 @@ keymap ; => {:a 1, :c 3, :b 2} (def newkeymap (assoc keymap :d 4)) newkeymap ; => {:a 1, :b 2, :c 3, :d 4} -; Mas lembre-se, tipos em clojure são sempre imutáveis! +; Mas lembre-se, tipos em Clojure são sempre imutáveis! keymap ; => {:a 1, :b 2, :c 3} ; Use dissoc para remover chaves @@ -228,7 +231,7 @@ keymap ; => {:a 1, :b 2, :c 3} ; Adicione um membro com conj (conj #{1 2 3} 4) ; => #{1 2 3 4} -; Remove um com disj +; Remova um membro com disj (disj #{1 2 3} 1) ; => #{2 3} ; Test por existência usando set como função: @@ -237,19 +240,19 @@ keymap ; => {:a 1, :b 2, :c 3} ; Existem muitas outras funções no namespace clojure.sets -; Forms (padrões) úteis +; Forms úteis ;;;;;;;;;;;;;;;;; -; Construções lógicas em clojure são como macros, e +; Construções lógicas em Clojure são como macros, e ; se parecem com as demais (if false "a" "b") ; => "b" (if false "a") ; => nil -; Use let para criar amarramentos (bindings) temporários +; Use let para criar um novo escopo associando sîmbolos a valores (bindings) (let [a 1 b 2] (> a b)) ; => false -; Agrupe comandos juntos com do +; Agrupe comandos juntos com "do" (do (print "Hello") "World") ; => "World" (prints "Hello") @@ -281,7 +284,7 @@ keymap ; => {:a 1, :b 2, :c 3} ; Use require para importar um módulo (require 'clojure.string) -; USe / para chamar funções de um módulo +; Use / para chamar funções de um módulo ; Aqui, o módulo é clojure.string e a função é blank? (clojure.string/blank? "") ; => true @@ -316,10 +319,10 @@ keymap ; => {:a 1, :b 2, :c 3} ; Use . para chamar métodos. Ou, use o atalho ".method" (. (Date.) getTime) ; -(.getTime (Date.)) ; exactly the same thing. +(.getTime (Date.)) ; exatamente a mesma coisa. ; Use / para chamar métodos estáticos -(System/currentTimeMillis) ; (system is always present) +(System/currentTimeMillis) ; (o módulo System está sempre presente) ; Use doto para pode lidar com classe (mutáveis) de forma mais tolerável (import java.util.Calendar) @@ -330,8 +333,8 @@ keymap ; => {:a 1, :b 2, :c 3} ; STM ;;;;;;;;;;;;;;;;; -; Software Transactional Memory é o mecanismo que clojure usa para gerenciar -; estado persistente. Tem algumas construções em clojure que o utilizam. +; Software Transactional Memory é o mecanismo que Clojure usa para gerenciar +; estado persistente. Tem algumas construções em Clojure que o utilizam. ; O atom é o mais simples. Passe pra ele um valor inicial (def my-atom (atom {})) @@ -339,8 +342,8 @@ keymap ; => {:a 1, :b 2, :c 3} ; Atualize o atom com um swap!. ; swap! pega uma funçnao and chama ela com o valor atual do atom ; como primeiro argumento, e qualquer argumento restante como o segundo -(swap! my-atom assoc :a 1) ; Sets my-atom to the result of (assoc {} :a 1) -(swap! my-atom assoc :b 2) ; Sets my-atom to the result of (assoc {:a 1} :b 2) +(swap! my-atom assoc :a 1) ; Coloca o valor do átomo my-atom como o resultado de (assoc {} :a 1) +(swap! my-atom assoc :b 2) ; Coloca o valor do átomo my-atom como o resultado de (assoc {:a 1} :b 2) ; Use '@' para desreferenciar um atom e acessar seu valor my-atom ;=> Atom<#...> (Retorna o objeto do Atom) -- cgit v1.2.3 From 8291fb2d7d376186a19e643e92aacb9ed9412395 Mon Sep 17 00:00:00 2001 From: Ruben Date: Mon, 8 Dec 2014 13:27:06 +0100 Subject: Update c.html.markdown --- c.html.markdown | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/c.html.markdown b/c.html.markdown index f44da38e..b5b804af 100644 --- a/c.html.markdown +++ b/c.html.markdown @@ -26,13 +26,15 @@ Multi-line comments look like this. They work in C89 as well. Multi-line comments don't nest /* Be careful */ // comment ends on this line... */ // ...not this one! - // Constants: #define +// Constants: #define #define DAYS_IN_YEAR 365 - // Enumeration constants are also ways to declare constants. - enum days {SUN = 1, MON, TUE, WED, THU, FRI, SAT}; +// Enumeration constants are also ways to declare constants. +// All statements must end with a semicolon +enum days {SUN = 1, MON, TUE, WED, THU, FRI, SAT}; // MON gets 2 automatically, TUE gets 3, etc. + // Import headers with #include #include #include @@ -57,7 +59,6 @@ int main() { // print output using printf, for "print formatted" // %d is an integer, \n is a newline printf("%d\n", 0); // => Prints 0 - // All statements must end with a semicolon /////////////////////////////////////// // Types -- cgit v1.2.3 From 658c09f6e4263e834153907cca87df00e4d9ab3b Mon Sep 17 00:00:00 2001 From: Adam Bard Date: Mon, 8 Dec 2014 23:42:24 +0100 Subject: Update README.markdown --- README.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.markdown b/README.markdown index 4e24bbe6..774797d5 100644 --- a/README.markdown +++ b/README.markdown @@ -22,6 +22,11 @@ Send a pull request or open an issue any time of day or night. **(e.g. [python/en] for English Python).** This will help everyone pick out things they care about. +We're happy for any contribution in any form, but if you're making more than one major change +(i.e. translations for two different languages) it would be super cool of you to make a +separate pull request for each one so that someone can review them more effectively and/or +individually. + ### Style Guidelines * **Keep lines under 80 chars** -- cgit v1.2.3 From 9a8d8f0e5da4af6ddf18124f2cc203dcf57b52e5 Mon Sep 17 00:00:00 2001 From: Adrian Cooney Date: Wed, 10 Dec 2014 12:48:45 +0000 Subject: Added an example of custom Indexers in C-Sharp [en] --- csharp.html.markdown | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/csharp.html.markdown b/csharp.html.markdown index f6708590..47dd9683 100644 --- a/csharp.html.markdown +++ b/csharp.html.markdown @@ -678,6 +678,23 @@ on a new line! ""Wow!"", the masses cried"; private set; } + // It's also possible to define custom Indexers on objects. + // All though this is not entirely useful in this example, you + // could do bicycle[0] which yields "chris" to get the first passenger or + // bicycle[1] = "lisa" to set the passenger. (of this apparent quattrocycle) + private string[] passengers = { "chris", "phil", "darren", "regina" } + + public string this[int i] + { + get { + return passengers[i]; + } + + set { + return passengers[i] = value; + } + } + //Method to display the attribute values of this Object. public virtual string Info() { -- cgit v1.2.3 From 4f2f0116edb8b4a83dba19e9fe61229e8d88d29e Mon Sep 17 00:00:00 2001 From: Jakukyo Friel Date: Wed, 10 Dec 2014 22:57:59 +0800 Subject: lua-cn: typos and refinements. --- zh-cn/lua-cn.html.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zh-cn/lua-cn.html.markdown b/zh-cn/lua-cn.html.markdown index 53a603a2..098d0ab5 100644 --- a/zh-cn/lua-cn.html.markdown +++ b/zh-cn/lua-cn.html.markdown @@ -63,8 +63,8 @@ foo = anUnknownVariable -- 现在 foo = nil. aBoolValue = false ---只有nil和false为假; 0和 ''都均为真! -if not aBoolValue then print('twas false') end +--只有nil和false为假; 0和 ''均为真! +if not aBoolValue then print('false') end -- 'or'和 'and'短路 -- 类似于C/js里的 a?b:c 操作符: @@ -149,7 +149,7 @@ print {} -- 一样可以工作。 -- Table = Lua唯一的组合数据结构; -- 它们是关联数组。 -- 类似于PHP的数组或者js的对象, --- 它们是哈希表或者字典,也可以当初列表使用。 +-- 它们是哈希表或者字典,也可以当列表使用。 -- 按字典/map的方式使用Table: -- cgit v1.2.3 From 3a7e00127fef6f72b36f9b86083928623d3a1ab8 Mon Sep 17 00:00:00 2001 From: "C. Bess" Date: Sat, 13 Dec 2014 20:01:08 -0600 Subject: - update examples, update comments - add another Switch example - add more complex func example - fix playground error - add another casting example --- swift.html.markdown | 69 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/swift.html.markdown b/swift.html.markdown index 005e511c..0d1d2df4 100644 --- a/swift.html.markdown +++ b/swift.html.markdown @@ -6,7 +6,7 @@ contributors: filename: learnswift.swift --- -Swift is a programming language for iOS and OS X development created by Apple. Designed to coexist with Objective-C and to be more resilient against erroneous code, Swift was introduced in 2014 at Apple's developer conference WWDC. It is built with the LLVM compiler included in Xcode 6 beta. +Swift is a programming language for iOS and OS X development created by Apple. Designed to coexist with Objective-C and to be more resilient against erroneous code, Swift was introduced in 2014 at Apple's developer conference WWDC. It is built with the LLVM compiler included in Xcode 6+. The official [Swift Programming Language](https://itunes.apple.com/us/book/swift-programming-language/id881256329) book from Apple is now available via iBooks. @@ -23,7 +23,7 @@ import UIKit // Xcode supports landmarks to annotate your code and lists them in the jump bar // MARK: Section mark // TODO: Do something soon -// FIXME Fix this code +// FIXME: Fix this code println("Hello, world") @@ -55,8 +55,8 @@ println("Build value: \(buildValue)") // Build value: 7 /* Optionals are a Swift language feature that allows you to store a `Some` or `None` value. - - Because Swift requires every property to have a value, even nil must be + + Because Swift requires every property to have a value, even nil must be explicitly stored as an Optional value. Optional is an enum. @@ -94,7 +94,8 @@ var anyObjectVar: AnyObject = 7 anyObjectVar = "Changed value to a string, not good practice, but possible." /* -Comment here + Comment here + /* Nested comments are also supported */ @@ -112,8 +113,9 @@ Comment here // Array var shoppingList = ["catfish", "water", "lemons"] shoppingList[1] = "bottle of water" -let emptyArray = [String]() // immutable -var emptyMutableArray = [String]() // mutable +let emptyArray = [String]() // let == immutable +let emptyArray2 = Array() // same as above +var emptyMutableArray = [String]() // var == mutable // Dictionary @@ -122,8 +124,9 @@ var occupations = [ "kaylee": "Mechanic" ] occupations["Jayne"] = "Public Relations" -let emptyDictionary = [String: Float]() // immutable -var emptyMutableDictionary = [String: Float]() // mutable +let emptyDictionary = [String: Float]() // let == immutable +let emptyDictionary2 = Dictionary() // same as above +var emptyMutableDictionary = [String: Float]() // var == mutable // @@ -165,14 +168,16 @@ do { } while 1 == 2 // Switch +// Very powerful, think `if` statements with syntax candy +// They support String, object instances, and primitives (Int, Double, etc) let vegetable = "red pepper" switch vegetable { case "celery": let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress": let vegetableComment = "That would make a good tea sandwich." -case let x where x.hasSuffix("pepper"): - let vegetableComment = "Is it a spicy \(x)?" +case let localScopeValue where localScopeValue.hasSuffix("pepper"): + let vegetableComment = "Is it a spicy \(localScopeValue)?" default: // required (in order to cover all possible input) let vegetableComment = "Everything tastes good in soup." } @@ -186,21 +191,28 @@ default: // required (in order to cover all possible input) // in functions and can be passed around // Function with Swift header docs (format as reStructedText) + /** -A greet operation + A greet operation -- A bullet in docs -- Another bullet in the docs + - A bullet in docs + - Another bullet in the docs -:param: name A name -:param: day A day -:returns: A string containing the name and day value. + :param: name A name + :param: day A day + :returns: A string containing the name and day value. */ func greet(name: String, day: String) -> String { return "Hello \(name), today is \(day)." } greet("Bob", "Tuesday") +// similar to above except for the function parameter behaviors +func greet2(#requiredName: String, externalParamName localParamName: String) -> String { + return "Hello \(requiredName), the day is \(localParamName)" +} +greet2(requiredName:"John", externalParamName: "Sunday") + // Function that returns multiple items in a tuple func getGasPrices() -> (Double, Double, Double) { return (3.59, 3.69, 3.79) @@ -281,7 +293,7 @@ print(numbers) // [3, 6, 18] // Structures and classes have very similar capabilites struct NamesTable { - let names: [String] + let names = [String]() // Custom subscript subscript(index: Int) -> String { @@ -291,8 +303,8 @@ struct NamesTable { // Structures have an auto-generated (implicit) designated initializer let namesTable = NamesTable(names: ["Me", "Them"]) -//let name = namesTable[2] -//println("Name is \(name)") // Name is Them +let name = namesTable[1] +println("Name is \(name)") // Name is Them // // MARK: Classes @@ -341,7 +353,7 @@ internal class Rect: Shape { init(sideLength: Int) { self.sideLength = sideLength - // always super.init last when init custom properties + // always super.init last when init custom properties super.init() } @@ -368,6 +380,9 @@ print(mySquare.getArea()) // 25 mySquare.shrink() print(mySquare.sideLength) // 4 +// cast instance +let aShape = mySquare as Shape + // compare instances, not the same as == which compares objects (equal to) if mySquare === mySquare { println("Yep, it's mySquare") @@ -393,6 +408,17 @@ enum Suit { } } +// Enum values allow short hand syntax, no need to type the enum type +// when the variable is explicitly declared +var suitValue: Suit = .Hearts + +// Non-Integer enums require direct raw value assignments +enum BookName: String { + case John = "John" + case Luke = "Luke" +} +println("Name: \(BookName.John.rawValue)") + // // MARK: Protocols @@ -490,5 +516,4 @@ println(mySquare.sideLength) // 4 // change side length using custom !!! operator, increases size by 3 !!!mySquare println(mySquare.sideLength) // 12 - ``` -- cgit v1.2.3 From 12e01249b37d65d8e7cf95b311782531978552d5 Mon Sep 17 00:00:00 2001 From: Swapnil Joshi Date: Tue, 16 Dec 2014 22:33:08 +0530 Subject: Changed function name to match function call --- hy.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hy.html.markdown b/hy.html.markdown index 04bd05c9..9beaff0c 100644 --- a/hy.html.markdown +++ b/hy.html.markdown @@ -83,7 +83,7 @@ True ; => True (greet "bilbo") ;=> "hello bilbo" ; functions can take optional arguments as well as keyword arguments -(defn foolist [arg1 &optional [arg2 2]] +(defn foolists [arg1 &optional [arg2 2]] [arg1 arg2]) (foolists 3) ;=> [3 2] -- cgit v1.2.3 From c43b73a369526a922282f429ba7b1472b64c4f8e Mon Sep 17 00:00:00 2001 From: Yuichi Motoyama Date: Sat, 20 Dec 2014 09:52:43 +0900 Subject: start translating julia into japanese --- ja-jp/julia-jp.html.markdown | 747 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 747 insertions(+) create mode 100644 ja-jp/julia-jp.html.markdown diff --git a/ja-jp/julia-jp.html.markdown b/ja-jp/julia-jp.html.markdown new file mode 100644 index 00000000..3a52018c --- /dev/null +++ b/ja-jp/julia-jp.html.markdown @@ -0,0 +1,747 @@ +--- +language: Julia +contributors: + - ["Leah Hanson", "http://leahhanson.us"] +filename: learnjulia.jl +--- + +Julia is a new homoiconic functional language focused on technical computing. +While having the full power of homoiconic macros, first-class functions, and low-level control, Julia is as easy to learn and use as Python. + +This is based on the current development version of Julia, as of October 18th, 2013. + +```ruby + +# Single line comments start with a hash (pound) symbol. +#= Multiline comments can be written + by putting '#=' before the text and '=#' + after the text. They can also be nested. +=# + +#################################################### +## 1. Primitive Datatypes and Operators +#################################################### + +# Everything in Julia is a expression. + +# There are several basic types of numbers. +3 # => 3 (Int64) +3.2 # => 3.2 (Float64) +2 + 1im # => 2 + 1im (Complex{Int64}) +2//3 # => 2//3 (Rational{Int64}) + +# All of the normal infix operators are available. +1 + 1 # => 2 +8 - 1 # => 7 +10 * 2 # => 20 +35 / 5 # => 7.0 +5 / 2 # => 2.5 # dividing an Int by an Int always results in a Float +div(5, 2) # => 2 # for a truncated result, use div +5 \ 35 # => 7.0 +2 ^ 2 # => 4 # power, not bitwise xor +12 % 10 # => 2 + +# Enforce precedence with parentheses +(1 + 3) * 2 # => 8 + +# Bitwise Operators +~2 # => -3 # bitwise not +3 & 5 # => 1 # bitwise and +2 | 4 # => 6 # bitwise or +2 $ 4 # => 6 # bitwise xor +2 >>> 1 # => 1 # logical shift right +2 >> 1 # => 1 # arithmetic shift right +2 << 1 # => 4 # logical/arithmetic shift left + +# You can use the bits function to see the binary representation of a number. +bits(12345) +# => "0000000000000000000000000000000000000000000000000011000000111001" +bits(12345.0) +# => "0100000011001000000111001000000000000000000000000000000000000000" + +# Boolean values are primitives +true +false + +# Boolean operators +!true # => false +!false # => true +1 == 1 # => true +2 == 1 # => false +1 != 1 # => false +2 != 1 # => true +1 < 10 # => true +1 > 10 # => false +2 <= 2 # => true +2 >= 2 # => true +# Comparisons can be chained +1 < 2 < 3 # => true +2 < 3 < 2 # => false + +# Strings are created with " +"This is a string." + +# Character literals are written with ' +'a' + +# A string can be indexed like an array of characters +"This is a string"[1] # => 'T' # Julia indexes from 1 +# However, this is will not work well for UTF8 strings, +# so iterating over strings is recommended (map, for loops, etc). + +# $ can be used for string interpolation: +"2 + 2 = $(2 + 2)" # => "2 + 2 = 4" +# You can put any Julia expression inside the parenthesis. + +# Another way to format strings is the printf macro. +@printf "%d is less than %f" 4.5 5.3 # 5 is less than 5.300000 + +# Printing is easy +println("I'm Julia. Nice to meet you!") + +#################################################### +## 2. Variables and Collections +#################################################### + +# You don't declare variables before assigning to them. +some_var = 5 # => 5 +some_var # => 5 + +# Accessing a previously unassigned variable is an error +try + some_other_var # => ERROR: some_other_var not defined +catch e + println(e) +end + +# Variable names start with a letter. +# After that, you can use letters, digits, underscores, and exclamation points. +SomeOtherVar123! = 6 # => 6 + +# You can also use unicode characters +☃ = 8 # => 8 +# These are especially handy for mathematical notation +2 * π # => 6.283185307179586 + +# A note on naming conventions in Julia: +# +# * Word separation can be indicated by underscores ('_'), but use of +# underscores is discouraged unless the name would be hard to read +# otherwise. +# +# * Names of Types begin with a capital letter and word separation is shown +# with CamelCase instead of underscores. +# +# * Names of functions and macros are in lower case, without underscores. +# +# * Functions that modify their inputs have names that end in !. These +# functions are sometimes called mutating functions or in-place functions. + +# Arrays store a sequence of values indexed by integers 1 through n: +a = Int64[] # => 0-element Int64 Array + +# 1-dimensional array literals can be written with comma-separated values. +b = [4, 5, 6] # => 3-element Int64 Array: [4, 5, 6] +b[1] # => 4 +b[end] # => 6 + +# 2-dimentional arrays use space-separated values and semicolon-separated rows. +matrix = [1 2; 3 4] # => 2x2 Int64 Array: [1 2; 3 4] + +# Add stuff to the end of a list with push! and append! +push!(a,1) # => [1] +push!(a,2) # => [1,2] +push!(a,4) # => [1,2,4] +push!(a,3) # => [1,2,4,3] +append!(a,b) # => [1,2,4,3,4,5,6] + +# Remove from the end with pop +pop!(b) # => 6 and b is now [4,5] + +# Let's put it back +push!(b,6) # b is now [4,5,6] again. + +a[1] # => 1 # remember that Julia indexes from 1, not 0! + +# end is a shorthand for the last index. It can be used in any +# indexing expression +a[end] # => 6 + +# we also have shift and unshift +shift!(a) # => 1 and a is now [2,4,3,4,5,6] +unshift!(a,7) # => [7,2,4,3,4,5,6] + +# Function names that end in exclamations points indicate that they modify +# their argument. +arr = [5,4,6] # => 3-element Int64 Array: [5,4,6] +sort(arr) # => [4,5,6]; arr is still [5,4,6] +sort!(arr) # => [4,5,6]; arr is now [4,5,6] + +# Looking out of bounds is a BoundsError +try + a[0] # => ERROR: BoundsError() in getindex at array.jl:270 + a[end+1] # => ERROR: BoundsError() in getindex at array.jl:270 +catch e + println(e) +end + +# Errors list the line and file they came from, even if it's in the standard +# library. If you built Julia from source, you can look in the folder base +# inside the julia folder to find these files. + +# You can initialize arrays from ranges +a = [1:5] # => 5-element Int64 Array: [1,2,3,4,5] + +# You can look at ranges with slice syntax. +a[1:3] # => [1, 2, 3] +a[2:end] # => [2, 3, 4, 5] + +# Remove elements from an array by index with splice! +arr = [3,4,5] +splice!(arr,2) # => 4 ; arr is now [3,5] + +# Concatenate lists with append! +b = [1,2,3] +append!(a,b) # Now a is [1, 2, 3, 4, 5, 1, 2, 3] + +# Check for existence in a list with in +in(1, a) # => true + +# Examine the length with length +length(a) # => 8 + +# Tuples are immutable. +tup = (1, 2, 3) # => (1,2,3) # an (Int64,Int64,Int64) tuple. +tup[1] # => 1 +try: + tup[1] = 3 # => ERROR: no method setindex!((Int64,Int64,Int64),Int64,Int64) +catch e + println(e) +end + +# Many list functions also work on tuples +length(tup) # => 3 +tup[1:2] # => (1,2) +in(2, tup) # => true + +# You can unpack tuples into variables +a, b, c = (1, 2, 3) # => (1,2,3) # a is now 1, b is now 2 and c is now 3 + +# Tuples are created even if you leave out the parentheses +d, e, f = 4, 5, 6 # => (4,5,6) + +# A 1-element tuple is distinct from the value it contains +(1,) == 1 # => false +(1) == 1 # => true + +# Look how easy it is to swap two values +e, d = d, e # => (5,4) # d is now 5 and e is now 4 + + +# Dictionaries store mappings +empty_dict = Dict() # => Dict{Any,Any}() + +# You can create a dictionary using a literal +filled_dict = ["one"=> 1, "two"=> 2, "three"=> 3] +# => Dict{ASCIIString,Int64} + +# Look up values with [] +filled_dict["one"] # => 1 + +# Get all keys +keys(filled_dict) +# => KeyIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2]) +# Note - dictionary keys are not sorted or in the order you inserted them. + +# Get all values +values(filled_dict) +# => ValueIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2]) +# Note - Same as above regarding key ordering. + +# Check for existence of keys in a dictionary with in, haskey +in(("one", 1), filled_dict) # => true +in(("two", 3), filled_dict) # => false +haskey(filled_dict, "one") # => true +haskey(filled_dict, 1) # => false + +# Trying to look up a non-existant key will raise an error +try + filled_dict["four"] # => ERROR: key not found: four in getindex at dict.jl:489 +catch e + println(e) +end + +# Use the get method to avoid that error by providing a default value +# get(dictionary,key,default_value) +get(filled_dict,"one",4) # => 1 +get(filled_dict,"four",4) # => 4 + +# Use Sets to represent collections of unordered, unique values +empty_set = Set() # => Set{Any}() +# Initialize a set with values +filled_set = Set(1,2,2,3,4) # => Set{Int64}(1,2,3,4) + +# Add more values to a set +push!(filled_set,5) # => Set{Int64}(5,4,2,3,1) + +# Check if the values are in the set +in(2, filled_set) # => true +in(10, filled_set) # => false + +# There are functions for set intersection, union, and difference. +other_set = Set(3, 4, 5, 6) # => Set{Int64}(6,4,5,3) +intersect(filled_set, other_set) # => Set{Int64}(3,4,5) +union(filled_set, other_set) # => Set{Int64}(1,2,3,4,5,6) +setdiff(Set(1,2,3,4),Set(2,3,5)) # => Set{Int64}(1,4) + + +#################################################### +## 3. Control Flow +#################################################### + +# Let's make a variable +some_var = 5 + +# Here is an if statement. Indentation is not meaningful in Julia. +if some_var > 10 + println("some_var is totally bigger than 10.") +elseif some_var < 10 # This elseif clause is optional. + println("some_var is smaller than 10.") +else # The else clause is optional too. + println("some_var is indeed 10.") +end +# => prints "some var is smaller than 10" + + +# For loops iterate over iterables. +# Iterable types include Range, Array, Set, Dict, and String. +for animal=["dog", "cat", "mouse"] + println("$animal is a mammal") + # You can use $ to interpolate variables or expression into strings +end +# prints: +# dog is a mammal +# cat is a mammal +# mouse is a mammal + +# You can use 'in' instead of '='. +for animal in ["dog", "cat", "mouse"] + println("$animal is a mammal") +end +# prints: +# dog is a mammal +# cat is a mammal +# mouse is a mammal + +for a in ["dog"=>"mammal","cat"=>"mammal","mouse"=>"mammal"] + println("$(a[1]) is a $(a[2])") +end +# prints: +# dog is a mammal +# cat is a mammal +# mouse is a mammal + +for (k,v) in ["dog"=>"mammal","cat"=>"mammal","mouse"=>"mammal"] + println("$k is a $v") +end +# prints: +# dog is a mammal +# cat is a mammal +# mouse is a mammal + +# While loops loop while a condition is true +x = 0 +while x < 4 + println(x) + x += 1 # Shorthand for x = x + 1 +end +# prints: +# 0 +# 1 +# 2 +# 3 + +# Handle exceptions with a try/catch block +try + error("help") +catch e + println("caught it $e") +end +# => caught it ErrorException("help") + + +#################################################### +## 4. Functions +#################################################### + +# The keyword 'function' creates new functions +#function name(arglist) +# body... +#end +function add(x, y) + println("x is $x and y is $y") + + # Functions return the value of their last statement + x + y +end + +add(5, 6) # => 11 after printing out "x is 5 and y is 6" + +# You can define functions that take a variable number of +# positional arguments +function varargs(args...) + return args + # use the keyword return to return anywhere in the function +end +# => varargs (generic function with 1 method) + +varargs(1,2,3) # => (1,2,3) + +# The ... is called a splat. +# We just used it in a function definition. +# It can also be used in a fuction call, +# where it will splat an Array or Tuple's contents into the argument list. +Set([1,2,3]) # => Set{Array{Int64,1}}([1,2,3]) # produces a Set of Arrays +Set([1,2,3]...) # => Set{Int64}(1,2,3) # this is equivalent to Set(1,2,3) + +x = (1,2,3) # => (1,2,3) +Set(x) # => Set{(Int64,Int64,Int64)}((1,2,3)) # a Set of Tuples +Set(x...) # => Set{Int64}(2,3,1) + + +# You can define functions with optional positional arguments +function defaults(a,b,x=5,y=6) + return "$a $b and $x $y" +end + +defaults('h','g') # => "h g and 5 6" +defaults('h','g','j') # => "h g and j 6" +defaults('h','g','j','k') # => "h g and j k" +try + defaults('h') # => ERROR: no method defaults(Char,) + defaults() # => ERROR: no methods defaults() +catch e + println(e) +end + +# You can define functions that take keyword arguments +function keyword_args(;k1=4,name2="hello") # note the ; + return ["k1"=>k1,"name2"=>name2] +end + +keyword_args(name2="ness") # => ["name2"=>"ness","k1"=>4] +keyword_args(k1="mine") # => ["k1"=>"mine","name2"=>"hello"] +keyword_args() # => ["name2"=>"hello","k1"=>4] + +# You can combine all kinds of arguments in the same function +function all_the_args(normal_arg, optional_positional_arg=2; keyword_arg="foo") + println("normal arg: $normal_arg") + println("optional arg: $optional_positional_arg") + println("keyword arg: $keyword_arg") +end + +all_the_args(1, 3, keyword_arg=4) +# prints: +# normal arg: 1 +# optional arg: 3 +# keyword arg: 4 + +# Julia has first class functions +function create_adder(x) + adder = function (y) + return x + y + end + return adder +end + +# This is "stabby lambda syntax" for creating anonymous functions +(x -> x > 2)(3) # => true + +# This function is identical to create_adder implementation above. +function create_adder(x) + y -> x + y +end + +# You can also name the internal function, if you want +function create_adder(x) + function adder(y) + x + y + end + adder +end + +add_10 = create_adder(10) +add_10(3) # => 13 + + +# There are built-in higher order functions +map(add_10, [1,2,3]) # => [11, 12, 13] +filter(x -> x > 5, [3, 4, 5, 6, 7]) # => [6, 7] + +# We can use list comprehensions for nicer maps +[add_10(i) for i=[1, 2, 3]] # => [11, 12, 13] +[add_10(i) for i in [1, 2, 3]] # => [11, 12, 13] + +#################################################### +## 5. Types +#################################################### + +# Julia has a type system. +# Every value has a type; variables do not have types themselves. +# You can use the `typeof` function to get the type of a value. +typeof(5) # => Int64 + +# Types are first-class values +typeof(Int64) # => DataType +typeof(DataType) # => DataType +# DataType is the type that represents types, including itself. + +# Types are used for documentation, optimizations, and dispatch. +# They are not statically checked. + +# Users can define types +# They are like records or structs in other languages. +# New types are defined using the `type` keyword. + +# type Name +# field::OptionalType +# ... +# end +type Tiger + taillength::Float64 + coatcolor # not including a type annotation is the same as `::Any` +end + +# The default constructor's arguments are the properties +# of the type, in the order they are listed in the definition +tigger = Tiger(3.5,"orange") # => Tiger(3.5,"orange") + +# The type doubles as the constructor function for values of that type +sherekhan = typeof(tigger)(5.6,"fire") # => Tiger(5.6,"fire") + +# These struct-style types are called concrete types +# They can be instantiated, but cannot have subtypes. +# The other kind of types is abstract types. + +# abstract Name +abstract Cat # just a name and point in the type hierarchy + +# Abstract types cannot be instantiated, but can have subtypes. +# For example, Number is an abstract type +subtypes(Number) # => 6-element Array{Any,1}: + # Complex{Float16} + # Complex{Float32} + # Complex{Float64} + # Complex{T<:Real} + # ImaginaryUnit + # Real +subtypes(Cat) # => 0-element Array{Any,1} + +# Every type has a super type; use the `super` function to get it. +typeof(5) # => Int64 +super(Int64) # => Signed +super(Signed) # => Real +super(Real) # => Number +super(Number) # => Any +super(super(Signed)) # => Number +super(Any) # => Any +# All of these type, except for Int64, are abstract. + +# <: is the subtyping operator +type Lion <: Cat # Lion is a subtype of Cat + mane_color + roar::String +end + +# You can define more constructors for your type +# Just define a function of the same name as the type +# and call an existing constructor to get a value of the correct type +Lion(roar::String) = Lion("green",roar) +# This is an outer constructor because it's outside the type definition + +type Panther <: Cat # Panther is also a subtype of Cat + eye_color + Panther() = new("green") + # Panthers will only have this constructor, and no default constructor. +end +# Using inner constructors, like Panther does, gives you control +# over how values of the type can be created. +# When possible, you should use outer constructors rather than inner ones. + +#################################################### +## 6. Multiple-Dispatch +#################################################### + +# In Julia, all named functions are generic functions +# This means that they are built up from many small methods +# Each constructor for Lion is a method of the generic function Lion. + +# For a non-constructor example, let's make a function meow: + +# Definitions for Lion, Panther, Tiger +function meow(animal::Lion) + animal.roar # access type properties using dot notation +end + +function meow(animal::Panther) + "grrr" +end + +function meow(animal::Tiger) + "rawwwr" +end + +# Testing the meow function +meow(tigger) # => "rawwr" +meow(Lion("brown","ROAAR")) # => "ROAAR" +meow(Panther()) # => "grrr" + +# Review the local type hierarchy +issubtype(Tiger,Cat) # => false +issubtype(Lion,Cat) # => true +issubtype(Panther,Cat) # => true + +# Defining a function that takes Cats +function pet_cat(cat::Cat) + println("The cat says $(meow(cat))") +end + +pet_cat(Lion("42")) # => prints "The cat says 42" +try + pet_cat(tigger) # => ERROR: no method pet_cat(Tiger,) +catch e + println(e) +end + +# In OO languages, single dispatch is common; +# this means that the method is picked based on the type of the first argument. +# In Julia, all of the argument types contribute to selecting the best method. + +# Let's define a function with more arguments, so we can see the difference +function fight(t::Tiger,c::Cat) + println("The $(t.coatcolor) tiger wins!") +end +# => fight (generic function with 1 method) + +fight(tigger,Panther()) # => prints The orange tiger wins! +fight(tigger,Lion("ROAR")) # => prints The orange tiger wins! + +# Let's change the behavior when the Cat is specifically a Lion +fight(t::Tiger,l::Lion) = println("The $(l.mane_color)-maned lion wins!") +# => fight (generic function with 2 methods) + +fight(tigger,Panther()) # => prints The orange tiger wins! +fight(tigger,Lion("ROAR")) # => prints The green-maned lion wins! + +# We don't need a Tiger in order to fight +fight(l::Lion,c::Cat) = println("The victorious cat says $(meow(c))") +# => fight (generic function with 3 methods) + +fight(Lion("balooga!"),Panther()) # => prints The victorious cat says grrr +try + fight(Panther(),Lion("RAWR")) # => ERROR: no method fight(Panther,Lion) +catch +end + +# Also let the cat go first +fight(c::Cat,l::Lion) = println("The cat beats the Lion") +# => Warning: New definition +# fight(Cat,Lion) at none:1 +# is ambiguous with +# fight(Lion,Cat) at none:2. +# Make sure +# fight(Lion,Lion) +# is defined first. +#fight (generic function with 4 methods) + +# This warning is because it's unclear which fight will be called in: +fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The victorious cat says rarrr +# The result may be different in other versions of Julia + +fight(l::Lion,l2::Lion) = println("The lions come to a tie") +fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The lions come to a tie + + +# Under the hood +# You can take a look at the llvm and the assembly code generated. + +square_area(l) = l * l # square_area (generic function with 1 method) + +square_area(5) #25 + +# What happens when we feed square_area an integer? +code_native(square_area, (Int32,)) + # .section __TEXT,__text,regular,pure_instructions + # Filename: none + # Source line: 1 # Prologue + # push RBP + # mov RBP, RSP + # Source line: 1 + # movsxd RAX, EDI # Fetch l from memory? + # imul RAX, RAX # Square l and store the result in RAX + # pop RBP # Restore old base pointer + # ret # Result will still be in RAX + +code_native(square_area, (Float32,)) + # .section __TEXT,__text,regular,pure_instructions + # Filename: none + # Source line: 1 + # push RBP + # mov RBP, RSP + # Source line: 1 + # vmulss XMM0, XMM0, XMM0 # Scalar single precision multiply (AVX) + # pop RBP + # ret + +code_native(square_area, (Float64,)) + # .section __TEXT,__text,regular,pure_instructions + # Filename: none + # Source line: 1 + # push RBP + # mov RBP, RSP + # Source line: 1 + # vmulsd XMM0, XMM0, XMM0 # Scalar double precision multiply (AVX) + # pop RBP + # ret + # +# Note that julia will use floating point instructions if any of the +# arguements are floats. +# Let's calculate the area of a circle +circle_area(r) = pi * r * r # circle_area (generic function with 1 method) +circle_area(5) # 78.53981633974483 + +code_native(circle_area, (Int32,)) + # .section __TEXT,__text,regular,pure_instructions + # Filename: none + # Source line: 1 + # push RBP + # mov RBP, RSP + # Source line: 1 + # vcvtsi2sd XMM0, XMM0, EDI # Load integer (r) from memory + # movabs RAX, 4593140240 # Load pi + # vmulsd XMM1, XMM0, QWORD PTR [RAX] # pi * r + # vmulsd XMM0, XMM0, XMM1 # (pi * r) * r + # pop RBP + # ret + # + +code_native(circle_area, (Float64,)) + # .section __TEXT,__text,regular,pure_instructions + # Filename: none + # Source line: 1 + # push RBP + # mov RBP, RSP + # movabs RAX, 4593140496 + # Source line: 1 + # vmulsd XMM1, XMM0, QWORD PTR [RAX] + # vmulsd XMM0, XMM1, XMM0 + # pop RBP + # ret + # +``` + +## Further Reading + +You can get a lot more detail from [The Julia Manual](http://docs.julialang.org/en/latest/manual/) + +The best place to get help with Julia is the (very friendly) [mailing list](https://groups.google.com/forum/#!forum/julia-users). -- cgit v1.2.3 From 09ab1c3aee929fd9336cecdff6ff2c5d3cd4f06a Mon Sep 17 00:00:00 2001 From: Yuichi Motoyama Date: Sat, 20 Dec 2014 12:33:17 +0900 Subject: finish translating (original english remains for review) --- ja-jp/julia-jp.html.markdown | 232 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 212 insertions(+), 20 deletions(-) diff --git a/ja-jp/julia-jp.html.markdown b/ja-jp/julia-jp.html.markdown index 3a52018c..0c596c99 100644 --- a/ja-jp/julia-jp.html.markdown +++ b/ja-jp/julia-jp.html.markdown @@ -2,9 +2,17 @@ language: Julia contributors: - ["Leah Hanson", "http://leahhanson.us"] -filename: learnjulia.jl +translators: + - ["Yuichi Motoyama", "https://github.com/yomichi"] +filename: learnjulia-jp.jl --- +Julia は科学技術計算向けに作られた、同図像性を持った(homoiconic) プログラミング言語です。 +マクロによる同図像性や第一級関数をもち、なおかつ低階層も扱えるにもかかわらず、 +Julia はPython 並に学習しやすく、使いやすい言語となっています。 + +この文章は、Julia の2013年10月18日現在の開発バージョンを元にしています。 + Julia is a new homoiconic functional language focused on technical computing. While having the full power of homoiconic macros, first-class functions, and low-level control, Julia is as easy to learn and use as Python. @@ -12,6 +20,12 @@ This is based on the current development version of Julia, as of October 18th, 2 ```ruby +# ハッシュ(シャープ)記号から改行までは単一行コメントとなります。 +#= 複数行コメントは、 + '#=' と '=#' とで囲むことで行えます。 + 入れ子構造にすることもできます。 +=# + # Single line comments start with a hash (pound) symbol. #= Multiline comments can be written by putting '#=' before the text and '=#' @@ -20,49 +34,61 @@ This is based on the current development version of Julia, as of October 18th, 2 #################################################### ## 1. Primitive Datatypes and Operators +## 1. 基本的な型と演算子 #################################################### +# Julia ではすべて式となります。 # Everything in Julia is a expression. +# 基本となる数値型がいくつかあります。 # There are several basic types of numbers. 3 # => 3 (Int64) 3.2 # => 3.2 (Float64) 2 + 1im # => 2 + 1im (Complex{Int64}) 2//3 # => 2//3 (Rational{Int64}) +# 一般的な中置演算子が使用可能です。 # All of the normal infix operators are available. 1 + 1 # => 2 8 - 1 # => 7 10 * 2 # => 20 35 / 5 # => 7.0 +5 / 2 # => 2.5 # 整数型同士の割り算の結果は、浮動小数点数型になります 5 / 2 # => 2.5 # dividing an Int by an Int always results in a Float +div(5, 2) # => 2 # 整数のまま割り算するには、 div を使います div(5, 2) # => 2 # for a truncated result, use div 5 \ 35 # => 7.0 +2 ^ 2 # => 4 # べき乗です。排他的論理和ではありません 2 ^ 2 # => 4 # power, not bitwise xor 12 % 10 # => 2 +# 丸括弧で演算の優先順位をコントロールできます # Enforce precedence with parentheses (1 + 3) * 2 # => 8 +# ビット演算 # Bitwise Operators -~2 # => -3 # bitwise not -3 & 5 # => 1 # bitwise and -2 | 4 # => 6 # bitwise or -2 $ 4 # => 6 # bitwise xor -2 >>> 1 # => 1 # logical shift right -2 >> 1 # => 1 # arithmetic shift right -2 << 1 # => 4 # logical/arithmetic shift left - +~2 # => -3 # ビット反転 +3 & 5 # => 1 # ビット積 +2 | 4 # => 6 # ビット和 +2 $ 4 # => 6 # 排他的論理和 +2 >>> 1 # => 1 # 右論理シフト +2 >> 1 # => 1 # 右算術シフト +2 << 1 # => 4 # 左シフト + +# bits 関数を使うことで、数の二進表現を得られます。 # You can use the bits function to see the binary representation of a number. bits(12345) # => "0000000000000000000000000000000000000000000000000011000000111001" bits(12345.0) # => "0100000011001000000111001000000000000000000000000000000000000000" +# ブール値が用意されています # Boolean values are primitives true false +# ブール代数 # Boolean operators !true # => false !false # => true @@ -74,39 +100,51 @@ false 1 > 10 # => false 2 <= 2 # => true 2 >= 2 # => true +# 比較演算子をつなげることもできます # Comparisons can be chained 1 < 2 < 3 # => true 2 < 3 < 2 # => false +# 文字列は " で作れます # Strings are created with " "This is a string." +# 文字リテラルは ' で作れます # Character literals are written with ' 'a' +# 文字列は文字の配列のように添字アクセスできます # A string can be indexed like an array of characters -"This is a string"[1] # => 'T' # Julia indexes from 1 +"This is a string"[1] # => 'T' # Julia では添字は 1 から始まります +# ただし、UTF8 文字列の場合は添字アクセスではうまくいかないので、 +# その場合はイテレーションを行ってください(map 関数や for ループなど) # However, this is will not work well for UTF8 strings, # so iterating over strings is recommended (map, for loops, etc). +# $ を使うことで、文字列に変数や、任意の式を埋め込めます。 # $ can be used for string interpolation: "2 + 2 = $(2 + 2)" # => "2 + 2 = 4" # You can put any Julia expression inside the parenthesis. +# 他にも、printf マクロを使うことでも変数を埋め込めます。 # Another way to format strings is the printf macro. @printf "%d is less than %f" 4.5 5.3 # 5 is less than 5.300000 +# 出力も簡単です # Printing is easy println("I'm Julia. Nice to meet you!") #################################################### ## 2. Variables and Collections +## 2. 変数と配列 #################################################### +# 変数の宣言は不要で、いきなり変数に値を代入・束縛できます。 # You don't declare variables before assigning to them. some_var = 5 # => 5 some_var # => 5 +# 値の束縛されていない変数を使おうとするとエラーになります。 # Accessing a previously unassigned variable is an error try some_other_var # => ERROR: some_other_var not defined @@ -114,40 +152,62 @@ catch e println(e) end +# 変数名は文字から始めます。 +# その後は、文字だけでなく数字やアンダースコア(_), 感嘆符(!)が使えます。 # Variable names start with a letter. # After that, you can use letters, digits, underscores, and exclamation points. SomeOtherVar123! = 6 # => 6 +# Unicode 文字も使えます。 # You can also use unicode characters ☃ = 8 # => 8 +# ギリシャ文字などを使うことで数学的な記法が簡単にかけます。 # These are especially handy for mathematical notation 2 * π # => 6.283185307179586 +# Julia における命名習慣について: # A note on naming conventions in Julia: # +# * 変数名における単語の区切りにはアンダースコアを使っても良いですが、 +# 使わないと読みにくくなる、というわけではない限り、 +# 推奨はされません。 +# # * Word separation can be indicated by underscores ('_'), but use of # underscores is discouraged unless the name would be hard to read # otherwise. # +# * 型名は大文字で始め、単語の区切りはキャメルケースを使います。 +# # * Names of Types begin with a capital letter and word separation is shown # with CamelCase instead of underscores. # +# * 関数やマクロの名前は小文字で書きます。 +# 分かち書きにアンダースコアをつかわず、直接つなげます。 +# # * Names of functions and macros are in lower case, without underscores. # +# * 内部で引数を変更する関数は、名前の最後に ! をつけます。 +# この手の関数は、しばしば「破壊的な関数」とか「in-place な関数」とか呼ばれます。 +# # * Functions that modify their inputs have names that end in !. These # functions are sometimes called mutating functions or in-place functions. +# 配列は、1 から始まる整数によって添字付けられる、値の列です。 # Arrays store a sequence of values indexed by integers 1 through n: a = Int64[] # => 0-element Int64 Array +# 一次元配列は、角括弧 [] のなかにカンマ , 区切りで値を並べることで作ります。 # 1-dimensional array literals can be written with comma-separated values. b = [4, 5, 6] # => 3-element Int64 Array: [4, 5, 6] b[1] # => 4 b[end] # => 6 +# 二次元配列は、空白区切りで作った行を、セミコロンで区切ることで作ります。 # 2-dimentional arrays use space-separated values and semicolon-separated rows. matrix = [1 2; 3 4] # => 2x2 Int64 Array: [1 2; 3 4] +# 配列の終端に値を追加するには push! を、 +# 他の配列を追加するには append! を使います。 # Add stuff to the end of a list with push! and append! push!(a,1) # => [1] push!(a,2) # => [1,2] @@ -155,28 +215,36 @@ push!(a,4) # => [1,2,4] push!(a,3) # => [1,2,4,3] append!(a,b) # => [1,2,4,3,4,5,6] +# 配列の終端から値を削除するには pop! を使います。 # Remove from the end with pop pop!(b) # => 6 and b is now [4,5] +# もう一度戻しましょう。 # Let's put it back push!(b,6) # b is now [4,5,6] again. +a[1] # => 1 # Julia では添字は0 ではなく1 から始まること、お忘れなく! a[1] # => 1 # remember that Julia indexes from 1, not 0! +# end は最後の添字を表す速記法です。 +# 添字を書く場所ならどこにでも使えます。 # end is a shorthand for the last index. It can be used in any # indexing expression a[end] # => 6 +# 先頭に対する追加・削除は shift!, unshift! です。 # we also have shift and unshift shift!(a) # => 1 and a is now [2,4,3,4,5,6] unshift!(a,7) # => [7,2,4,3,4,5,6] +# ! で終わる関数名は、その引数を変更するということを示します。 # Function names that end in exclamations points indicate that they modify # their argument. arr = [5,4,6] # => 3-element Int64 Array: [5,4,6] sort(arr) # => [4,5,6]; arr is still [5,4,6] sort!(arr) # => [4,5,6]; arr is now [4,5,6] +# 配列の範囲外アクセスをすると BoundsError が発生します。 # Looking out of bounds is a BoundsError try a[0] # => ERROR: BoundsError() in getindex at array.jl:270 @@ -185,31 +253,40 @@ catch e println(e) end +# エラーが発生すると、どのファイルのどの行で発生したかが表示されます。 # Errors list the line and file they came from, even if it's in the standard # library. If you built Julia from source, you can look in the folder base # inside the julia folder to find these files. +# 配列は範囲オブジェクトから作ることもできます。 # You can initialize arrays from ranges a = [1:5] # => 5-element Int64 Array: [1,2,3,4,5] +# 添字として範囲オブジェクトを渡すことで、 +# 配列の部分列を得ることもできます。 # You can look at ranges with slice syntax. a[1:3] # => [1, 2, 3] a[2:end] # => [2, 3, 4, 5] +# 添字を用いて配列から値の削除をしたい場合は、splice! を使います。 # Remove elements from an array by index with splice! arr = [3,4,5] splice!(arr,2) # => 4 ; arr is now [3,5] +# 配列の結合は append! です。 # Concatenate lists with append! b = [1,2,3] append!(a,b) # Now a is [1, 2, 3, 4, 5, 1, 2, 3] +# 配列内に指定した値があるかどうかを調べるのには in を使います。 # Check for existence in a list with in in(1, a) # => true +# length で配列の長さを取得できます。 # Examine the length with length length(a) # => 8 +# 変更不可能 (immutable) な値の組として、タプルが使えます。 # Tuples are immutable. tup = (1, 2, 3) # => (1,2,3) # an (Int64,Int64,Int64) tuple. tup[1] # => 1 @@ -219,51 +296,65 @@ catch e println(e) end +# 配列に関する関数の多くが、タプルでも使えます。 # Many list functions also work on tuples length(tup) # => 3 tup[1:2] # => (1,2) in(2, tup) # => true +# タプルから値をばらして(unpack して) 複数の変数に代入できます。 # You can unpack tuples into variables a, b, c = (1, 2, 3) # => (1,2,3) # a is now 1, b is now 2 and c is now 3 +# 丸括弧なしでもタプルになります。 # Tuples are created even if you leave out the parentheses d, e, f = 4, 5, 6 # => (4,5,6) +# ひとつの値だけからなるタプルは、その値自体とは区別されます。 # A 1-element tuple is distinct from the value it contains (1,) == 1 # => false (1) == 1 # => true +# 値の交換もタプルを使えば簡単です。 # Look how easy it is to swap two values e, d = d, e # => (5,4) # d is now 5 and e is now 4 +# 辞書 (Dict) は、値から値への変換の集合です。 # Dictionaries store mappings empty_dict = Dict() # => Dict{Any,Any}() +# 辞書型リテラルは次のとおりです。 # You can create a dictionary using a literal filled_dict = ["one"=> 1, "two"=> 2, "three"=> 3] # => Dict{ASCIIString,Int64} +# [] を使ったアクセスができます。 # Look up values with [] filled_dict["one"] # => 1 +# すべての鍵(添字)は keys で得られます。 # Get all keys keys(filled_dict) # => KeyIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2]) +# 必ずしも辞書に追加した順番には並んでいないことに注意してください。 # Note - dictionary keys are not sorted or in the order you inserted them. +# 同様に、values はすべての値を返します。 # Get all values values(filled_dict) # => ValueIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2]) +# 鍵と同様に、必ずしも辞書に追加した順番には並んでいないことに注意してください。 # Note - Same as above regarding key ordering. +# in や haskey を使うことで、要素や鍵が辞書の中にあるかを調べられます。 # Check for existence of keys in a dictionary with in, haskey in(("one", 1), filled_dict) # => true in(("two", 3), filled_dict) # => false haskey(filled_dict, "one") # => true haskey(filled_dict, 1) # => false +# 存在しない鍵を問い合わせると、エラーが発生します。 # Trying to look up a non-existant key will raise an error try filled_dict["four"] # => ERROR: key not found: four in getindex at dict.jl:489 @@ -271,23 +362,30 @@ catch e println(e) end +# get 関数を使い、鍵がなかった場合のデフォルト値を与えておくことで、 +# このエラーを回避できます。 # Use the get method to avoid that error by providing a default value # get(dictionary,key,default_value) get(filled_dict,"one",4) # => 1 get(filled_dict,"four",4) # => 4 +# 集合 (Set) は一意な値の、順序付けられていない集まりです。 # Use Sets to represent collections of unordered, unique values empty_set = Set() # => Set{Any}() +# 集合の初期化 # Initialize a set with values filled_set = Set(1,2,2,3,4) # => Set{Int64}(1,2,3,4) +# 集合への追加 # Add more values to a set push!(filled_set,5) # => Set{Int64}(5,4,2,3,1) +# in で、値が既に存在するかを調べられます。 # Check if the values are in the set in(2, filled_set) # => true in(10, filled_set) # => false +# 積集合や和集合、差集合を得る関数も用意されています。 # There are functions for set intersection, union, and difference. other_set = Set(3, 4, 5, 6) # => Set{Int64}(6,4,5,3) intersect(filled_set, other_set) # => Set{Int64}(3,4,5) @@ -297,26 +395,32 @@ setdiff(Set(1,2,3,4),Set(2,3,5)) # => Set{Int64}(1,4) #################################################### ## 3. Control Flow +## 3. 制御構文 #################################################### +# まずは変数を作ります。 # Let's make a variable some_var = 5 +# if 構文です。Julia ではインデントに意味はありません。 # Here is an if statement. Indentation is not meaningful in Julia. if some_var > 10 println("some_var is totally bigger than 10.") -elseif some_var < 10 # This elseif clause is optional. +elseif some_var < 10 # elseif 節は省略可能です。 println("some_var is smaller than 10.") -else # The else clause is optional too. +else # else 節も省略可能です。 println("some_var is indeed 10.") end -# => prints "some var is smaller than 10" - +# => "some var is smaller than 10" と出力されます。 +# for ループによって、反復可能なオブジェクトを走査できます。 +# 反復可能なオブジェクトの型として、 +# Range, Array, Set, Dict, String などがあります。 # For loops iterate over iterables. # Iterable types include Range, Array, Set, Dict, and String. for animal=["dog", "cat", "mouse"] println("$animal is a mammal") + # $ を使うことで文字列に変数の値を埋め込めます。 # You can use $ to interpolate variables or expression into strings end # prints: @@ -324,6 +428,7 @@ end # cat is a mammal # mouse is a mammal +# for = の代わりに for in を使うこともできます # You can use 'in' instead of '='. for animal in ["dog", "cat", "mouse"] println("$animal is a mammal") @@ -349,6 +454,7 @@ end # cat is a mammal # mouse is a mammal +# while ループは、条件式がtrue となる限り実行され続けます。 # While loops loop while a condition is true x = 0 while x < 4 @@ -361,6 +467,7 @@ end # 2 # 3 +# 例外は try/catch で捕捉できます。 # Handle exceptions with a try/catch block try error("help") @@ -372,8 +479,10 @@ end #################################################### ## 4. Functions +## 4. 関数 #################################################### +# function キーワードを次のように使うことで、新しい関数を定義できます。 # The keyword 'function' creates new functions #function name(arglist) # body... @@ -381,34 +490,42 @@ end function add(x, y) println("x is $x and y is $y") + # 最後に評価された式の値が、関数全体の返り値となります。 # Functions return the value of their last statement x + y end add(5, 6) # => 11 after printing out "x is 5 and y is 6" +# 可変長引数関数も定義できます。 # You can define functions that take a variable number of # positional arguments function varargs(args...) return args + # return キーワードを使うことで、好きな位置で関数から抜けられます。 # use the keyword return to return anywhere in the function end # => varargs (generic function with 1 method) varargs(1,2,3) # => (1,2,3) +# ... はsplat と呼ばれます +# (訳注:「ピシャッという音(名詞)」「衝撃で平らにする(動詞)」) +# 今回は関数定義で使いましたが、関数呼び出しに使うこともできます。 +# その場合、配列やタプルの要素を開いて、複数の引数へと割り当てることとなります。 # The ... is called a splat. # We just used it in a function definition. # It can also be used in a fuction call, # where it will splat an Array or Tuple's contents into the argument list. -Set([1,2,3]) # => Set{Array{Int64,1}}([1,2,3]) # produces a Set of Arrays -Set([1,2,3]...) # => Set{Int64}(1,2,3) # this is equivalent to Set(1,2,3) +Set([1,2,3]) # => Set{Array{Int64,1}}([1,2,3]) # 「整数の配列」の集合 +Set([1,2,3]...) # => Set{Int64}(1,2,3) # 整数の集合 x = (1,2,3) # => (1,2,3) -Set(x) # => Set{(Int64,Int64,Int64)}((1,2,3)) # a Set of Tuples +Set(x) # => Set{(Int64,Int64,Int64)}((1,2,3)) # タプルの集合 Set(x...) # => Set{Int64}(2,3,1) +# 引数に初期値を与えることで、オプション引数をもった関数を定義できます。 # You can define functions with optional positional arguments function defaults(a,b,x=5,y=6) return "$a $b and $x $y" @@ -424,8 +541,9 @@ catch e println(e) end +# キーワード引数を持った関数も作れます。 # You can define functions that take keyword arguments -function keyword_args(;k1=4,name2="hello") # note the ; +function keyword_args(;k1=4,name2="hello") # ; が必要なことに注意 return ["k1"=>k1,"name2"=>name2] end @@ -433,6 +551,7 @@ keyword_args(name2="ness") # => ["name2"=>"ness","k1"=>4] keyword_args(k1="mine") # => ["k1"=>"mine","name2"=>"hello"] keyword_args() # => ["name2"=>"hello","k1"=>4] +# もちろん、これらを組み合わせることもできます。 # You can combine all kinds of arguments in the same function function all_the_args(normal_arg, optional_positional_arg=2; keyword_arg="foo") println("normal arg: $normal_arg") @@ -446,6 +565,7 @@ all_the_args(1, 3, keyword_arg=4) # optional arg: 3 # keyword arg: 4 +# Julia では関数は第一級関数として、値として扱われます。 # Julia has first class functions function create_adder(x) adder = function (y) @@ -454,14 +574,17 @@ function create_adder(x) return adder end +# ラムダ式によって無名関数をつくれます。 # This is "stabby lambda syntax" for creating anonymous functions (x -> x > 2)(3) # => true +# 先ほどの create_adder と同じもの # This function is identical to create_adder implementation above. function create_adder(x) y -> x + y end +# 中の関数に名前をつけても構いません。 # You can also name the internal function, if you want function create_adder(x) function adder(y) @@ -474,31 +597,44 @@ add_10 = create_adder(10) add_10(3) # => 13 +# いくつかの高階関数が定義されています。 # There are built-in higher order functions map(add_10, [1,2,3]) # => [11, 12, 13] filter(x -> x > 5, [3, 4, 5, 6, 7]) # => [6, 7] +# map の代わりとしてリスト内包表記も使えます。 # We can use list comprehensions for nicer maps [add_10(i) for i=[1, 2, 3]] # => [11, 12, 13] [add_10(i) for i in [1, 2, 3]] # => [11, 12, 13] #################################################### ## 5. Types +## 5. 型 #################################################### +# Julia ではすべての値にひとつの型がついています。 +# 変数に、ではなくて値に、です。 +# typeof 関数を使うことで、値が持つ型を取得できます。 # Julia has a type system. # Every value has a type; variables do not have types themselves. # You can use the `typeof` function to get the type of a value. typeof(5) # => Int64 +# 型自身もまた、第一級の値であり、型を持っています。 # Types are first-class values typeof(Int64) # => DataType typeof(DataType) # => DataType +# DataType は型を表現する型であり、DataType 自身もDataType 型の値です。 # DataType is the type that represents types, including itself. +# 型はドキュメント化や最適化、関数ディスパッチのために使われます。 +# 静的な型チェックは行われません。 # Types are used for documentation, optimizations, and dispatch. # They are not statically checked. +# 自分で新しい型を定義することもできます。 +# 他の言語で言う、構造体やレコードに近いものになっています。 +# 型定義には type キーワードを使います。 # Users can define types # They are like records or structs in other languages. # New types are defined using the `type` keyword. @@ -509,23 +645,33 @@ typeof(DataType) # => DataType # end type Tiger taillength::Float64 + coatcolor # 型注釈を省略した場合、自動的に :: Any として扱われます。 coatcolor # not including a type annotation is the same as `::Any` end +# 型を定義すると、その型のプロパティすべてを、定義した順番に +# 引数として持つデフォルトコンストラクタが自動的に作られます。 # The default constructor's arguments are the properties # of the type, in the order they are listed in the definition tigger = Tiger(3.5,"orange") # => Tiger(3.5,"orange") +# 型名がそのままコンストラクタ名(関数名)となります。 # The type doubles as the constructor function for values of that type sherekhan = typeof(tigger)(5.6,"fire") # => Tiger(5.6,"fire") +# このような、構造体スタイルの型は、具体型(concrete type)と呼ばれます。 +# 具体型はインスタンス化可能ですが、派生型(subtype)を持つことができません。 +# 具体型の他には抽象型(abstract type)があります。 # These struct-style types are called concrete types # They can be instantiated, but cannot have subtypes. # The other kind of types is abstract types. # abstract Name +abstract Cat # 型の階層図の途中の一点を指し示す名前となります。 abstract Cat # just a name and point in the type hierarchy +# 抽象型はインスタンス化できませんが、派生型を持つことができます。 +# 例えば、 Number は以下の派生型を持つ抽象型です。 # Abstract types cannot be instantiated, but can have subtypes. # For example, Number is an abstract type subtypes(Number) # => 6-element Array{Any,1}: @@ -537,6 +683,8 @@ subtypes(Number) # => 6-element Array{Any,1}: # Real subtypes(Cat) # => 0-element Array{Any,1} +# すべての型は、直接的にはただひとつの基本型(supertype) を持ちます。 +# super 関数でこれを取得可能です。 # Every type has a super type; use the `super` function to get it. typeof(5) # => Int64 super(Int64) # => Signed @@ -545,41 +693,60 @@ super(Real) # => Number super(Number) # => Any super(super(Signed)) # => Number super(Any) # => Any +# Int64 を除き、これらはすべて抽象型です。 # All of these type, except for Int64, are abstract. +# <: は派生形を表す演算子です。 +# これを使うことで派生型を定義できます。 # <: is the subtyping operator -type Lion <: Cat # Lion is a subtype of Cat +type Lion <: Cat # Lion は 抽象型 Cat の派生型 mane_color roar::String end +# 型名と同じ名前の関数を定義し、既に存在するコンストラクタを呼び出して、 +# 必要とする型の値を返すことによって、 +# デフォルトコンストラクタ以外のコンストラクタを作ることができます。 + # You can define more constructors for your type # Just define a function of the same name as the type # and call an existing constructor to get a value of the correct type Lion(roar::String) = Lion("green",roar) +# 型定義の外側で定義されたコンストラクタなので、外部コンストラクタと呼ばれます。 # This is an outer constructor because it's outside the type definition -type Panther <: Cat # Panther is also a subtype of Cat +type Panther <: Cat # Panther も Cat の派生型 eye_color Panther() = new("green") + # Panther は内部コンストラクタとしてこれのみを持ち、 + # デフォルトコンストラクタを持たない # Panthers will only have this constructor, and no default constructor. end +# 内部コンストラクタを使うことで、どのような値が作られるのかをコントロールすることができます。 +# 出来る限り、外部コンストラクタを使うべきです。 # Using inner constructors, like Panther does, gives you control # over how values of the type can be created. # When possible, you should use outer constructors rather than inner ones. #################################################### ## 6. Multiple-Dispatch +## 6. 多重ディスパッチ #################################################### +# Julia では、すべての名前付きの関数は総称的関数(generic function) です。 +# これは、関数はいくつかの細かいメソッドの集合である、という意味です。 +# 例えば先の Lion 型のコンストラクタ Lion は、Lion という関数の1つのメソッドです。 # In Julia, all named functions are generic functions # This means that they are built up from many small methods # Each constructor for Lion is a method of the generic function Lion. +# コンストラクタ以外の例をみるために、新たに meow 関数を作りましょう。 # For a non-constructor example, let's make a function meow: +# Lion, Panther, Tiger 型それぞれに対する meow 関数のメソッド定義 # Definitions for Lion, Panther, Tiger function meow(animal::Lion) + animal.roar # 型のプロパティには . でアクセスできます。 animal.roar # access type properties using dot notation end @@ -591,16 +758,19 @@ function meow(animal::Tiger) "rawwwr" end +# meow 関数の実行 # Testing the meow function meow(tigger) # => "rawwr" meow(Lion("brown","ROAAR")) # => "ROAAR" meow(Panther()) # => "grrr" +# 型の階層関係を見てみましょう # Review the local type hierarchy issubtype(Tiger,Cat) # => false issubtype(Lion,Cat) # => true issubtype(Panther,Cat) # => true +# 抽象型 Cat の派生型を引数にとる関数 # Defining a function that takes Cats function pet_cat(cat::Cat) println("The cat says $(meow(cat))") @@ -613,10 +783,15 @@ catch e println(e) end +# オブジェクト指向言語では、一般的にシングルディスパッチが用いられます。 +# つまり、関数に複数あるメソッドのうちにどれが呼ばれるかは、 +# その第一引数によってのみ決定されます。 +# 一方でJulia では、すべての引数の型が、このメソッド決定に寄与します。 # In OO languages, single dispatch is common; # this means that the method is picked based on the type of the first argument. # In Julia, all of the argument types contribute to selecting the best method. +# 多変数関数を定義して、この辺りを見て行きましょう。 # Let's define a function with more arguments, so we can see the difference function fight(t::Tiger,c::Cat) println("The $(t.coatcolor) tiger wins!") @@ -626,6 +801,7 @@ end fight(tigger,Panther()) # => prints The orange tiger wins! fight(tigger,Lion("ROAR")) # => prints The orange tiger wins! +# 第二引数の Cat が実際は Lion だった時に、挙動が変わるようにします。 # Let's change the behavior when the Cat is specifically a Lion fight(t::Tiger,l::Lion) = println("The $(l.mane_color)-maned lion wins!") # => fight (generic function with 2 methods) @@ -633,6 +809,7 @@ fight(t::Tiger,l::Lion) = println("The $(l.mane_color)-maned lion wins!") fight(tigger,Panther()) # => prints The orange tiger wins! fight(tigger,Lion("ROAR")) # => prints The green-maned lion wins! +# 別に Tiger だけが戦う必要もないですね。 # We don't need a Tiger in order to fight fight(l::Lion,c::Cat) = println("The victorious cat says $(meow(c))") # => fight (generic function with 3 methods) @@ -643,6 +820,7 @@ try catch end +# 第一引数にも Cat を許しましょう。 # Also let the cat go first fight(c::Cat,l::Lion) = println("The cat beats the Lion") # => Warning: New definition @@ -654,14 +832,17 @@ fight(c::Cat,l::Lion) = println("The cat beats the Lion") # is defined first. #fight (generic function with 4 methods) +# 警告が出ましたが、これは次の対戦で何が起きるのかが不明瞭だからです。 # This warning is because it's unclear which fight will be called in: fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The victorious cat says rarrr +# Julia のバージョンによっては、結果が違うかもしれません。 # The result may be different in other versions of Julia fight(l::Lion,l2::Lion) = println("The lions come to a tie") fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The lions come to a tie +# Julia が生成する LLVM 内部表現や、アセンブリを調べることもできます。 # Under the hood # You can take a look at the llvm and the assembly code generated. @@ -669,6 +850,7 @@ square_area(l) = l * l # square_area (generic function with 1 method) square_area(5) #25 +# square_area に整数を渡すと何が起きる? # What happens when we feed square_area an integer? code_native(square_area, (Int32,)) # .section __TEXT,__text,regular,pure_instructions @@ -704,6 +886,10 @@ code_native(square_area, (Float64,)) # pop RBP # ret # + +# Julia では、浮動小数点数と整数との演算では +# 自動的に浮動小数点数用の命令が生成されることに注意してください。 +# 円の面積を計算してみましょう。 # Note that julia will use floating point instructions if any of the # arguements are floats. # Let's calculate the area of a circle @@ -740,8 +926,14 @@ code_native(circle_area, (Float64,)) # ``` +## より勉強するために ## Further Reading +[公式ドキュメント](http://docs.julialang.org/en/latest/manual/) (英語)にはより詳細な解説が記されています。 + You can get a lot more detail from [The Julia Manual](http://docs.julialang.org/en/latest/manual/) +Julia に関して助けが必要ならば、[メーリングリスト](https://groups.google.com/forum/#!forum/julia-users) が役に立ちます。 +みんな非常に親密に教えてくれます。 + The best place to get help with Julia is the (very friendly) [mailing list](https://groups.google.com/forum/#!forum/julia-users). -- cgit v1.2.3 From 6027c90c90a55702d003f17a72fd82ed7f870be0 Mon Sep 17 00:00:00 2001 From: Artur Mkrtchyan Date: Sat, 20 Dec 2014 23:03:25 +0100 Subject: Scala compiler fails to infer the return type when there's an explicit return statement --- scala.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scala.html.markdown b/scala.html.markdown index 5a478f2a..35645922 100644 --- a/scala.html.markdown +++ b/scala.html.markdown @@ -199,7 +199,7 @@ weirdSum(2, 4) // => 16 // The return keyword exists in Scala, but it only returns from the inner-most // def that surrounds it. It has no effect on anonymous functions. For example: -def foo(x: Int) = { +def foo(x: Int): Int = { val anonFunc: Int => Int = { z => if (z > 5) return z // This line makes z the return value of foo! -- cgit v1.2.3 From 6dca0e7ae41140765cb3b0c1513cfa897294efe5 Mon Sep 17 00:00:00 2001 From: Artur Mkrtchyan Date: Sun, 21 Dec 2014 13:08:21 +0100 Subject: Fixed Person class' constructor signature --- scala.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scala.html.markdown b/scala.html.markdown index 5a478f2a..544abd5b 100644 --- a/scala.html.markdown +++ b/scala.html.markdown @@ -476,7 +476,7 @@ sSquared.reduce (_+_) // The filter function takes a predicate (a function from A -> Boolean) and // selects all elements which satisfy the predicate List(1, 2, 3) filter (_ > 2) // List(3) -case class Person(name:String, phoneNumber:String) +case class Person(name:String, age:Int) List( Person(name = "Dom", age = 23), Person(name = "Bob", age = 30) -- cgit v1.2.3 From c4e1109e3aeef641798a59daf56f82aa60dc81ff Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 22 Dec 2014 13:35:46 +1100 Subject: Remove spurious "[" --- java.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java.html.markdown b/java.html.markdown index f08c4679..32febcfd 100644 --- a/java.html.markdown +++ b/java.html.markdown @@ -49,7 +49,7 @@ public class LearnJava { // Types & Variables /////////////////////////////////////// - // Declare a variable using [ + // Declare a variable using // Byte - 8-bit signed two's complement integer // (-128 <= byte <= 127) byte fooByte = 100; -- cgit v1.2.3 From c9ae9ea396cae5c357511cecb3a308740409302a Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 22 Dec 2014 13:37:03 +1100 Subject: Spelling corrrection --- java.html.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java.html.markdown b/java.html.markdown index f08c4679..d77d1c23 100644 --- a/java.html.markdown +++ b/java.html.markdown @@ -268,9 +268,9 @@ public class LearnJava { System.out.println(bar); // Prints A, because the statement is true - /////////////////////////////////////// - // Converting Data Types And Typcasting - /////////////////////////////////////// + //////////////////////////////////////// + // Converting Data Types And Typecasting + //////////////////////////////////////// // Converting data -- cgit v1.2.3 From 7915169dde85bfd7afdfc2398440b6db7ec28682 Mon Sep 17 00:00:00 2001 From: Yuichi Motoyama Date: Mon, 22 Dec 2014 14:45:11 +0900 Subject: finish translating X=Julia into Japanese --- ja-jp/julia-jp.html.markdown | 240 ++++++------------------------------------- 1 file changed, 31 insertions(+), 209 deletions(-) diff --git a/ja-jp/julia-jp.html.markdown b/ja-jp/julia-jp.html.markdown index 0c596c99..0c1d7e49 100644 --- a/ja-jp/julia-jp.html.markdown +++ b/ja-jp/julia-jp.html.markdown @@ -8,88 +8,67 @@ filename: learnjulia-jp.jl --- Julia は科学技術計算向けに作られた、同図像性を持った(homoiconic) プログラミング言語です。 -マクロによる同図像性や第一級関数をもち、なおかつ低階層も扱えるにもかかわらず、 -Julia はPython 並に学習しやすく、使いやすい言語となっています。 +マクロによる同図像性や第一級関数などの抽象化機能の恩恵を受けつつ、低階層をも扱えますが、 +それでいてPython 並に学習しやすく、使いやすい言語となっています。 この文章は、Julia の2013年10月18日現在の開発バージョンを元にしています。 -Julia is a new homoiconic functional language focused on technical computing. -While having the full power of homoiconic macros, first-class functions, and low-level control, Julia is as easy to learn and use as Python. - -This is based on the current development version of Julia, as of October 18th, 2013. - ```ruby # ハッシュ(シャープ)記号から改行までは単一行コメントとなります。 #= 複数行コメントは、 '#=' と '=#' とで囲むことで行えます。 + #= 入れ子構造にすることもできます。 -=# - -# Single line comments start with a hash (pound) symbol. -#= Multiline comments can be written - by putting '#=' before the text and '=#' - after the text. They can also be nested. + =# =# #################################################### -## 1. Primitive Datatypes and Operators ## 1. 基本的な型と演算子 #################################################### # Julia ではすべて式となります。 -# Everything in Julia is a expression. # 基本となる数値型がいくつかあります。 -# There are several basic types of numbers. 3 # => 3 (Int64) 3.2 # => 3.2 (Float64) 2 + 1im # => 2 + 1im (Complex{Int64}) 2//3 # => 2//3 (Rational{Int64}) # 一般的な中置演算子が使用可能です。 -# All of the normal infix operators are available. 1 + 1 # => 2 8 - 1 # => 7 10 * 2 # => 20 35 / 5 # => 7.0 5 / 2 # => 2.5 # 整数型同士の割り算の結果は、浮動小数点数型になります -5 / 2 # => 2.5 # dividing an Int by an Int always results in a Float div(5, 2) # => 2 # 整数のまま割り算するには、 div を使います -div(5, 2) # => 2 # for a truncated result, use div 5 \ 35 # => 7.0 2 ^ 2 # => 4 # べき乗です。排他的論理和ではありません -2 ^ 2 # => 4 # power, not bitwise xor 12 % 10 # => 2 # 丸括弧で演算の優先順位をコントロールできます -# Enforce precedence with parentheses (1 + 3) * 2 # => 8 # ビット演算 -# Bitwise Operators ~2 # => -3 # ビット反転 3 & 5 # => 1 # ビット積 2 | 4 # => 6 # ビット和 -2 $ 4 # => 6 # 排他的論理和 +2 $ 4 # => 6 # ビット排他的論理和 2 >>> 1 # => 1 # 右論理シフト 2 >> 1 # => 1 # 右算術シフト 2 << 1 # => 4 # 左シフト # bits 関数を使うことで、数の二進表現を得られます。 -# You can use the bits function to see the binary representation of a number. bits(12345) # => "0000000000000000000000000000000000000000000000000011000000111001" bits(12345.0) # => "0100000011001000000111001000000000000000000000000000000000000000" # ブール値が用意されています -# Boolean values are primitives true false # ブール代数 -# Boolean operators !true # => false !false # => true 1 == 1 # => true @@ -101,151 +80,109 @@ false 2 <= 2 # => true 2 >= 2 # => true # 比較演算子をつなげることもできます -# Comparisons can be chained 1 < 2 < 3 # => true 2 < 3 < 2 # => false # 文字列は " で作れます -# Strings are created with " "This is a string." # 文字リテラルは ' で作れます -# Character literals are written with ' 'a' # 文字列は文字の配列のように添字アクセスできます -# A string can be indexed like an array of characters "This is a string"[1] # => 'T' # Julia では添字は 1 から始まります # ただし、UTF8 文字列の場合は添字アクセスではうまくいかないので、 -# その場合はイテレーションを行ってください(map 関数や for ループなど) -# However, this is will not work well for UTF8 strings, -# so iterating over strings is recommended (map, for loops, etc). +# イテレーションを行ってください(map 関数や for ループなど) # $ を使うことで、文字列に変数や、任意の式を埋め込めます。 -# $ can be used for string interpolation: "2 + 2 = $(2 + 2)" # => "2 + 2 = 4" -# You can put any Julia expression inside the parenthesis. # 他にも、printf マクロを使うことでも変数を埋め込めます。 -# Another way to format strings is the printf macro. @printf "%d is less than %f" 4.5 5.3 # 5 is less than 5.300000 # 出力も簡単です -# Printing is easy println("I'm Julia. Nice to meet you!") #################################################### -## 2. Variables and Collections -## 2. 変数と配列 +## 2. 変数と配列、タプル、集合、辞書 #################################################### # 変数の宣言は不要で、いきなり変数に値を代入・束縛できます。 -# You don't declare variables before assigning to them. some_var = 5 # => 5 some_var # => 5 -# 値の束縛されていない変数を使おうとするとエラーになります。 -# Accessing a previously unassigned variable is an error +# 値に束縛されていない変数を使おうとするとエラーになります。 try some_other_var # => ERROR: some_other_var not defined catch e println(e) end -# 変数名は文字から始めます。 -# その後は、文字だけでなく数字やアンダースコア(_), 感嘆符(!)が使えます。 -# Variable names start with a letter. -# After that, you can use letters, digits, underscores, and exclamation points. +# 変数名は数字や記号以外の文字から始めます。 +# その後は、数字やアンダースコア(_), 感嘆符(!)も使えます。 SomeOtherVar123! = 6 # => 6 # Unicode 文字も使えます。 -# You can also use unicode characters ☃ = 8 # => 8 # ギリシャ文字などを使うことで数学的な記法が簡単にかけます。 -# These are especially handy for mathematical notation 2 * π # => 6.283185307179586 # Julia における命名習慣について: -# A note on naming conventions in Julia: # # * 変数名における単語の区切りにはアンダースコアを使っても良いですが、 # 使わないと読みにくくなる、というわけではない限り、 # 推奨はされません。 # -# * Word separation can be indicated by underscores ('_'), but use of -# underscores is discouraged unless the name would be hard to read -# otherwise. -# -# * 型名は大文字で始め、単語の区切りはキャメルケースを使います。 -# -# * Names of Types begin with a capital letter and word separation is shown -# with CamelCase instead of underscores. +# * 型名は大文字で始め、単語の区切りにはキャメルケースを使います。 # # * 関数やマクロの名前は小文字で書きます。 -# 分かち書きにアンダースコアをつかわず、直接つなげます。 -# -# * Names of functions and macros are in lower case, without underscores. +# 単語の分かち書きにはアンダースコアをつかわず、直接つなげます。 # # * 内部で引数を変更する関数は、名前の最後に ! をつけます。 # この手の関数は、しばしば「破壊的な関数」とか「in-place な関数」とか呼ばれます。 -# -# * Functions that modify their inputs have names that end in !. These -# functions are sometimes called mutating functions or in-place functions. + # 配列は、1 から始まる整数によって添字付けられる、値の列です。 -# Arrays store a sequence of values indexed by integers 1 through n: a = Int64[] # => 0-element Int64 Array -# 一次元配列は、角括弧 [] のなかにカンマ , 区切りで値を並べることで作ります。 -# 1-dimensional array literals can be written with comma-separated values. +# 一次元配列(列ベクトル)は、角括弧 [] のなかにカンマ , 区切りで値を並べることで作ります。 b = [4, 5, 6] # => 3-element Int64 Array: [4, 5, 6] b[1] # => 4 b[end] # => 6 # 二次元配列は、空白区切りで作った行を、セミコロンで区切ることで作ります。 -# 2-dimentional arrays use space-separated values and semicolon-separated rows. matrix = [1 2; 3 4] # => 2x2 Int64 Array: [1 2; 3 4] -# 配列の終端に値を追加するには push! を、 -# 他の配列を追加するには append! を使います。 -# Add stuff to the end of a list with push! and append! +# 配列の末尾に値を追加するには push! を、 +# 他の配列を結合するには append! を使います。 push!(a,1) # => [1] push!(a,2) # => [1,2] push!(a,4) # => [1,2,4] push!(a,3) # => [1,2,4,3] append!(a,b) # => [1,2,4,3,4,5,6] -# 配列の終端から値を削除するには pop! を使います。 -# Remove from the end with pop +# 配列の末尾から値を削除するには pop! を使います。 pop!(b) # => 6 and b is now [4,5] -# もう一度戻しましょう。 -# Let's put it back +# 一旦元に戻しておきましょう。 push!(b,6) # b is now [4,5,6] again. a[1] # => 1 # Julia では添字は0 ではなく1 から始まること、お忘れなく! -a[1] # => 1 # remember that Julia indexes from 1, not 0! # end は最後の添字を表す速記法です。 # 添字を書く場所ならどこにでも使えます。 -# end is a shorthand for the last index. It can be used in any -# indexing expression a[end] # => 6 -# 先頭に対する追加・削除は shift!, unshift! です。 -# we also have shift and unshift +# 先頭に対する削除・追加は shift!, unshift! です。 shift!(a) # => 1 and a is now [2,4,3,4,5,6] unshift!(a,7) # => [7,2,4,3,4,5,6] # ! で終わる関数名は、その引数を変更するということを示します。 -# Function names that end in exclamations points indicate that they modify -# their argument. arr = [5,4,6] # => 3-element Int64 Array: [5,4,6] sort(arr) # => [4,5,6]; arr is still [5,4,6] sort!(arr) # => [4,5,6]; arr is now [4,5,6] # 配列の範囲外アクセスをすると BoundsError が発生します。 -# Looking out of bounds is a BoundsError try a[0] # => ERROR: BoundsError() in getindex at array.jl:270 a[end+1] # => ERROR: BoundsError() in getindex at array.jl:270 @@ -254,40 +191,33 @@ catch e end # エラーが発生すると、どのファイルのどの行で発生したかが表示されます。 -# Errors list the line and file they came from, even if it's in the standard -# library. If you built Julia from source, you can look in the folder base -# inside the julia folder to find these files. +# 標準ライブラリで発生したものでもファイル名と行数が出ます。 +# ソースからビルドした場合など、標準ライブラリのソースが手元にある場合は +# base/ ディレクトリから探し出して見てください。 # 配列は範囲オブジェクトから作ることもできます。 -# You can initialize arrays from ranges a = [1:5] # => 5-element Int64 Array: [1,2,3,4,5] # 添字として範囲オブジェクトを渡すことで、 # 配列の部分列を得ることもできます。 -# You can look at ranges with slice syntax. a[1:3] # => [1, 2, 3] a[2:end] # => [2, 3, 4, 5] # 添字を用いて配列から値の削除をしたい場合は、splice! を使います。 -# Remove elements from an array by index with splice! arr = [3,4,5] splice!(arr,2) # => 4 ; arr is now [3,5] # 配列の結合は append! です。 -# Concatenate lists with append! b = [1,2,3] append!(a,b) # Now a is [1, 2, 3, 4, 5, 1, 2, 3] # 配列内に指定した値があるかどうかを調べるのには in を使います。 -# Check for existence in a list with in in(1, a) # => true # length で配列の長さを取得できます。 -# Examine the length with length length(a) # => 8 # 変更不可能 (immutable) な値の組として、タプルが使えます。 -# Tuples are immutable. tup = (1, 2, 3) # => (1,2,3) # an (Int64,Int64,Int64) tuple. tup[1] # => 1 try: @@ -297,65 +227,51 @@ catch e end # 配列に関する関数の多くが、タプルでも使えます。 -# Many list functions also work on tuples length(tup) # => 3 tup[1:2] # => (1,2) in(2, tup) # => true # タプルから値をばらして(unpack して) 複数の変数に代入できます。 -# You can unpack tuples into variables a, b, c = (1, 2, 3) # => (1,2,3) # a is now 1, b is now 2 and c is now 3 # 丸括弧なしでもタプルになります。 -# Tuples are created even if you leave out the parentheses d, e, f = 4, 5, 6 # => (4,5,6) # ひとつの値だけからなるタプルは、その値自体とは区別されます。 -# A 1-element tuple is distinct from the value it contains (1,) == 1 # => false (1) == 1 # => true # 値の交換もタプルを使えば簡単です。 -# Look how easy it is to swap two values e, d = d, e # => (5,4) # d is now 5 and e is now 4 # 辞書 (Dict) は、値から値への変換の集合です。 -# Dictionaries store mappings empty_dict = Dict() # => Dict{Any,Any}() # 辞書型リテラルは次のとおりです。 -# You can create a dictionary using a literal filled_dict = ["one"=> 1, "two"=> 2, "three"=> 3] # => Dict{ASCIIString,Int64} # [] を使ったアクセスができます。 -# Look up values with [] filled_dict["one"] # => 1 # すべての鍵(添字)は keys で得られます。 -# Get all keys keys(filled_dict) # => KeyIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2]) # 必ずしも辞書に追加した順番には並んでいないことに注意してください。 -# Note - dictionary keys are not sorted or in the order you inserted them. # 同様に、values はすべての値を返します。 -# Get all values values(filled_dict) # => ValueIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2]) # 鍵と同様に、必ずしも辞書に追加した順番には並んでいないことに注意してください。 -# Note - Same as above regarding key ordering. # in や haskey を使うことで、要素や鍵が辞書の中にあるかを調べられます。 -# Check for existence of keys in a dictionary with in, haskey in(("one", 1), filled_dict) # => true in(("two", 3), filled_dict) # => false haskey(filled_dict, "one") # => true haskey(filled_dict, 1) # => false # 存在しない鍵を問い合わせると、エラーが発生します。 -# Trying to look up a non-existant key will raise an error try filled_dict["four"] # => ERROR: key not found: four in getindex at dict.jl:489 catch e @@ -364,29 +280,22 @@ end # get 関数を使い、鍵がなかった場合のデフォルト値を与えておくことで、 # このエラーを回避できます。 -# Use the get method to avoid that error by providing a default value -# get(dictionary,key,default_value) get(filled_dict,"one",4) # => 1 get(filled_dict,"four",4) # => 4 # 集合 (Set) は一意な値の、順序付けられていない集まりです。 -# Use Sets to represent collections of unordered, unique values empty_set = Set() # => Set{Any}() # 集合の初期化 -# Initialize a set with values filled_set = Set(1,2,2,3,4) # => Set{Int64}(1,2,3,4) # 集合への追加 -# Add more values to a set push!(filled_set,5) # => Set{Int64}(5,4,2,3,1) # in で、値が既に存在するかを調べられます。 -# Check if the values are in the set in(2, filled_set) # => true in(10, filled_set) # => false # 積集合や和集合、差集合を得る関数も用意されています。 -# There are functions for set intersection, union, and difference. other_set = Set(3, 4, 5, 6) # => Set{Int64}(6,4,5,3) intersect(filled_set, other_set) # => Set{Int64}(3,4,5) union(filled_set, other_set) # => Set{Int64}(1,2,3,4,5,6) @@ -394,16 +303,13 @@ setdiff(Set(1,2,3,4),Set(2,3,5)) # => Set{Int64}(1,4) #################################################### -## 3. Control Flow ## 3. 制御構文 #################################################### # まずは変数を作ります。 -# Let's make a variable some_var = 5 # if 構文です。Julia ではインデントに意味はありません。 -# Here is an if statement. Indentation is not meaningful in Julia. if some_var > 10 println("some_var is totally bigger than 10.") elseif some_var < 10 # elseif 節は省略可能です。 @@ -416,8 +322,6 @@ end # for ループによって、反復可能なオブジェクトを走査できます。 # 反復可能なオブジェクトの型として、 # Range, Array, Set, Dict, String などがあります。 -# For loops iterate over iterables. -# Iterable types include Range, Array, Set, Dict, and String. for animal=["dog", "cat", "mouse"] println("$animal is a mammal") # $ を使うことで文字列に変数の値を埋め込めます。 @@ -429,7 +333,6 @@ end # mouse is a mammal # for = の代わりに for in を使うこともできます -# You can use 'in' instead of '='. for animal in ["dog", "cat", "mouse"] println("$animal is a mammal") end @@ -438,6 +341,7 @@ end # cat is a mammal # mouse is a mammal +# 辞書ではタプルが返ってきます。 for a in ["dog"=>"mammal","cat"=>"mammal","mouse"=>"mammal"] println("$(a[1]) is a $(a[2])") end @@ -446,6 +350,7 @@ end # cat is a mammal # mouse is a mammal +# タプルのアンパック代入もできます。 for (k,v) in ["dog"=>"mammal","cat"=>"mammal","mouse"=>"mammal"] println("$k is a $v") end @@ -455,7 +360,6 @@ end # mouse is a mammal # while ループは、条件式がtrue となる限り実行され続けます。 -# While loops loop while a condition is true x = 0 while x < 4 println(x) @@ -468,7 +372,6 @@ end # 3 # 例外は try/catch で捕捉できます。 -# Handle exceptions with a try/catch block try error("help") catch e @@ -478,12 +381,10 @@ end #################################################### -## 4. Functions ## 4. 関数 #################################################### # function キーワードを次のように使うことで、新しい関数を定義できます。 -# The keyword 'function' creates new functions #function name(arglist) # body... #end @@ -491,19 +392,15 @@ function add(x, y) println("x is $x and y is $y") # 最後に評価された式の値が、関数全体の返り値となります。 - # Functions return the value of their last statement x + y end add(5, 6) # => 11 after printing out "x is 5 and y is 6" # 可変長引数関数も定義できます。 -# You can define functions that take a variable number of -# positional arguments function varargs(args...) return args # return キーワードを使うことで、好きな位置で関数から抜けられます。 - # use the keyword return to return anywhere in the function end # => varargs (generic function with 1 method) @@ -513,10 +410,6 @@ varargs(1,2,3) # => (1,2,3) # (訳注:「ピシャッという音(名詞)」「衝撃で平らにする(動詞)」) # 今回は関数定義で使いましたが、関数呼び出しに使うこともできます。 # その場合、配列やタプルの要素を開いて、複数の引数へと割り当てることとなります。 -# The ... is called a splat. -# We just used it in a function definition. -# It can also be used in a fuction call, -# where it will splat an Array or Tuple's contents into the argument list. Set([1,2,3]) # => Set{Array{Int64,1}}([1,2,3]) # 「整数の配列」の集合 Set([1,2,3]...) # => Set{Int64}(1,2,3) # 整数の集合 @@ -526,7 +419,6 @@ Set(x...) # => Set{Int64}(2,3,1) # 引数に初期値を与えることで、オプション引数をもった関数を定義できます。 -# You can define functions with optional positional arguments function defaults(a,b,x=5,y=6) return "$a $b and $x $y" end @@ -542,7 +434,6 @@ catch e end # キーワード引数を持った関数も作れます。 -# You can define functions that take keyword arguments function keyword_args(;k1=4,name2="hello") # ; が必要なことに注意 return ["k1"=>k1,"name2"=>name2] end @@ -552,7 +443,6 @@ keyword_args(k1="mine") # => ["k1"=>"mine","name2"=>"hello"] keyword_args() # => ["name2"=>"hello","k1"=>4] # もちろん、これらを組み合わせることもできます。 -# You can combine all kinds of arguments in the same function function all_the_args(normal_arg, optional_positional_arg=2; keyword_arg="foo") println("normal arg: $normal_arg") println("optional arg: $optional_positional_arg") @@ -566,7 +456,6 @@ all_the_args(1, 3, keyword_arg=4) # keyword arg: 4 # Julia では関数は第一級関数として、値として扱われます。 -# Julia has first class functions function create_adder(x) adder = function (y) return x + y @@ -575,17 +464,14 @@ function create_adder(x) end # ラムダ式によって無名関数をつくれます。 -# This is "stabby lambda syntax" for creating anonymous functions (x -> x > 2)(3) # => true # 先ほどの create_adder と同じもの -# This function is identical to create_adder implementation above. function create_adder(x) y -> x + y end # 中の関数に名前をつけても構いません。 -# You can also name the internal function, if you want function create_adder(x) function adder(y) x + y @@ -598,47 +484,33 @@ add_10(3) # => 13 # いくつかの高階関数が定義されています。 -# There are built-in higher order functions map(add_10, [1,2,3]) # => [11, 12, 13] filter(x -> x > 5, [3, 4, 5, 6, 7]) # => [6, 7] # map の代わりとしてリスト内包表記も使えます。 -# We can use list comprehensions for nicer maps [add_10(i) for i=[1, 2, 3]] # => [11, 12, 13] [add_10(i) for i in [1, 2, 3]] # => [11, 12, 13] #################################################### -## 5. Types ## 5. 型 #################################################### # Julia ではすべての値にひとつの型がついています。 # 変数に、ではなくて値に、です。 # typeof 関数を使うことで、値が持つ型を取得できます。 -# Julia has a type system. -# Every value has a type; variables do not have types themselves. -# You can use the `typeof` function to get the type of a value. typeof(5) # => Int64 # 型自身もまた、第一級の値であり、型を持っています。 -# Types are first-class values typeof(Int64) # => DataType typeof(DataType) # => DataType # DataType は型を表現する型であり、DataType 自身もDataType 型の値です。 -# DataType is the type that represents types, including itself. # 型はドキュメント化や最適化、関数ディスパッチのために使われます。 # 静的な型チェックは行われません。 -# Types are used for documentation, optimizations, and dispatch. -# They are not statically checked. # 自分で新しい型を定義することもできます。 # 他の言語で言う、構造体やレコードに近いものになっています。 # 型定義には type キーワードを使います。 -# Users can define types -# They are like records or structs in other languages. -# New types are defined using the `type` keyword. - # type Name # field::OptionalType # ... @@ -646,34 +518,24 @@ typeof(DataType) # => DataType type Tiger taillength::Float64 coatcolor # 型注釈を省略した場合、自動的に :: Any として扱われます。 - coatcolor # not including a type annotation is the same as `::Any` end # 型を定義すると、その型のプロパティすべてを、定義した順番に # 引数として持つデフォルトコンストラクタが自動的に作られます。 -# The default constructor's arguments are the properties -# of the type, in the order they are listed in the definition tigger = Tiger(3.5,"orange") # => Tiger(3.5,"orange") # 型名がそのままコンストラクタ名(関数名)となります。 -# The type doubles as the constructor function for values of that type sherekhan = typeof(tigger)(5.6,"fire") # => Tiger(5.6,"fire") # このような、構造体スタイルの型は、具体型(concrete type)と呼ばれます。 # 具体型はインスタンス化可能ですが、派生型(subtype)を持つことができません。 # 具体型の他には抽象型(abstract type)があります。 -# These struct-style types are called concrete types -# They can be instantiated, but cannot have subtypes. -# The other kind of types is abstract types. # abstract Name abstract Cat # 型の階層図の途中の一点を指し示す名前となります。 -abstract Cat # just a name and point in the type hierarchy # 抽象型はインスタンス化できませんが、派生型を持つことができます。 # 例えば、 Number は以下の派生型を持つ抽象型です。 -# Abstract types cannot be instantiated, but can have subtypes. -# For example, Number is an abstract type subtypes(Number) # => 6-element Array{Any,1}: # Complex{Float16} # Complex{Float32} @@ -685,7 +547,6 @@ subtypes(Cat) # => 0-element Array{Any,1} # すべての型は、直接的にはただひとつの基本型(supertype) を持ちます。 # super 関数でこれを取得可能です。 -# Every type has a super type; use the `super` function to get it. typeof(5) # => Int64 super(Int64) # => Signed super(Signed) # => Real @@ -694,11 +555,9 @@ super(Number) # => Any super(super(Signed)) # => Number super(Any) # => Any # Int64 を除き、これらはすべて抽象型です。 -# All of these type, except for Int64, are abstract. # <: は派生形を表す演算子です。 # これを使うことで派生型を定義できます。 -# <: is the subtyping operator type Lion <: Cat # Lion は 抽象型 Cat の派生型 mane_color roar::String @@ -708,46 +567,31 @@ end # 必要とする型の値を返すことによって、 # デフォルトコンストラクタ以外のコンストラクタを作ることができます。 -# You can define more constructors for your type -# Just define a function of the same name as the type -# and call an existing constructor to get a value of the correct type Lion(roar::String) = Lion("green",roar) # 型定義の外側で定義されたコンストラクタなので、外部コンストラクタと呼ばれます。 -# This is an outer constructor because it's outside the type definition type Panther <: Cat # Panther も Cat の派生型 eye_color Panther() = new("green") # Panther は内部コンストラクタとしてこれのみを持ち、 # デフォルトコンストラクタを持たない - # Panthers will only have this constructor, and no default constructor. end # 内部コンストラクタを使うことで、どのような値が作られるのかをコントロールすることができます。 # 出来る限り、外部コンストラクタを使うべきです。 -# Using inner constructors, like Panther does, gives you control -# over how values of the type can be created. -# When possible, you should use outer constructors rather than inner ones. #################################################### -## 6. Multiple-Dispatch ## 6. 多重ディスパッチ #################################################### # Julia では、すべての名前付きの関数は総称的関数(generic function) です。 # これは、関数はいくつかの細かいメソッドの集合である、という意味です。 # 例えば先の Lion 型のコンストラクタ Lion は、Lion という関数の1つのメソッドです。 -# In Julia, all named functions are generic functions -# This means that they are built up from many small methods -# Each constructor for Lion is a method of the generic function Lion. # コンストラクタ以外の例をみるために、新たに meow 関数を作りましょう。 -# For a non-constructor example, let's make a function meow: # Lion, Panther, Tiger 型それぞれに対する meow 関数のメソッド定義 -# Definitions for Lion, Panther, Tiger function meow(animal::Lion) animal.roar # 型のプロパティには . でアクセスできます。 - animal.roar # access type properties using dot notation end function meow(animal::Panther) @@ -759,19 +603,16 @@ function meow(animal::Tiger) end # meow 関数の実行 -# Testing the meow function meow(tigger) # => "rawwr" meow(Lion("brown","ROAAR")) # => "ROAAR" meow(Panther()) # => "grrr" # 型の階層関係を見てみましょう -# Review the local type hierarchy issubtype(Tiger,Cat) # => false issubtype(Lion,Cat) # => true issubtype(Panther,Cat) # => true # 抽象型 Cat の派生型を引数にとる関数 -# Defining a function that takes Cats function pet_cat(cat::Cat) println("The cat says $(meow(cat))") end @@ -785,14 +626,10 @@ end # オブジェクト指向言語では、一般的にシングルディスパッチが用いられます。 # つまり、関数に複数あるメソッドのうちにどれが呼ばれるかは、 -# その第一引数によってのみ決定されます。 +# その第一引数(もしくは、 . や -> の前にある値の型)によってのみ決定されます。 # 一方でJulia では、すべての引数の型が、このメソッド決定に寄与します。 -# In OO languages, single dispatch is common; -# this means that the method is picked based on the type of the first argument. -# In Julia, all of the argument types contribute to selecting the best method. # 多変数関数を定義して、この辺りを見て行きましょう。 -# Let's define a function with more arguments, so we can see the difference function fight(t::Tiger,c::Cat) println("The $(t.coatcolor) tiger wins!") end @@ -802,7 +639,6 @@ fight(tigger,Panther()) # => prints The orange tiger wins! fight(tigger,Lion("ROAR")) # => prints The orange tiger wins! # 第二引数の Cat が実際は Lion だった時に、挙動が変わるようにします。 -# Let's change the behavior when the Cat is specifically a Lion fight(t::Tiger,l::Lion) = println("The $(l.mane_color)-maned lion wins!") # => fight (generic function with 2 methods) @@ -810,7 +646,6 @@ fight(tigger,Panther()) # => prints The orange tiger wins! fight(tigger,Lion("ROAR")) # => prints The green-maned lion wins! # 別に Tiger だけが戦う必要もないですね。 -# We don't need a Tiger in order to fight fight(l::Lion,c::Cat) = println("The victorious cat says $(meow(c))") # => fight (generic function with 3 methods) @@ -821,7 +656,6 @@ catch end # 第一引数にも Cat を許しましょう。 -# Also let the cat go first fight(c::Cat,l::Lion) = println("The cat beats the Lion") # => Warning: New definition # fight(Cat,Lion) at none:1 @@ -833,25 +667,20 @@ fight(c::Cat,l::Lion) = println("The cat beats the Lion") #fight (generic function with 4 methods) # 警告が出ましたが、これは次の対戦で何が起きるのかが不明瞭だからです。 -# This warning is because it's unclear which fight will be called in: fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The victorious cat says rarrr # Julia のバージョンによっては、結果が違うかもしれません。 -# The result may be different in other versions of Julia fight(l::Lion,l2::Lion) = println("The lions come to a tie") fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The lions come to a tie # Julia が生成する LLVM 内部表現や、アセンブリを調べることもできます。 -# Under the hood -# You can take a look at the llvm and the assembly code generated. square_area(l) = l * l # square_area (generic function with 1 method) square_area(5) #25 # square_area に整数を渡すと何が起きる? -# What happens when we feed square_area an integer? code_native(square_area, (Int32,)) # .section __TEXT,__text,regular,pure_instructions # Filename: none @@ -859,10 +688,10 @@ code_native(square_area, (Int32,)) # push RBP # mov RBP, RSP # Source line: 1 - # movsxd RAX, EDI # Fetch l from memory? - # imul RAX, RAX # Square l and store the result in RAX - # pop RBP # Restore old base pointer - # ret # Result will still be in RAX + # movsxd RAX, EDI # l を取得 + # imul RAX, RAX # l*l を計算して RAX に入れる + # pop RBP # Base Pointer を元に戻す + # ret # 終了。RAX の中身が結果 code_native(square_area, (Float32,)) # .section __TEXT,__text,regular,pure_instructions @@ -871,7 +700,7 @@ code_native(square_area, (Float32,)) # push RBP # mov RBP, RSP # Source line: 1 - # vmulss XMM0, XMM0, XMM0 # Scalar single precision multiply (AVX) + # vmulss XMM0, XMM0, XMM0 # 単精度浮動小数点数演算 (AVX) # pop RBP # ret @@ -882,7 +711,7 @@ code_native(square_area, (Float64,)) # push RBP # mov RBP, RSP # Source line: 1 - # vmulsd XMM0, XMM0, XMM0 # Scalar double precision multiply (AVX) + # vmulsd XMM0, XMM0, XMM0 # 倍精度浮動小数点数演算 (AVX) # pop RBP # ret # @@ -890,9 +719,6 @@ code_native(square_area, (Float64,)) # Julia では、浮動小数点数と整数との演算では # 自動的に浮動小数点数用の命令が生成されることに注意してください。 # 円の面積を計算してみましょう。 -# Note that julia will use floating point instructions if any of the -# arguements are floats. -# Let's calculate the area of a circle circle_area(r) = pi * r * r # circle_area (generic function with 1 method) circle_area(5) # 78.53981633974483 @@ -927,13 +753,9 @@ code_native(circle_area, (Float64,)) ``` ## より勉強するために -## Further Reading [公式ドキュメント](http://docs.julialang.org/en/latest/manual/) (英語)にはより詳細な解説が記されています。 -You can get a lot more detail from [The Julia Manual](http://docs.julialang.org/en/latest/manual/) - Julia に関して助けが必要ならば、[メーリングリスト](https://groups.google.com/forum/#!forum/julia-users) が役に立ちます。 みんな非常に親密に教えてくれます。 -The best place to get help with Julia is the (very friendly) [mailing list](https://groups.google.com/forum/#!forum/julia-users). -- cgit v1.2.3 From a3ce8e9d6c0810e83852f6e197cf3a55006f5c7e Mon Sep 17 00:00:00 2001 From: Nikolay Kirsh Date: Mon, 22 Dec 2014 13:01:43 +0500 Subject: Russuan spelling corrrection --- ru-ru/go-ru.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru-ru/go-ru.html.markdown b/ru-ru/go-ru.html.markdown index 44a22b45..e06ae9bd 100644 --- a/ru-ru/go-ru.html.markdown +++ b/ru-ru/go-ru.html.markdown @@ -65,7 +65,7 @@ func beyondHello() { learnTypes() // < y minutes, learn more! } -// Функция имеющая входные параметры и возврат нескольких значений. +// Функция, имеющая входные параметры и возвращающая несколько значений. func learnMultiple(x, y int) (sum, prod int) { return x + y, x * y // Возврат двух значений. } -- cgit v1.2.3 From 54b8be676862ec85920c952db4f4e791f4d721b0 Mon Sep 17 00:00:00 2001 From: euporie Date: Mon, 22 Dec 2014 13:26:30 +0100 Subject: Fixed typo at the end --- pogo.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pogo.html.markdown b/pogo.html.markdown index 60a83edd..aa5d49f3 100644 --- a/pogo.html.markdown +++ b/pogo.html.markdown @@ -199,4 +199,4 @@ That's it. Download [Node.js](http://nodejs.org/) and `npm install pogo`. -There is plenty of documentation on [http://pogoscript.org/](http://pogoscript.org/), inlcuding a [cheat sheet](http://pogoscript.org/cheatsheet.html), a [guide](http://pogoscript.org/guide/), and how [Pogoscript translates to Javascript](http://featurist.github.io/pogo-examples/). Get in touch on the [google group](http://groups.google.com/group/pogoscript) if you have questions! +There is plenty of documentation on [http://pogoscript.org/](http://pogoscript.org/), including a [cheat sheet](http://pogoscript.org/cheatsheet.html), a [guide](http://pogoscript.org/guide/), and how [Pogoscript translates to Javascript](http://featurist.github.io/pogo-examples/). Get in touch on the [google group](http://groups.google.com/group/pogoscript) if you have questions! -- cgit v1.2.3 From 674284cfcb0fa3194ad854d711288ec9aa5b98e9 Mon Sep 17 00:00:00 2001 From: maniexx Date: Mon, 22 Dec 2014 15:24:09 +0100 Subject: Delete PYMOTW3 due to lack of content --- python3.html.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/python3.html.markdown b/python3.html.markdown index f6babaff..8bcc85d1 100644 --- a/python3.html.markdown +++ b/python3.html.markdown @@ -609,7 +609,6 @@ print(say(say_please=True)) # Can you buy me a beer? Please! I am poor :( * [The Official Docs](http://docs.python.org/3/) * [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/) -* [Python Module of the Week](http://pymotw.com/3/) * [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182) ### Dead Tree -- cgit v1.2.3 From ed819ed91774d37ada2e77af941289aeefbf6a86 Mon Sep 17 00:00:00 2001 From: switchhax Date: Tue, 23 Dec 2014 16:27:30 +0100 Subject: [YAML/en] translated to [YAML/de] --- de-de/bash-de.html.markdown | 2 +- de-de/yaml-de.html.markdown | 138 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 de-de/yaml-de.html.markdown diff --git a/de-de/bash-de.html.markdown b/de-de/bash-de.html.markdown index ad782e06..fb9cd9d4 100644 --- a/de-de/bash-de.html.markdown +++ b/de-de/bash-de.html.markdown @@ -17,7 +17,7 @@ Beinahe alle der folgenden Beispiele können als Teile eines Shell-Skripts oder ```bash #!/bin/bash -# Die erste Zeile des Scripts nennt sich Shebang in gibt dem System an, wie +# Die erste Zeile des Scripts nennt sich Shebang, dies gibt dem System an, # wie das Script ausgeführt werden soll: http://de.wikipedia.org/wiki/Shebang # Du hast es bestimmt schon mitgekriegt, Kommentare fangen mit # an. Das Shebang ist auch ein Kommentar diff --git a/de-de/yaml-de.html.markdown b/de-de/yaml-de.html.markdown new file mode 100644 index 00000000..88318014 --- /dev/null +++ b/de-de/yaml-de.html.markdown @@ -0,0 +1,138 @@ +--- +language: yaml +filename: learnyaml.yaml +contributors: + - ["Adam Brenecki", "https://github.com/adambrenecki"] +translators: + - ["Ruben M.", https://github.com/switchhax] +--- + +YAML ist eine Sprache zur Datenserialisierung, die sofort von Menschenhand geschrieben und gelesen werden kann. + +YAML ist eine Erweiterung von JSON, mit der Erweiterung von syntaktisch wichtigen Zeilenumbrüche und Einrückung sowie in Python. Anders als in Python erlaubt YAML keine Tabulator-Zeichen. + +```yaml +# Kommentare in YAML schauen so aus. + +################# +# SKALARE TYPEN # +################# + +# Unser Kernobjekt (für das ganze Dokument) wird das Assoziative Datenfeld (Map) sein, +# welches equivalent zu einem Hash oder einem Objekt einer anderen Sprache ist. +Schlüssel: Wert +nochn_Schlüssel: Hier kommt noch ein Wert hin. +eine_Zahl: 100 +wissenschaftliche_Notation: 1e+12 +boolean: true +null_Wert: null +Schlüssel mit Leerzeichen: value +# Strings müssen nicht immer mit Anführungszeichen umgeben sein, können aber: +jedoch: "Ein String in Anführungzeichen" +"Ein Schlüssel in Anführungszeichen": "Nützlich, wenn du einen Doppelpunkt im Schluessel haben willst." + +# Mehrzeilige Strings schreibst du am besten als 'literal block' (| gefolgt vom Text) +# oder ein 'folded block' (> gefolgt vom text). +literal_block: | + Dieser ganze Block an Text ist der Wert vom Schlüssel literal_block, + mit Erhaltung der Zeilenumbrüche. + + Das Literal fährt solange fort bis dieses unverbeult ist und die vorherschende Einrückung wird + gekürzt. + + Zeilen, die weiter eingerückt sind, behalten den Rest ihrer Einrückung - + diese Zeilen sind mit 4 Leerzeichen eingerückt. +folded_style: > + Dieser ganze Block an Text ist der Wert vom Schlüssel folded_style, aber diesmal + werden alle Zeilenumbrüche durch ein Leerzeichen ersetzt. + + Freie Zeilen, wie obendrüber, werden in einen Zeilenumbruch verwandelt. + + Weiter eingerückte Zeilen behalten ihre Zeilenumbrüche - + diese Textpassage wird auf zwei Zeilen sichtbar sein. + +#################### +# COLLECTION TYPEN # +#################### + +# Verschachtelung wird duch Einrückung erzielt. +eine_verschachtelte_map: + schlüssel: wert + nochn_Schlüssel: Noch ein Wert. + noch_eine_verschachtelte_map: + hallo: hallo + +# Schlüssel müssen nicht immer String sein. +0.25: ein Float-Wert als Schluessel + +# Schlüssel können auch mehrzeilig sein, ? symbolisiert den Anfang des Schlüssels +? | + Dies ist ein Schlüssel, + der mehrzeilig ist. +: und dies ist sein Wert + +# YAML erlaubt auch Collections als Schlüssel, doch viele Programmiersprachen +# werden sich beklagen. + +# Folgen (equivalent zu Listen oder Arrays) schauen so aus: +eine_Folge: + - Artikel 1 + - Artikel 2 + - 0.5 # Folgen können verschiedene Typen enthalten. + - Artikel 4 + - schlüssel: wert + nochn_schlüssel: nochn_wert + - + - Dies ist eine Folge + - innerhalb einer Folge + +# Weil YAML eine Erweiterung von JSON ist, können JSON-ähnliche Maps und Folgen +# geschrieben werden: +json_map: {"schlüssel": "wert"} +json_seq: [3, 2, 1, "Start"] + +############################ +# EXTRA YAML EIGENSCHAFTEN # +############################ + +# YAML stellt zusätzlich Verankerung zu Verfügung, welche es einfach machen +# Inhalte im Dokument zu vervielfältigen. Beide Schlüssel werden den selben Wert haben. +verankerter_inhalt: &anker_name Dieser String wird als Wert beider Schlüssel erscheinen. +anderer_anker: *anker_name + +# YAML hat auch Tags, mit denen man explizit Typangaben angibt. +explicit_string: !!str 0.5 +# Manche Parser implementieren sprachspezifische Tags wie dieser hier für Pythons +# komplexe Zahlen. +python_komplexe_Zahlen: !!python/komplex 1+2j + +#################### +# EXTRA YAML TYPEN # +#################### + +# Strings and Zahlen sind nicht die einzigen Skalare, welche YAML versteht. +# ISO-formatierte Datumsangaben and Zeiangaben können ebenso geparsed werden. +DatumZeit: 2001-12-15T02:59:43.1Z +DatumZeit_mit_Leerzeichen: 2001-12-14 21:59:43.10 -5 +Datum: 2002-12-14 + +# Der !!binary Tag zeigt das ein String base64 verschlüsselt ist. +# Representation des Binären Haufens +gif_datei: !!binary | + R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5 + OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+ + +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC + AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs= + +# YAML bietet auch Mengen (Sets), welche so ausschauen +menge: + ? artikel1 + ? artikel2 + ? artikel3 + +# Wie in Python sind Mengen nicht anderes als Maps nur mit null als Wert; das Beispiel oben drüber ist equivalent zu: +menge: + artikel1: null + artikel2: null + artikel3: null +``` -- cgit v1.2.3 From 28fcbc8e1c7d22bbc192418b4f3513f2ca4ead3e Mon Sep 17 00:00:00 2001 From: Louie Dinh Date: Tue, 23 Dec 2014 11:23:22 -0800 Subject: Fix typo --- python.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python.html.markdown b/python.html.markdown index 53381f32..da04d381 100644 --- a/python.html.markdown +++ b/python.html.markdown @@ -264,7 +264,7 @@ filled_dict.get("four") # => None # The get method supports a default argument when the value is missing filled_dict.get("one", 4) # => 1 filled_dict.get("four", 4) # => 4 -# note that filled_dict.get("four") is still => 4 +# note that filled_dict.get("four") is still => None # (get doesn't set the value in the dictionary) # set the value of a key with a syntax similar to lists -- cgit v1.2.3 From 4ab8d7427d60f48a5b076c0e589477a147659d31 Mon Sep 17 00:00:00 2001 From: Adam Bard Date: Wed, 24 Dec 2014 10:38:16 +0100 Subject: Update livescript.html.markdown Fix syntax errors on numbery var names --- livescript.html.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/livescript.html.markdown b/livescript.html.markdown index 429b91cb..e64f7719 100644 --- a/livescript.html.markdown +++ b/livescript.html.markdown @@ -219,8 +219,8 @@ identity 1 # => 1 # Operators are not functions in LiveScript, but you can easily turn # them into one! Enter the operator sectioning: -divide-by-2 = (/ 2) -[2, 4, 8, 16].map(divide-by-2) .reduce (+) +divide-by-two = (/ 2) +[2, 4, 8, 16].map(divide-by-two) .reduce (+) # Not only of function application lives LiveScript, as in any good @@ -248,8 +248,8 @@ reduce = (f, xs, initial) --> xs.reduce f, initial # The underscore is also used in regular partial application, which you # can use for any function: div = (left, right) -> left / right -div-by-2 = div _, 2 -div-by-2 4 # => 2 +div-by-two = div _, 2 +div-by-two 4 # => 2 # Last, but not least, LiveScript has back-calls, which might help -- cgit v1.2.3 From f323083ba49a2e1fa0b5a11b4ce2bf74a21cac86 Mon Sep 17 00:00:00 2001 From: ven Date: Wed, 24 Dec 2014 18:22:48 +0100 Subject: rework of the tutorial --- perl6.html.markdown | 356 ++++++++++++++++++++++++++-------------------------- 1 file changed, 180 insertions(+), 176 deletions(-) diff --git a/perl6.html.markdown b/perl6.html.markdown index b178de1e..1536b152 100644 --- a/perl6.html.markdown +++ b/perl6.html.markdown @@ -35,7 +35,8 @@ my $variable; ## * Scalars. They represent a single value. They start with a `$` my $str = 'String'; -my $str2 = "String"; # double quotes allow for interpolation +# double quotes allow for interpolation (which we'll see later): +my $str2 = "String"; # variable names can contain but not end with simple quotes and dashes, # and can contain (and end with) underscores : @@ -66,23 +67,13 @@ my @keys = 0, 2; @array[@keys] = @letters; # Assign using an array say @array; #=> a 6 b -# There are two more kinds of lists: Parcel and Arrays. -# Parcels are immutable lists (you can't modify a list that's not assigned). -# This is a parcel: -(1, 2, 3); # Not assigned to anything. Changing an element would provoke an error -# This is a list: -my @a = (1, 2, 3); # Assigned to `@a`. Changing elements is okay! - -# Lists flatten (in list context). You'll see below how to apply item context -# or use arrays to have real nested lists. - - -## * Hashes. Key-Value Pairs. -# Hashes are actually arrays of Pairs (`Key => Value`), -# except they get "flattened", removing duplicated keys. +## * Hashes, or key-value Pairs. +# Hashes are actually arrays of Pairs +# (you can construct a Pair object using the syntax `Key => Value`), +# except they get "flattened" (hash context), removing duplicated keys. my %hash = 1 => 2, 3 => 4; -my %hash = autoquoted => "key", # keys *can* get auto-quoted +my %hash = autoquoted => "key", # keys get auto-quoted "some other" => "value", # trailing commas are okay ; my %hash = ; # you can also create a hash @@ -112,30 +103,6 @@ sub say-hello-to(Str $name) { # You can provide the type of an argument say "Hello, $name !"; } -# Since you can omit parenthesis to call a function with no arguments, -# you need "&" in the name to capture `say-hello`. -my &s = &say-hello; -my &other-s = sub { say "Anonymous function !" } - -# A sub can have a "slurpy" parameter, or "doesn't-matter-how-many" -sub as-many($head, *@rest) { # `*@` (slurpy) will basically "take everything else". - # Note: you can have parameters *before* (like here) - # a slurpy one, but not *after*. - say @rest.join(' / ') ~ " !"; -} -say as-many('Happy', 'Happy', 'Birthday'); #=> Happy / Birthday ! - # Note that the splat did not consume - # the parameter before. - -## You can call a function with an array using the -# "argument list flattening" operator `|` -# (it's not actually the only role of this operator, but it's one of them) -sub concat3($a, $b, $c) { - say "$a, $b, $c"; -} -concat3(|@array); #=> a, b, c - # `@array` got "flattened" as a part of the argument list - ## It can also have optional arguments: sub with-optional($arg?) { # the "?" marks the argument optional say "I might return `(Any)` if I don't have an argument passed, @@ -154,23 +121,20 @@ hello-to; #=> Hello, World ! hello-to(); #=> Hello, World ! hello-to('You'); #=> Hello, You ! -## You can also, by using a syntax akin to the one of hashes (yay unification !), +## You can also, by using a syntax akin to the one of hashes (yay unified syntax !), ## pass *named* arguments to a `sub`. +# They're optional, and will default to "Any" (Perl's "null"-like value). sub with-named($normal-arg, :$named) { say $normal-arg + $named; } with-named(1, named => 6); #=> 7 # There's one gotcha to be aware of, here: # If you quote your key, Perl 6 won't be able to see it at compile time, -# and you'll have a single Pair object as a positional paramater. +# and you'll have a single Pair object as a positional paramater, +# which means this fails: +with-named(1, 'named' => 6); with-named(2, :named(5)); #=> 7 -with-named(3, :4named); #=> 7 - # (special colon pair syntax for numbers, - # to be used with s// and such, see later) - -with-named(3); # warns, because we tried to use the undefined $named in a `+`: - # by default, named arguments are *optional* # To make a named argument mandatory, you can use `?`'s inverse, `!` sub with-mandatory-named(:$str!) { @@ -187,11 +151,6 @@ sub takes-a-bool($name, :$bool) { # ... you can use the same "short boolean" hash syntax: takes-a-bool('config', :bool); # config takes True takes-a-bool('config', :!bool); # config takes False -# or you can use the "adverb" form: -takes-a-bool('config'):bool; #=> config takes True -takes-a-bool('config'):!bool; #=> config takes False -# You'll learn to love (or maybe hate, eh) that syntax later. - ## You can also provide your named arguments with defaults: sub named-def(:$def = 5) { @@ -201,8 +160,29 @@ named-def; #=> 5 named-def(:10def); #=> 10 named-def(def => 15); #=> 15 -# -- Note: we're going to learn *more* on subs really soon, -# but we need to grasp a few more things to understand their real power. Ready? +# Since you can omit parenthesis to call a function with no arguments, +# you need "&" in the name to capture `say-hello`. +my &s = &say-hello; +my &other-s = sub { say "Anonymous function !" } + +# A sub can have a "slurpy" parameter, or "doesn't-matter-how-many" +sub as-many($head, *@rest) { # `*@` (slurpy) will basically "take everything else". + # Note: you can have parameters *before* (like here) + # a slurpy one, but not *after*. + say @rest.join(' / ') ~ " !"; +} +say as-many('Happy', 'Happy', 'Birthday'); #=> Happy / Birthday ! + # Note that the splat did not consume + # the parameter before. + +## You can call a function with an array using the +# "argument list flattening" operator `|` +# (it's not actually the only role of this operator, but it's one of them) +sub concat3($a, $b, $c) { + say "$a, $b, $c"; +} +concat3(|@array); #=> a, b, c + # `@array` got "flattened" as a part of the argument list ### Containers # In Perl 6, values are actually stored in "containers". @@ -220,17 +200,13 @@ sub mutate($n is rw) { # A sub itself returns a container, which means it can be marked as rw: my $x = 42; -sub mod() is rw { $x } -mod() = 52; # in this case, the parentheses are mandatory - # (else Perl 6 thinks `mod` is a "term") +sub x-store() is rw { $x } +x-store() = 52; # in this case, the parentheses are mandatory + # (else Perl 6 thinks `mod` is an identifier) say $x; #=> 52 ### Control Flow Structures - -# You don't need to put parenthesis around the condition, -# but that also means you always have to use brackets (`{ }`) for their body: - ## Conditionals # - `if` @@ -247,30 +223,38 @@ unless False { say "It's not false !"; } +# As you can see, you don't need parentheses around conditions. +# However, you do need the brackets around the "body" block: +# if (true) say; # This doesn't work ! + # You can also use their postfix versions, with the keyword after: say "Quite truthy" if True; -# if (true) say; # This doesn't work ! - # - Ternary conditional, "?? !!" (like `x ? y : z` in some other languages) my $a = $condition ?? $value-if-true !! $value-if-false; # - `given`-`when` looks like other languages `switch`, but much more # powerful thanks to smart matching and thanks to Perl 6's "topic variable", $_. +# # This variable contains the default argument of a block, # a loop's current iteration (unless explicitly named), etc. +# # `given` simply puts its argument into `$_` (like a block would do), # and `when` compares it using the "smart matching" (`~~`) operator. +# # Since other Perl 6 constructs use this variable (as said before, like `for`, # blocks, etc), this means the powerful `when` is not only applicable along with # a `given`, but instead anywhere a `$_` exists. given "foo bar" { - when /foo/ { # Don't worry about smart matching -- just know `when` uses it. + say $_; #=> foo bar + when /foo/ { # Don't worry about smart matching yet – just know `when` uses it. # This is equivalent to `if $_ ~~ /foo/`. say "Yay !"; } when $_.chars > 50 { # smart matching anything with True (`$a ~~ True`) is True, # so you can also put "normal" conditionals. + # This when is equivalent to this `if`: + # if ($_.chars > 50) ~~ True {...} say "Quite a long string !"; } default { # same as `when *` (using the Whatever Star) @@ -281,7 +265,7 @@ given "foo bar" { ## Looping constructs # - `loop` is an infinite loop if you don't pass it arguments, -# but can also be a c-style `for`: +# but can also be a C-style `for` loop: loop { say "This is an infinite loop !"; last; # last breaks out of the loop, like the `break` keyword in other languages @@ -296,7 +280,7 @@ loop (my $i = 0; $i < 5; $i++) { # - `for` - Passes through an array for @array -> $variable { - say "I've found $variable !"; + say "I've got $variable !"; } # As we saw with given, for's default "current iteration" variable is `$_`. @@ -316,22 +300,15 @@ for @array { last if $_ == 5; # Or break out of a loop (like `break` in C-like languages). } -# Note - the "lambda" `->` syntax isn't reserved to `for`: +# The "pointy block" syntax isn't specific to for. +# It's just a way to express a block in Perl6. if long-computation() -> $result { say "The result is $result"; } -## Loops can also have a label, and be jumped to through these. -OUTER: while 1 { - say "hey"; - while 1 { - OUTER.last; # All the control keywords must be called on the label itself - } -} - # Now that you've seen how to traverse a list, you need to be aware of something: # List context (@) flattens. If you traverse nested lists, you'll actually be traversing a -# shallow list (except if some sub-list were put in item context ($)). +# shallow list. for 1, 2, (3, (4, ((5)))) { say "Got $_."; } #=> Got 1. Got 2. Got 3. Got 4. Got 5. @@ -348,9 +325,14 @@ for [1, 2, 3, 4] { say "Got $_."; } #=> Got 1 2 3 4. -# The other difference between `$()` and `[]` is that `[]` always returns a mutable Array -# whereas `$()` will return a Parcel when given a Parcel. +# You need to be aware of when flattening happens exactly. +# The general guideline is that argument lists flatten, but not method calls. +# Also note that `.list` and array assignment flatten (`@ary = ...`) flatten. +((1,2), 3, (4,5)).map({...}); # iterates over three elements (method call) +map {...}, ((1,2),3,(4,5)); # iterates over five elements (argument list is flattened) +(@a, @b, @c).pick(1); # picks one of three arrays (method call) +pick 1, @a, @b, @c; # flattens argument list and pick one element ### Operators @@ -394,9 +376,6 @@ $arg ~~ &bool-returning-function; # `True` if the function, passed `$arg` 1 ~~ True; # smart-matching against a boolean always returns that boolean # (and will warn). -# - `===` is value identity and uses `.WHICH` on the objects to compare them -# - `=:=` is container identity and uses `VAR()` on the objects to compare them - # You also, of course, have `<`, `<=`, `>`, `>=`. # Their string equivalent are also avaiable : `lt`, `le`, `gt`, `ge`. 3 > 4; @@ -559,6 +538,21 @@ map(sub ($a, $b) { $a + $b + 3 }, @array); # (here with `sub`) # Note : those are sorted lexicographically. # `{ $^b / $^a }` is like `-> $a, $b { $b / $a }` +## About types... +# Perl6 is gradually typed. This means you can specify the type +# of your variables/arguments/return types, or you can omit them +# and they'll default to "Any". +# You obviously get access to a few base types, like Int and Str. +# The constructs for declaring types are "class", "role", +# which you'll see later. + +# For now, let us examinate "subset": +# a "subset" is a "sub-type" with additional checks. +# For example: "a very big integer is an Int that's greater than 500" +# You can specify the type you're subtyping (by default, Any), +# and add additional checks with the "where" keyword: +subset VeryBigInteger of Int where * > 500; + ## Multiple Dispatch # Perl 6 can decide which variant of a `sub` to call based on the type of the # arguments, or on arbitrary preconditions, like with a type or a `where`: @@ -567,20 +561,19 @@ map(sub ($a, $b) { $a + $b + 3 }, @array); # (here with `sub`) multi sub sayit(Int $n) { # note the `multi` keyword here say "Number: $n"; } -multi sayit(Str $s) } # the `sub` is the default +multi sayit(Str $s) } # a multi is a `sub` by default say "String: $s"; } sayit("foo"); # prints "String: foo" sayit(True); # fails at *compile time* with # "calling 'sayit' will never work with arguments of types ..." -# with arbitrary precondition: +# with arbitrary precondition (remember subsets?): multi is-big(Int $n where * > 50) { "Yes !" } # using a closure multi is-big(Int $ where 10..50) { "Quite." } # Using smart-matching # (could use a regexp, etc) multi is-big(Int $) { "No" } -# You can also name these checks, by creating "subsets": subset Even of Int where * %% 2; multi odd-or-even(Even) { "Even" } # The main case using the type. @@ -724,7 +717,7 @@ role PrintableVal { } } -# you "use" a mixin with "does" : +# you "import" a mixin (a "role") with "does": class Item does PrintableVal { has $.val; @@ -1083,9 +1076,7 @@ postcircumfix:<{ }>(%h, $key, :delete); # (you can call operators like that) # It's a prefix meta-operator that takes a binary functions and # one or many lists. If it doesn't get passed any argument, # it either return a "default value" for this operator -# (a value that wouldn't change the result if passed as one -# of the element of the list to be passed to the operator), -# or `Any` if there's none (examples below). +# (a meaningless value) or `Any` if there's none (examples below). # # Otherwise, it pops an element from the list(s) one at a time, and applies # the binary function to the last result (or the list's first element) @@ -1107,9 +1098,7 @@ say [//] Nil, Any, False, 1, 5; #=> False # Default value examples: say [*] (); #=> 1 say [+] (); #=> 0 - # In both cases, they're results that, were they in the lists, - # wouldn't have any impact on the final value - # (since N*1=N and N+0=N). + # meaningless values, since N*1=N and N+0=N. say [//]; #=> (Any) # There's no "default value" for `//`. @@ -1163,90 +1152,6 @@ say @fib[^10]; #=> 1 1 2 3 5 8 13 21 34 55 # That's why `@primes[^100]` will take a long time the first time you print # it, then be instant. - -## * Sort comparison -# They return one value of the `Order` enum : `Less`, `Same` and `More` -# (which numerify to -1, 0 or +1). -1 <=> 4; # sort comparison for numerics -'a' leg 'b'; # sort comparison for string -$obj eqv $obj2; # sort comparison using eqv semantics - -## * Generic ordering -3 before 4; # True -'b' after 'a'; # True - -## * Short-circuit default operator -# Like `or` and `||`, but instead returns the first *defined* value : -say Any // Nil // 0 // 5; #=> 0 - -## * Short-circuit exclusive or (XOR) -# Returns `True` if one (and only one) of its arguments is true -say True ^^ False; #=> True - -## * Flip Flop -# The flip flop operators (`ff` and `fff`, equivalent to P5's `..`/`...`). -# are operators that take two predicates to test: -# They are `False` until their left side returns `True`, then are `True` until -# their right side returns `True`. -# Like for ranges, you can exclude the iteration when it became `True`/`False` -# by using `^` on either side. -# Let's start with an example : -for { - # by default, `ff`/`fff` smart-match (`~~`) against `$_`: - if 'met' ^ff 'meet' { # Won't enter the if for "met" - # (explained in details below). - .say - } - - if rand == 0 ff rand == 1 { # compare variables other than `$_` - say "This ... probably will never run ..."; - } -} -# This will print "young hero we shall meet" (excluding "met"): -# the flip-flop will start returning `True` when it first encounters "met" -# (but will still return `False` for "met" itself, due to the leading `^` -# on `ff`), until it sees "meet", which is when it'll start returning `False`. - -# The difference between `ff` (awk-style) and `fff` (sed-style) is that -# `ff` will test its right side right when its left side changes to `True`, -# and can get back to `False` right away -# (*except* it'll be `True` for the iteration that matched) - -# While `fff` will wait for the next iteration to -# try its right side, once its left side changed: -.say if 'B' ff 'B' for ; #=> B B - # because the right-hand-side was tested - # directly (and returned `True`). - # "B"s are printed since it matched that time - # (it just went back to `False` right away). -.say if 'B' fff 'B' for ; #=> B C B - # The right-hand-side wasn't tested until - # `$_` became "C" - # (and thus did not match instantly). - -# A flip-flop can change state as many times as needed: -for { - .say if $_ eq 'start' ^ff^ $_ eq 'stop'; # exclude both "start" and "stop", - #=> "print this printing again" -} - -# you might also use a Whatever Star, -# which is equivalent to `True` for the left side or `False` for the right: -for (1, 3, 60, 3, 40, 60) { # Note: the parenthesis are superfluous here - # (sometimes called "superstitious parentheses") - .say if $_ > 50 ff *; # Once the flip-flop reaches a number greater than 50, - # it'll never go back to `False` - #=> 60 3 40 60 -} - -# You can also use this property to create an `If` -# that'll not go through the first time : -for { - .say if * ^ff *; # the flip-flop is `True` and never goes back to `False`, - # but the `^` makes it *not run* on the first iteration - #=> b c -} - - ### Regular Expressions # I'm sure a lot of you have been waiting for this one. # Well, now that you know a good deal of Perl 6 already, we can get started. @@ -1470,6 +1375,105 @@ multi MAIN('import', File, Str :$as) { ... } # omitting parameter name # As you can see, this is *very* powerful. # It even went as far as to show inline the constants. # (the type is only displayed if the argument is `$`/is named) + +### +### APPENDIX A: +### +### List of things +### + +# It's considered by now you know the Perl6 basics. +# This section is just here to list some common operations, +# but which are not in the "main part" of the tutorial to bloat it up + +## Operators + + +## * Sort comparison +# They return one value of the `Order` enum : `Less`, `Same` and `More` +# (which numerify to -1, 0 or +1). +1 <=> 4; # sort comparison for numerics +'a' leg 'b'; # sort comparison for string +$obj eqv $obj2; # sort comparison using eqv semantics + +## * Generic ordering +3 before 4; # True +'b' after 'a'; # True + +## * Short-circuit default operator +# Like `or` and `||`, but instead returns the first *defined* value : +say Any // Nil // 0 // 5; #=> 0 + +## * Short-circuit exclusive or (XOR) +# Returns `True` if one (and only one) of its arguments is true +say True ^^ False; #=> True +## * Flip Flop +# The flip flop operators (`ff` and `fff`, equivalent to P5's `..`/`...`). +# are operators that take two predicates to test: +# They are `False` until their left side returns `True`, then are `True` until +# their right side returns `True`. +# Like for ranges, you can exclude the iteration when it became `True`/`False` +# by using `^` on either side. +# Let's start with an example : +for { + # by default, `ff`/`fff` smart-match (`~~`) against `$_`: + if 'met' ^ff 'meet' { # Won't enter the if for "met" + # (explained in details below). + .say + } + + if rand == 0 ff rand == 1 { # compare variables other than `$_` + say "This ... probably will never run ..."; + } +} +# This will print "young hero we shall meet" (excluding "met"): +# the flip-flop will start returning `True` when it first encounters "met" +# (but will still return `False` for "met" itself, due to the leading `^` +# on `ff`), until it sees "meet", which is when it'll start returning `False`. + +# The difference between `ff` (awk-style) and `fff` (sed-style) is that +# `ff` will test its right side right when its left side changes to `True`, +# and can get back to `False` right away +# (*except* it'll be `True` for the iteration that matched) - +# While `fff` will wait for the next iteration to +# try its right side, once its left side changed: +.say if 'B' ff 'B' for ; #=> B B + # because the right-hand-side was tested + # directly (and returned `True`). + # "B"s are printed since it matched that time + # (it just went back to `False` right away). +.say if 'B' fff 'B' for ; #=> B C B + # The right-hand-side wasn't tested until + # `$_` became "C" + # (and thus did not match instantly). + +# A flip-flop can change state as many times as needed: +for { + .say if $_ eq 'start' ^ff^ $_ eq 'stop'; # exclude both "start" and "stop", + #=> "print this printing again" +} + +# you might also use a Whatever Star, +# which is equivalent to `True` for the left side or `False` for the right: +for (1, 3, 60, 3, 40, 60) { # Note: the parenthesis are superfluous here + # (sometimes called "superstitious parentheses") + .say if $_ > 50 ff *; # Once the flip-flop reaches a number greater than 50, + # it'll never go back to `False` + #=> 60 3 40 60 +} + +# You can also use this property to create an `If` +# that'll not go through the first time : +for { + .say if * ^ff *; # the flip-flop is `True` and never goes back to `False`, + # but the `^` makes it *not run* on the first iteration + #=> b c +} + + +# - `===` is value identity and uses `.WHICH` on the objects to compare them +# - `=:=` is container identity and uses `VAR()` on the objects to compare them + ``` If you want to go further, you can: -- cgit v1.2.3 From e2606bb26259f702e6359afa4075c8a081fb7600 Mon Sep 17 00:00:00 2001 From: elf Date: Fri, 26 Dec 2014 08:56:36 -0200 Subject: general translation to pt-br for common-lisp completed --- pt-br/common-lisp-pt.html.markdown | 636 +++++++++++++++++++++++++++++++++++++ 1 file changed, 636 insertions(+) create mode 100644 pt-br/common-lisp-pt.html.markdown diff --git a/pt-br/common-lisp-pt.html.markdown b/pt-br/common-lisp-pt.html.markdown new file mode 100644 index 00000000..a2506aec --- /dev/null +++ b/pt-br/common-lisp-pt.html.markdown @@ -0,0 +1,636 @@ +--- + +language: "Common Lisp" +filename: commonlisp.lisp +contributors: + - ["Paul Nathan", "https://github.com/pnathan"] +--- + + + + + +ANSI Common Lisp é uma linguagem de uso geral, multi-paradigma, designada +para uma variedade de aplicações na indústria. É frequentemente citada +como uma linguagem de programação programável. + + + + +O ponto inicial clássico é [Practical Common Lisp and freely available.](http://www.gigamonkeys.com/book/) + + + + +Outro livro recente e popular é o +[Land of Lisp](http://landoflisp.com/). + + +```common_lisp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; 0. Sintaxe +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; "Form" Geral + + + + +;; Lisp tem dois pedaços fundamentais de sintaxe: o ATOM e S-expression. +;; Tipicamente, S-expressions agrupadas são chamadas de `forms`. + + +10 ; um atom; é avaliado para ele mesmo + + + +:THING ;Outro atom; avaliado para o símbolo :thing. + + + +t ; outro atom, denotado true. + + + +(+ 1 2 3 4) ; uma s-expression + +'(4 :foo t) ;outra s-expression + + +;;; Comentários + +;; Comentários de uma única linha começam com ponto e vírgula; usar dois para +;; comentários normais, três para comentários de seção, e quadro para comentários +;; em nível de arquivo. + +#| Bloco de comentário + pode abranger várias linhas e... + #| + eles podem ser aninhados + |# +|# + +;;; Ambiente + +;; Existe uma variedade de implementações; a maioria segue o padrão. +;; CLISP é um bom ponto de partida. + +;; Bibliotecas são gerenciadas através do Quicklisp.org's Quicklisp systemm. + +;; Common Lisp é normalmente desenvolvido com um editor de texto e um REPL +;; (Read Evaluate Print Loop) rodando ao mesmo tempo. O REPL permite exploração +;; interativa do programa como ele é "ao vivo" no sistema. + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; 1. Tipos Primitivos e Operadores +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Símbolos + +'foo ; => FOO Perceba que um símbolo é automáticamente convertido para maíusculo. + +;; Intern manualmente cria um símbolo a partir de uma string. + +(intern "AAAA") ; => AAAA + +(intern "aaa") ; => |aaa| + +;;; Números +9999999999999999999999 ; inteiro +#b111 ; binário => 7 +#o111 ; octal => 73 +#x111 ; hexadecimal => 273 +3.14159s0 ; single +3.14159d0 ; double +1/2 ; ratios +#C(1 2) ; números complexos + + +;; Funções são escritas como (f x y z ...) +;; onde f é uma função e x, y, z, ... são operadores +;; Se você quiser criar uma lista literal de dados, use ' para evitar +;; que a lista seja avaliada - literalmente, "quote" os dados. +'(+ 1 2) ; => (+ 1 2) +;; Você também pode chamar uma função manualmente: +(funcall #'+ 1 2 3) ; => 6 +;; O mesmo para operações aritiméticas +(+ 1 1) ; => 2 +(- 8 1) ; => 7 +(* 10 2) ; => 20 +(expt 2 3) ; => 8 +(mod 5 2) ; => 1 +(/ 35 5) ; => 7 +(/ 1 3) ; => 1/3 +(+ #C(1 2) #C(6 -4)) ; => #C(7 -2) + + ;;; Booleans +t ; para true (qualquer valor não nil é true) +nil ; para false - e para lista vazia +(not nil) ; => t +(and 0 t) ; => t +(or 0 nil) ; => 0 + + ;;; Caracteres +#\A ; => #\A +#\λ ; => #\GREEK_SMALL_LETTER_LAMDA +#\u03BB ; => #\GREEK_SMALL_LETTER_LAMDA + +;;; String são arrays de caracteres com tamanho fixo. +"Hello, world!" +"Benjamin \"Bugsy\" Siegel" ; barra é um escape de caracter + +;; String podem ser concatenadas também! +(concatenate 'string "Hello " "world!") ; => "Hello world!" + +;; Uma String pode ser tratada como uma sequência de caracteres +(elt "Apple" 0) ; => #\A + +;; format pode ser usado para formatar strings +(format nil "~a can be ~a" "strings" "formatted") + +;; Impimir é bastante fácil; ~% indica nova linha +(format t "Common Lisp is groovy. Dude.~%") + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 2. Variáveis +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Você pode criar uma global (escopo dinâmico) usando defparameter +;; um nome de variável pode conter qualquer caracter, exceto: ()",'`;#|\ + +;; Variáveis de escopo dinâmico devem ter asteriscos em seus nomes! + +(defparameter *some-var* 5) +*some-var* ; => 5 + +;; Você pode usar caracteres unicode também. +(defparameter *AΛB* nil) + + +;; Acessando uma variável anteriormente não ligada é um +;; comportamento não definido (mas possível). Não faça isso. + +;; Ligação local: `me` é vinculado com "dance with you" somente dentro +;; de (let ... ). Let permite retornar o valor do último `form` no form let. + +(let ((me "dance with you")) + me) +;; => "dance with you" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 3. Estruturas e Coleções +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Estruturas +(defstruct dog name breed age) +(defparameter *rover* + (make-dog :name "rover" + :breed "collie" + :age 5)) +*rover* ; => #S(DOG :NAME "rover" :BREED "collie" :AGE 5) + +(dog-p *rover*) ; => t ;; ewww) +(dog-name *rover*) ; => "rover" + +;; Dog-p, make-dog, and dog-name foram todas criadas por defstruct! + +;;; Pares +;; `cons' constroi pares, `car' and `cdr' extrai o primeiro +;; e o segundo elemento +(cons 'SUBJECT 'VERB) ; => '(SUBJECT . VERB) +(car (cons 'SUBJECT 'VERB)) ; => SUBJECT +(cdr (cons 'SUBJECT 'VERB)) ; => VERB + +;;; Listas + +;; Listas são estruturas de dados do tipo listas encadeadas, criadas com `cons' +;; pares e terminam `nil' (ou '()) para marcar o final da lista +(cons 1 (cons 2 (cons 3 nil))) ; => '(1 2 3) +;; `list' é um construtor conveniente para listas +(list 1 2 3) ; => '(1 2 3) +;; e a quote (') também pode ser usado para um valor de lista literal +'(1 2 3) ; => '(1 2 3) + +;; Ainda pode-se usar `cons' para adicionar um item no começo da lista. +(cons 4 '(1 2 3)) ; => '(4 1 2 3) + +;; Use `append' para - surpreendentemente - juntar duas listas +(append '(1 2) '(3 4)) ; => '(1 2 3 4) + +;; Ou use concatenate - + +(concatenate 'list '(1 2) '(3 4)) + +;; Listas são um tipo muito central, então existe uma grande variedade de +;; funcionalidades para eles, alguns exemplos: +(mapcar #'1+ '(1 2 3)) ; => '(2 3 4) +(mapcar #'+ '(1 2 3) '(10 20 30)) ; => '(11 22 33) +(remove-if-not #'evenp '(1 2 3 4)) ; => '(2 4) +(every #'evenp '(1 2 3 4)) ; => nil +(some #'oddp '(1 2 3 4)) ; => T +(butlast '(subject verb object)) ; => (SUBJECT VERB) + + +;;; Vetores + +;; Vector's literais são arrays de tamanho fixo. +#(1 2 3) ; => #(1 2 3) + +;; Use concatenate para juntar dois vectors +(concatenate 'vector #(1 2 3) #(4 5 6)) ; => #(1 2 3 4 5 6) + +;;; Arrays + +;; Ambos vetores e strings são um caso especial de arrays. + +;; 2D arrays + +(make-array (list 2 2)) + +;; (make-array '(2 2)) também funciona. + +; => #2A((0 0) (0 0)) + +(make-array (list 2 2 2)) + +; => #3A(((0 0) (0 0)) ((0 0) (0 0))) + +;; Cuidado - os valores de inicialição padrões são +;; definidos pela implementção. Aqui vai como defini-lós. + +(make-array '(2) :initial-element 'unset) + +; => #(UNSET UNSET) + +;; E, para acessar o element em 1,1,1 - +(aref (make-array (list 2 2 2)) 1 1 1) + +; => 0 + +;;; Vetores Ajustáveis + +;; Vetores ajustáveis tem a mesma representação impressa que os vectores +;; de tamanho fixo +(defparameter *adjvec* (make-array '(3) :initial-contents '(1 2 3) + :adjustable t :fill-pointer t)) + +*adjvec* ; => #(1 2 3) + +;; Adicionando novo elemento +(vector-push-extend 4 *adjvec*) ; => 3 + +*adjvec* ; => #(1 2 3 4) + + + +;;; Ingenuamente, conjuntos são apenas listas: + +(set-difference '(1 2 3 4) '(4 5 6 7)) ; => (3 2 1) +(intersection '(1 2 3 4) '(4 5 6 7)) ; => 4 +(union '(1 2 3 4) '(4 5 6 7)) ; => (3 2 1 4 5 6 7) +(adjoin 4 '(1 2 3 4)) ; => (1 2 3 4) + +;; Mas você irá querer usar uma estrutura de dados melhor que uma lista encadeada. +;; para performance. + +;;; Dicionários são implementados como hash tables + +;; Cria um hash table +(defparameter *m* (make-hash-table)) + +;; seta um valor +(setf (gethash 'a *m*) 1) + +;; Recupera um valor +(gethash 'a *m*) ; => 1, t + +;; Detalhe - Common Lisp tem multiplos valores de retorno possíveis. gethash +;; retorna t no segundo valor se alguma coisa foi encontrada, e nil se não. + +;; Recuperando um valor não presente retorna nil + (gethash 'd *m*) ;=> nil, nil + +;; Você pode fornecer um valor padrão para uma valores não encontrados +(gethash 'd *m* :not-found) ; => :NOT-FOUND + +;; Vamos tratas múltiplos valores de rotorno aqui. + +(multiple-value-bind + (a b) + (gethash 'd *m*) + (list a b)) +; => (NIL NIL) + +(multiple-value-bind + (a b) + (gethash 'a *m*) + (list a b)) +; => (1 T) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 3. Funções +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Use `lambda' para criar funções anônimas +;; Uma função sempre retorna um valor da última expressão avaliada. +;; A representação exata impressão de uma função varia de acordo ... + +(lambda () "Hello World") ; => # + +;; Use funcall para chamar uma função lambda. +(funcall (lambda () "Hello World")) ; => "Hello World" + +;; Ou Apply +(apply (lambda () "Hello World") nil) ; => "Hello World" + +;; "De-anonymize" a função +(defun hello-world () + "Hello World") +(hello-world) ; => "Hello World" + +;; O () acima é a lista de argumentos da função. +(defun hello (name) + (format nil "Hello, ~a " name)) + +(hello "Steve") ; => "Hello, Steve" + +;; Funções podem ter argumentos opcionais; eles são nil por padrão + +(defun hello (name &optional from) + (if from + (format t "Hello, ~a, from ~a" name from) + (format t "Hello, ~a" name))) + + (hello "Jim" "Alpacas") ;; => Hello, Jim, from Alpacas + +;; E os padrões podem ser configurados... +(defun hello (name &optional (from "The world")) + (format t "Hello, ~a, from ~a" name from)) + +(hello "Steve") +; => Hello, Steve, from The world + +(hello "Steve" "the alpacas") +; => Hello, Steve, from the alpacas + + +;; E é claro, palavras-chaves são permitidas também... frequentemente mais +;; flexivel que &optional. + +(defun generalized-greeter (name &key (from "the world") (honorific "Mx")) + (format t "Hello, ~a ~a, from ~a" honorific name from)) + +(generalized-greeter "Jim") ; => Hello, Mx Jim, from the world + +(generalized-greeter "Jim" :from "the alpacas you met last summer" :honorific "Mr") +; => Hello, Mr Jim, from the alpacas you met last summer + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 4. Igualdade +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Common Lisp tem um sistema sofisticado de igualdade. Alguns são cobertos aqui. + +;; Para número use `=' +(= 3 3.0) ; => t +(= 2 1) ; => nil + +;; para identidade de objeto (aproximadamente) use `eql` +(eql 3 3) ; => t +(eql 3 3.0) ; => nil +(eql (list 3) (list 3)) ; => nil + +;; para listas, strings, e para pedaços de vetores use `equal' +(equal (list 'a 'b) (list 'a 'b)) ; => t +(equal (list 'a 'b) (list 'b 'a)) ; => nil + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 5. Fluxo de Controle +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Condicionais + +(if t ; testa a expressão + "this is true" ; então expressão + "this is false") ; senão expressão +; => "this is true" + +;; Em condicionais, todos valores não nulos são tratados como true +(member 'Groucho '(Harpo Groucho Zeppo)) ; => '(GROUCHO ZEPPO) +(if (member 'Groucho '(Harpo Groucho Zeppo)) + 'yep + 'nope) +; => 'YEP + +;; `cond' encadeia uma série de testes para selecionar um resultado +(cond ((> 2 2) (error "wrong!")) + ((< 2 2) (error "wrong again!")) + (t 'ok)) ; => 'OK + +;; Typecase é um condicional que escolhe uma de seus cláusulas com base do tipo do valor + +(typecase 1 + (string :string) + (integer :int)) + +; => :int + +;;; Interação + +;; Claro que recursão é suportada: + +(defun walker (n) + (if (zerop n) + :walked + (walker (1- n)))) + +(walker 5) ; => :walked + +;; Na maioria das vezes, nós usamos DOTLISO ou LOOP + +(dolist (i '(1 2 3 4)) + (format t "~a" i)) + +; => 1234 + +(loop for i from 0 below 10 + collect i) + +; => (0 1 2 3 4 5 6 7 8 9) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 6. Mutação +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Use `setf' para atribuir um novo valor para uma variável existente. Isso foi +;; demonstrado anteriormente no exemplo da hash table. + +(let ((variable 10)) + (setf variable 2)) + ; => 2 + + +;; Um bom estilo Lisp é para minimizar funções destrutivas e para evitar +;; mutação quando razoável. + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 7. Classes e Objetos +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Sem clases Animal, vamos usar os veículos de transporte de tração +;; humana mecânicos. + +(defclass human-powered-conveyance () + ((velocity + :accessor velocity + :initarg :velocity) + (average-efficiency + :accessor average-efficiency + :initarg :average-efficiency)) + (:documentation "A human powered conveyance")) + +;; defcalss, seguido do nome, seguido por uma list de superclass, +;; seguido por um uma 'slot list', seguido por qualidades opcionais como +;; :documentation + +;; Quando nenhuma lista de superclasse é setada, uma lista padrão para +;; para o objeto padrão é usada. Isso *pode* ser mudado, mas não até você +;; saber o que está fazendo. Olhe em Art of the Metaobject Protocol +;; para maiores informações. + +(defclass bicycle (human-powered-conveyance) + ((wheel-size + :accessor wheel-size + :initarg :wheel-size + :documentation "Diameter of the wheel.") + (height + :accessor height + :initarg :height))) + +(defclass recumbent (bicycle) + ((chain-type + :accessor chain-type + :initarg :chain-type))) + +(defclass unicycle (human-powered-conveyance) nil) + +(defclass canoe (human-powered-conveyance) + ((number-of-rowers + :accessor number-of-rowers + :initarg :number-of-rowers))) + + +;; Chamando DESCRIBE na classe human-powered-conveyance no REPL dá: + +(describe 'human-powered-conveyance) + +; COMMON-LISP-USER::HUMAN-POWERED-CONVEYANCE +; [symbol] +; +; HUMAN-POWERED-CONVEYANCE names the standard-class #: +; Documentation: +; A human powered conveyance +; Direct superclasses: STANDARD-OBJECT +; Direct subclasses: UNICYCLE, BICYCLE, CANOE +; Not yet finalized. +; Direct slots: +; VELOCITY +; Readers: VELOCITY +; Writers: (SETF VELOCITY) +; AVERAGE-EFFICIENCY +; Readers: AVERAGE-EFFICIENCY +; Writers: (SETF AVERAGE-EFFICIENCY) + +;; Note o comportamento reflexivo disponível para você! Common Lisp é +;; projetada para ser um sistema interativo. + +;; Para definir um métpdo, vamos encontrar o que nossa cirunferência da +;; roda da bicicleta usando a equação: C = d * pi + +(defmethod circumference ((object bicycle)) + (* pi (wheel-size object))) + +;; pi já é definido para a gente em Lisp! + +;; Vamos supor que nós descobrimos que o valor da eficiência do número +;; de remadores em uma canoa é aproximadamente logarítmica. Isso provavelmente deve ser definido +;; no construtor / inicializador. + +;; Veja como initializar sua instância após Common Lisp ter construído isso: + +(defmethod initialize-instance :after ((object canoe) &rest args) + (setf (average-efficiency object) (log (1+ (number-of-rowers object))))) + +;; Em seguida, para a construção de uma ocorrência e verificar a eficiência média ... + +(average-efficiency (make-instance 'canoe :number-of-rowers 15)) +; => 2.7725887 + + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 8. Macros +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Macros permitem que você estenda a sintaxe da lingaugem + +;; Common Lisp nãov vem com um loop WHILE- vamos adicionar um. +;; Se obedecermos nossos instintos 'assembler', acabamos com: + +(defmacro while (condition &body body) + "Enquanto `condition` é verdadeiro, `body` é executado. + +`condition` é testado antes de cada execução do `body`" + (let ((block-name (gensym))) + `(tagbody + (unless ,condition + (go ,block-name)) + (progn + ,@body) + ,block-name))) + +;; Vamos dar uma olhada em uma versão alto nível disto: + + +(defmacro while (condition &body body) + "Enquanto `condition` for verdadeira, `body` é executado. + +`condition` é testado antes de cada execução do `body`" + `(loop while ,condition + do + (progn + ,@body))) + +;; Entretanto, com um compilador moderno, isso não é preciso; o LOOP +;; 'form' compila igual e é bem mais fácil de ler. + +;; Noteq ue ``` é usado , bem como `,` e `@`. ``` é um operador 'quote-type' +;; conhecido como 'quasiquote'; isso permite o uso de `,` . `,` permite "unquoting" +;; e variáveis. @ interpolará listas. + +;; Gensym cria um símbolo único garantido que não existe em outras posições +;; o sistema. Isto é porque macros são expandidas em tempo de compilação e +;; variáveis declaradas na macro podem colidir com as variáveis usadas na +;; código regular. + +;; Veja Practical Common Lisp para maiores informações sobre macros. +``` + + +## Leitura Adicional + +[Continua em frente com Practical Common Lisp book.](http://www.gigamonkeys.com/book/) + + +## Créditos + +Muitos agradecimentos ao pessoal de Schema fornecer um grande ponto de partida +o que facilitou muito a migração para Common Lisp. + +- [Paul Khuong](https://github.com/pkhuong) pelas grandes revisiões. -- cgit v1.2.3 From 0b65be8f0c876a10fb2ac823d5c551f90d7ef51e Mon Sep 17 00:00:00 2001 From: elf Date: Fri, 26 Dec 2014 09:06:38 -0200 Subject: Removing comments... --- pt-br/common-lisp-pt.html.markdown | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/pt-br/common-lisp-pt.html.markdown b/pt-br/common-lisp-pt.html.markdown index a2506aec..ba45c4ed 100644 --- a/pt-br/common-lisp-pt.html.markdown +++ b/pt-br/common-lisp-pt.html.markdown @@ -1,27 +1,19 @@ --- - language: "Common Lisp" -filename: commonlisp.lisp +filename: commonlisp-pt.lisp contributors: - ["Paul Nathan", "https://github.com/pnathan"] +translators: + - ["Édipo Luis Féderle", "https://github.com/edipofederle"] --- - - - - ANSI Common Lisp é uma linguagem de uso geral, multi-paradigma, designada para uma variedade de aplicações na indústria. É frequentemente citada como uma linguagem de programação programável. - - O ponto inicial clássico é [Practical Common Lisp and freely available.](http://www.gigamonkeys.com/book/) - - - Outro livro recente e popular é o [Land of Lisp](http://landoflisp.com/). @@ -34,25 +26,17 @@ Outro livro recente e popular é o ;;; "Form" Geral - - ;; Lisp tem dois pedaços fundamentais de sintaxe: o ATOM e S-expression. ;; Tipicamente, S-expressions agrupadas são chamadas de `forms`. - -10 ; um atom; é avaliado para ele mesmo - +10 ; um atom; é avaliado para ele mesmo :THING ;Outro atom; avaliado para o símbolo :thing. - - t ; outro atom, denotado true. - - (+ 1 2 3 4) ; uma s-expression '(4 :foo t) ;outra s-expression -- cgit v1.2.3 From a56473fc318aefbe279077c9fa6efc275894ab39 Mon Sep 17 00:00:00 2001 From: elf Date: Fri, 26 Dec 2014 09:15:03 -0200 Subject: clean up and improvements --- pt-br/common-lisp-pt.html.markdown | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pt-br/common-lisp-pt.html.markdown b/pt-br/common-lisp-pt.html.markdown index ba45c4ed..b154c544 100644 --- a/pt-br/common-lisp-pt.html.markdown +++ b/pt-br/common-lisp-pt.html.markdown @@ -12,7 +12,7 @@ para uma variedade de aplicações na indústria. É frequentemente citada como uma linguagem de programação programável. -O ponto inicial clássico é [Practical Common Lisp and freely available.](http://www.gigamonkeys.com/book/) +O ponto inicial clássico é [Practical Common Lisp e livremente disponível](http://www.gigamonkeys.com/book/) Outro livro recente e popular é o [Land of Lisp](http://landoflisp.com/). @@ -60,7 +60,7 @@ t ; outro atom, denotado true. ;; Existe uma variedade de implementações; a maioria segue o padrão. ;; CLISP é um bom ponto de partida. -;; Bibliotecas são gerenciadas através do Quicklisp.org's Quicklisp systemm. +;; Bibliotecas são gerenciadas através do Quicklisp.org's Quicklisp sistema. ;; Common Lisp é normalmente desenvolvido com um editor de texto e um REPL ;; (Read Evaluate Print Loop) rodando ao mesmo tempo. O REPL permite exploração @@ -73,7 +73,7 @@ t ; outro atom, denotado true. ;;; Símbolos -'foo ; => FOO Perceba que um símbolo é automáticamente convertido para maíusculo. +'foo ; => FOO Perceba que um símbolo é automáticamente convertido para maiúscula. ;; Intern manualmente cria um símbolo a partir de uma string. @@ -413,7 +413,8 @@ nil ; para false - e para lista vazia ((< 2 2) (error "wrong again!")) (t 'ok)) ; => 'OK -;; Typecase é um condicional que escolhe uma de seus cláusulas com base do tipo do valor +;; Typecase é um condicional que escolhe uma de seus cláusulas com base do tipo +;; do seu valor (typecase 1 (string :string) @@ -542,8 +543,8 @@ nil ; para false - e para lista vazia ;; pi já é definido para a gente em Lisp! ;; Vamos supor que nós descobrimos que o valor da eficiência do número -;; de remadores em uma canoa é aproximadamente logarítmica. Isso provavelmente deve ser definido -;; no construtor / inicializador. +;; de remadores em uma canoa é aproximadamente logarítmica. Isso provavelmente +;; deve ser definido no construtor / inicializador. ;; Veja como initializar sua instância após Common Lisp ter construído isso: @@ -564,7 +565,7 @@ nil ; para false - e para lista vazia ;; Macros permitem que você estenda a sintaxe da lingaugem -;; Common Lisp nãov vem com um loop WHILE- vamos adicionar um. +;; Common Lisp não vem com um loop WHILE - vamos adicionar um. ;; Se obedecermos nossos instintos 'assembler', acabamos com: (defmacro while (condition &body body) -- cgit v1.2.3 From f4c735c05021418bf8e207d49619397bfe37eff7 Mon Sep 17 00:00:00 2001 From: elf Date: Fri, 26 Dec 2014 09:19:21 -0200 Subject: fix. --- pt-br/common-lisp-pt.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pt-br/common-lisp-pt.html.markdown b/pt-br/common-lisp-pt.html.markdown index b154c544..5561c23d 100644 --- a/pt-br/common-lisp-pt.html.markdown +++ b/pt-br/common-lisp-pt.html.markdown @@ -178,7 +178,7 @@ nil ; para false - e para lista vazia (dog-p *rover*) ; => t ;; ewww) (dog-name *rover*) ; => "rover" -;; Dog-p, make-dog, and dog-name foram todas criadas por defstruct! +;; Dog-p, make-dog, e dog-name foram todas criadas por defstruct! ;;; Pares ;; `cons' constroi pares, `car' and `cdr' extrai o primeiro @@ -615,7 +615,7 @@ nil ; para false - e para lista vazia ## Créditos -Muitos agradecimentos ao pessoal de Schema fornecer um grande ponto de partida +Muitos agradecimentos ao pessoal de Schema por fornecer um grande ponto de partida o que facilitou muito a migração para Common Lisp. - [Paul Khuong](https://github.com/pkhuong) pelas grandes revisiões. -- cgit v1.2.3 From b59262601656a0f803729d37b6c83d414af0457a Mon Sep 17 00:00:00 2001 From: elf Date: Fri, 26 Dec 2014 09:20:30 -0200 Subject: fix word --- pt-br/common-lisp-pt.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pt-br/common-lisp-pt.html.markdown b/pt-br/common-lisp-pt.html.markdown index 5561c23d..ce654846 100644 --- a/pt-br/common-lisp-pt.html.markdown +++ b/pt-br/common-lisp-pt.html.markdown @@ -618,4 +618,4 @@ nil ; para false - e para lista vazia Muitos agradecimentos ao pessoal de Schema por fornecer um grande ponto de partida o que facilitou muito a migração para Common Lisp. -- [Paul Khuong](https://github.com/pkhuong) pelas grandes revisiões. +- [Paul Khuong](https://github.com/pkhuong) pelas grandes revisões. -- cgit v1.2.3 From 1c52c5ea125285eb8a3af5cf4cb510e9c3e7a49b Mon Sep 17 00:00:00 2001 From: ven Date: Mon, 29 Dec 2014 22:48:01 +0100 Subject: @wryk++ --- perl6.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl6.html.markdown b/perl6.html.markdown index 1536b152..b10e04bf 100644 --- a/perl6.html.markdown +++ b/perl6.html.markdown @@ -212,7 +212,7 @@ say $x; #=> 52 # - `if` # Before talking about `if`, we need to know which values are "Truthy" # (represent True), and which are "Falsey" (or "Falsy") -- represent False. -# Only these values are Falsey: (), 0, "0", Nil, A type (like `Str` or `Int`), +# Only these values are Falsey: (), 0, "0", "", Nil, A type (like `Str` or `Int`), # and of course False itself. # Every other value is Truthy. if True { -- cgit v1.2.3 From 228cc6ec5ae0d20a94292c66cf43e44755d3758b Mon Sep 17 00:00:00 2001 From: Cameron Steele Date: Mon, 29 Dec 2014 15:00:12 -0800 Subject: typo in Haxe documentation --- haxe.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/haxe.html.markdown b/haxe.html.markdown index 6a868f09..8599de8d 100644 --- a/haxe.html.markdown +++ b/haxe.html.markdown @@ -484,7 +484,7 @@ class LearnHaxe3{ // we can read this variable trace(foo_instance.public_read + " is the value for foo_instance.public_read"); // but not write it - // foo_instance.public_write = 4; // this will throw an error if uncommented: + // foo_instance.public_read = 4; // this will throw an error if uncommented: // trace(foo_instance.public_write); // as will this. trace(foo_instance + " is the value for foo_instance"); // calls the toString method -- cgit v1.2.3 From 427875663c221ae11ff3b8a8a6e6d66e89b36ac2 Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 11:56:23 +0200 Subject: basic --- tr-tr/csharp-tr.html.markdown | 824 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 824 insertions(+) create mode 100644 tr-tr/csharp-tr.html.markdown diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown new file mode 100644 index 00000000..ecbc2b18 --- /dev/null +++ b/tr-tr/csharp-tr.html.markdown @@ -0,0 +1,824 @@ +--- +language: c# +contributors: + - ["Irfan Charania", "https://github.com/irfancharania"] + - ["Max Yankov", "https://github.com/golergka"] + - ["Melvyn Laïly", "http://x2a.yt"] + - ["Shaun McCarthy", "http://www.shaunmccarthy.com"] + - ["Melih Mucuk", "http://melihmucuk.com"] +filename: LearnCSharp.cs +--- + +C# zarif ve tip güvenli nesne yönelimli bir dil olup geliştiricilerin .NET framework üzerinde çalışan güçlü ve güvenli uygulamalar geliştirmesini sağlar. + +[Daha fazlasını okuyun.](http://msdn.microsoft.com/en-us/library/vstudio/z1zx9t92.aspx) + +```c# +// Tek satırlık yorumlar // ile başlar +/* +Birden fazla satırlı yorumlar buna benzer +*/ +/// +/// Bu bir XML dokümantasyon yorumu +/// + +// Uygulamanın kullanacağı ad alanlarını belirtin +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Dynamic; +using System.Linq; +using System.Linq.Expressions; +using System.Net; +using System.Threading.Tasks; +using System.IO; + +// Kodu düzenlemek için paketler içinde alan tanımlayın +namespace Learning +{ + // Her .cs dosyası, dosya ile aynı isimde en az bir sınıf içermeli + // bu kurala uymak zorunda değilsiniz ancak mantıklı olan yol budur. + public class LearnCSharp + { + // TEMEL SÖZ DİZİMİ - daha önce Java ya da C++ kullandıysanız İLGİNÇ ÖZELLİKLER'e geçin + public static void Syntax() + { + // Satırları yazdırmak için Console.WriteLine kullanın + Console.WriteLine("Merhaba Dünya"); + Console.WriteLine( + "Integer: " + 10 + + " Double: " + 3.14 + + " Boolean: " + true); + + // Yeni satıra geçmeden yazdırmak için Console.Write kullanın + Console.Write("Merhaba "); + Console.Write("Dünya"); + + /////////////////////////////////////////////////// + // Tipler & Değişkenler + // + // Bir değişken tanımlamak için kullanın + /////////////////////////////////////////////////// + + // Sbyte - Signed 8-bit integer + // (-128 <= sbyte <= 127) + sbyte fooSbyte = 100; + + // Byte - Unsigned 8-bit integer + // (0 <= byte <= 255) + byte fooByte = 100; + + // Short - 16-bit integer + // Signed - (-32,768 <= short <= 32,767) + // Unsigned - (0 <= ushort <= 65,535) + short fooShort = 10000; + ushort fooUshort = 10000; + + // Integer - 32-bit integer + int fooInt = 1; // (-2,147,483,648 <= int <= 2,147,483,647) + uint fooUint = 1; // (0 <= uint <= 4,294,967,295) + + // Long - 64-bit integer + long fooLong = 100000L; // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807) + ulong fooUlong = 100000L; // (0 <= ulong <= 18,446,744,073,709,551,615) + // Numbers default to being int or uint depending on size. + // L is used to denote that this variable value is of type long or ulong + + // Double - Double-precision 64-bit IEEE 754 Floating Point + double fooDouble = 123.4; // Precision: 15-16 digits + + // Float - Single-precision 32-bit IEEE 754 Floating Point + float fooFloat = 234.5f; // Precision: 7 digits + // f is used to denote that this variable value is of type float + + // Decimal - a 128-bits data type, with more precision than other floating-point types, + // suited for financial and monetary calculations + decimal fooDecimal = 150.3m; + + // Boolean - true & false + bool fooBoolean = true; // or false + + // Char - A single 16-bit Unicode character + char fooChar = 'A'; + + // Strings -- unlike the previous base types which are all value types, + // a string is a reference type. That is, you can set it to null + string fooString = "\"escape\" quotes and add \n (new lines) and \t (tabs)"; + Console.WriteLine(fooString); + + // You can access each character of the string with an indexer: + char charFromString = fooString[1]; // => 'e' + // Strings are immutable: you can't do fooString[1] = 'X'; + + // Compare strings with current culture, ignoring case + string.Compare(fooString, "x", StringComparison.CurrentCultureIgnoreCase); + + // Formatting, based on sprintf + string fooFs = string.Format("Check Check, {0} {1}, {0} {1:0.0}", 1, 2); + + // Dates & Formatting + DateTime fooDate = DateTime.Now; + Console.WriteLine(fooDate.ToString("hh:mm, dd MMM yyyy")); + + // You can split a string over two lines with the @ symbol. To escape " use "" + string bazString = @"Here's some stuff +on a new line! ""Wow!"", the masses cried"; + + // Use const or read-only to make a variable immutable + // const values are calculated at compile time + const int HOURS_I_WORK_PER_WEEK = 9001; + + /////////////////////////////////////////////////// + // Data Structures + /////////////////////////////////////////////////// + + // Arrays - zero indexed + // The array size must be decided upon declaration + // The format for declaring an array is follows: + // [] = new []; + int[] intArray = new int[10]; + + // Another way to declare & initialize an array + int[] y = { 9000, 1000, 1337 }; + + // Indexing an array - Accessing an element + Console.WriteLine("intArray @ 0: " + intArray[0]); + // Arrays are mutable. + intArray[1] = 1; + + // Lists + // Lists are used more frequently than arrays as they are more flexible + // The format for declaring a list is follows: + // List = new List(); + List intList = new List(); + List stringList = new List(); + List z = new List { 9000, 1000, 1337 }; // intialize + // The <> are for generics - Check out the cool stuff section + + // Lists don't default to a value; + // A value must be added before accessing the index + intList.Add(1); + Console.WriteLine("intList @ 0: " + intList[0]); + + // Others data structures to check out: + // Stack/Queue + // Dictionary (an implementation of a hash map) + // HashSet + // Read-only Collections + // Tuple (.Net 4+) + + /////////////////////////////////////// + // Operators + /////////////////////////////////////// + Console.WriteLine("\n->Operators"); + + int i1 = 1, i2 = 2; // Shorthand for multiple declarations + + // Arithmetic is straightforward + Console.WriteLine(i1 + i2 - i1 * 3 / 7); // => 3 + + // Modulo + Console.WriteLine("11%3 = " + (11 % 3)); // => 2 + + // Comparison operators + Console.WriteLine("3 == 2? " + (3 == 2)); // => false + Console.WriteLine("3 != 2? " + (3 != 2)); // => true + Console.WriteLine("3 > 2? " + (3 > 2)); // => true + Console.WriteLine("3 < 2? " + (3 < 2)); // => false + Console.WriteLine("2 <= 2? " + (2 <= 2)); // => true + Console.WriteLine("2 >= 2? " + (2 >= 2)); // => true + + // Bitwise operators! + /* + ~ Unary bitwise complement + << Signed left shift + >> Signed right shift + & Bitwise AND + ^ Bitwise exclusive OR + | Bitwise inclusive OR + */ + + // Incrementations + int i = 0; + Console.WriteLine("\n->Inc/Dec-rementation"); + Console.WriteLine(i++); //i = 1. Post-Incrementation + Console.WriteLine(++i); //i = 2. Pre-Incrementation + Console.WriteLine(i--); //i = 1. Post-Decrementation + Console.WriteLine(--i); //i = 0. Pre-Decrementation + + /////////////////////////////////////// + // Control Structures + /////////////////////////////////////// + Console.WriteLine("\n->Control Structures"); + + // If statements are c-like + int j = 10; + if (j == 10) + { + Console.WriteLine("I get printed"); + } + else if (j > 10) + { + Console.WriteLine("I don't"); + } + else + { + Console.WriteLine("I also don't"); + } + + // Ternary operators + // A simple if/else can be written as follows + // ? : + string isTrue = (true) ? "True" : "False"; + + // While loop + int fooWhile = 0; + while (fooWhile < 100) + { + //Iterated 100 times, fooWhile 0->99 + fooWhile++; + } + + // Do While Loop + int fooDoWhile = 0; + do + { + //Iterated 100 times, fooDoWhile 0->99 + fooDoWhile++; + } while (fooDoWhile < 100); + + //for loop structure => for(; ; ) + for (int fooFor = 0; fooFor < 10; fooFor++) + { + //Iterated 10 times, fooFor 0->9 + } + + // For Each Loop + // foreach loop structure => foreach( in ) + // The foreach loop loops over any object implementing IEnumerable or IEnumerable + // All the collection types (Array, List, Dictionary...) in the .Net framework + // implement one or both of these interfaces. + // (The ToCharArray() could be removed, because a string also implements IEnumerable) + foreach (char character in "Hello World".ToCharArray()) + { + //Iterated over all the characters in the string + } + + // Switch Case + // A switch works with the byte, short, char, and int data types. + // It also works with enumerated types (discussed in Enum Types), + // the String class, and a few special classes that wrap + // primitive types: Character, Byte, Short, and Integer. + int month = 3; + string monthString; + switch (month) + { + case 1: + monthString = "January"; + break; + case 2: + monthString = "February"; + break; + case 3: + monthString = "March"; + break; + // You can assign more than one case to an action + // But you can't add an action without a break before another case + // (if you want to do this, you would have to explicitly add a goto case x + case 6: + case 7: + case 8: + monthString = "Summer time!!"; + break; + default: + monthString = "Some other month"; + break; + } + + /////////////////////////////////////// + // Converting Data Types And Typecasting + /////////////////////////////////////// + + // Converting data + + // Convert String To Integer + // this will throw an Exception on failure + int.Parse("123");//returns an integer version of "123" + + // try parse will default to type default on failure + // in this case: 0 + int tryInt; + if (int.TryParse("123", out tryInt)) // Function is boolean + Console.WriteLine(tryInt); // 123 + + // Convert Integer To String + // Convert class has a number of methods to facilitate conversions + Convert.ToString(123); + // or + tryInt.ToString(); + } + + /////////////////////////////////////// + // CLASSES - see definitions at end of file + /////////////////////////////////////// + public static void Classes() + { + // See Declaration of objects at end of file + + // Use new to instantiate a class + Bicycle trek = new Bicycle(); + + // Call object methods + trek.SpeedUp(3); // You should always use setter and getter methods + trek.Cadence = 100; + + // ToString is a convention to display the value of this Object. + Console.WriteLine("trek info: " + trek.Info()); + + // Instantiate a new Penny Farthing + PennyFarthing funbike = new PennyFarthing(1, 10); + Console.WriteLine("funbike info: " + funbike.Info()); + + Console.Read(); + } // End main method + + // CONSOLE ENTRY A console application must have a main method as an entry point + public static void Main(string[] args) + { + OtherInterestingFeatures(); + } + + // + // INTERESTING FEATURES + // + + // DEFAULT METHOD SIGNATURES + + public // Visibility + static // Allows for direct call on class without object + int // Return Type, + MethodSignatures( + int maxCount, // First variable, expects an int + int count = 0, // will default the value to 0 if not passed in + int another = 3, + params string[] otherParams // captures all other parameters passed to method + ) + { + return -1; + } + + // Methods can have the same name, as long as the signature is unique + public static void MethodSignatures(string maxCount) + { + } + + // GENERICS + // The classes for TKey and TValue is specified by the user calling this function. + // This method emulates the SetDefault of Python + public static TValue SetDefault( + IDictionary dictionary, + TKey key, + TValue defaultItem) + { + TValue result; + if (!dictionary.TryGetValue(key, out result)) + return dictionary[key] = defaultItem; + return result; + } + + // You can narrow down the objects that are passed in + public static void IterateAndPrint(T toPrint) where T: IEnumerable + { + // We can iterate, since T is a IEnumerable + foreach (var item in toPrint) + // Item is an int + Console.WriteLine(item.ToString()); + } + + public static void OtherInterestingFeatures() + { + // OPTIONAL PARAMETERS + MethodSignatures(3, 1, 3, "Some", "Extra", "Strings"); + MethodSignatures(3, another: 3); // explicity set a parameter, skipping optional ones + + // EXTENSION METHODS + int i = 3; + i.Print(); // Defined below + + // NULLABLE TYPES - great for database interaction / return values + // any value type (i.e. not a class) can be made nullable by suffixing a ? + // ? = + int? nullable = null; // short hand for Nullable + Console.WriteLine("Nullable variable: " + nullable); + bool hasValue = nullable.HasValue; // true if not null + + // ?? is syntactic sugar for specifying default value (coalesce) + // in case variable is null + int notNullable = nullable ?? 0; // 0 + + // IMPLICITLY TYPED VARIABLES - you can let the compiler work out what the type is: + var magic = "magic is a string, at compile time, so you still get type safety"; + // magic = 9; will not work as magic is a string, not an int + + // GENERICS + // + var phonebook = new Dictionary() { + {"Sarah", "212 555 5555"} // Add some entries to the phone book + }; + + // Calling SETDEFAULT defined as a generic above + Console.WriteLine(SetDefault(phonebook, "Shaun", "No Phone")); // No Phone + // nb, you don't need to specify the TKey and TValue since they can be + // derived implicitly + Console.WriteLine(SetDefault(phonebook, "Sarah", "No Phone")); // 212 555 5555 + + // LAMBDA EXPRESSIONS - allow you to write code in line + Func square = (x) => x * x; // Last T item is the return value + Console.WriteLine(square(3)); // 9 + + // DISPOSABLE RESOURCES MANAGEMENT - let you handle unmanaged resources easily. + // Most of objects that access unmanaged resources (file handle, device contexts, etc.) + // implement the IDisposable interface. The using statement takes care of + // cleaning those IDisposable objects for you. + using (StreamWriter writer = new StreamWriter("log.txt")) + { + writer.WriteLine("Nothing suspicious here"); + // At the end of scope, resources will be released. + // Even if an exception is thrown. + } + + // PARALLEL FRAMEWORK + // http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx + var websites = new string[] { + "http://www.google.com", "http://www.reddit.com", + "http://www.shaunmccarthy.com" + }; + var responses = new Dictionary(); + + // Will spin up separate threads for each request, and join on them + // before going to the next step! + Parallel.ForEach(websites, + new ParallelOptions() {MaxDegreeOfParallelism = 3}, // max of 3 threads + website => + { + // Do something that takes a long time on the file + using (var r = WebRequest.Create(new Uri(website)).GetResponse()) + { + responses[website] = r.ContentType; + } + }); + + // This won't happen till after all requests have been completed + foreach (var key in responses.Keys) + Console.WriteLine("{0}:{1}", key, responses[key]); + + // DYNAMIC OBJECTS (great for working with other languages) + dynamic student = new ExpandoObject(); + student.FirstName = "First Name"; // No need to define class first! + + // You can even add methods (returns a string, and takes in a string) + student.Introduce = new Func( + (introduceTo) => string.Format("Hey {0}, this is {1}", student.FirstName, introduceTo)); + Console.WriteLine(student.Introduce("Beth")); + + // IQUERYABLE - almost all collections implement this, which gives you a lot of + // very useful Map / Filter / Reduce style methods + var bikes = new List(); + bikes.Sort(); // Sorts the array + bikes.Sort((b1, b2) => b1.Wheels.CompareTo(b2.Wheels)); // Sorts based on wheels + var result = bikes + .Where(b => b.Wheels > 3) // Filters - chainable (returns IQueryable of previous type) + .Where(b => b.IsBroken && b.HasTassles) + .Select(b => b.ToString()); // Map - we only this selects, so result is a IQueryable + + var sum = bikes.Sum(b => b.Wheels); // Reduce - sums all the wheels in the collection + + // Create a list of IMPLICIT objects based on some parameters of the bike + var bikeSummaries = bikes.Select(b=>new { Name = b.Name, IsAwesome = !b.IsBroken && b.HasTassles }); + // Hard to show here, but you get type ahead completion since the compiler can implicitly work + // out the types above! + foreach (var bikeSummary in bikeSummaries.Where(b => b.IsAwesome)) + Console.WriteLine(bikeSummary.Name); + + // ASPARALLEL + // And this is where things get wicked - combines linq and parallel operations + var threeWheelers = bikes.AsParallel().Where(b => b.Wheels == 3).Select(b => b.Name); + // this will happen in parallel! Threads will automagically be spun up and the + // results divvied amongst them! Amazing for large datasets when you have lots of + // cores + + // LINQ - maps a store to IQueryable objects, with delayed execution + // e.g. LinqToSql - maps to a database, LinqToXml maps to an xml document + var db = new BikeRepository(); + + // execution is delayed, which is great when querying a database + var filter = db.Bikes.Where(b => b.HasTassles); // no query run + if (42 > 6) // You can keep adding filters, even conditionally - great for "advanced search" functionality + filter = filter.Where(b => b.IsBroken); // no query run + + var query = filter + .OrderBy(b => b.Wheels) + .ThenBy(b => b.Name) + .Select(b => b.Name); // still no query run + + // Now the query runs, but opens a reader, so only populates are you iterate through + foreach (string bike in query) + Console.WriteLine(result); + + + + } + + } // End LearnCSharp class + + // You can include other classes in a .cs file + + public static class Extensions + { + // EXTENSION FUNCTIONS + public static void Print(this object obj) + { + Console.WriteLine(obj.ToString()); + } + } + + // Class Declaration Syntax: + // class { + // //data fields, constructors, functions all inside. + // //functions are called as methods in Java. + // } + + public class Bicycle + { + // Bicycle's Fields/Variables + public int Cadence // Public: Can be accessed from anywhere + { + get // get - define a method to retrieve the property + { + return _cadence; + } + set // set - define a method to set a proprety + { + _cadence = value; // Value is the value passed in to the setter + } + } + private int _cadence; + + protected virtual int Gear // Protected: Accessible from the class and subclasses + { + get; // creates an auto property so you don't need a member field + set; + } + + internal int Wheels // Internal: Accessible from within the assembly + { + get; + private set; // You can set modifiers on the get/set methods + } + + int _speed; // Everything is private by default: Only accessible from within this class. + // can also use keyword private + public string Name { get; set; } + + // Enum is a value type that consists of a set of named constants + // It is really just mapping a name to a value (an int, unless specified otherwise). + // The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong. + // An enum can't contain the same value twice. + public enum BikeBrand + { + AIST, + BMC, + Electra = 42, //you can explicitly set a value to a name + Gitane // 43 + } + // We defined this type inside a Bicycle class, so it is a nested type + // Code outside of this class should reference this type as Bicycle.Brand + + public BikeBrand Brand; // After declaring an enum type, we can declare the field of this type + + // Static members belong to the type itself rather then specific object. + // You can access them without a reference to any object: + // Console.WriteLine("Bicycles created: " + Bicycle.bicyclesCreated); + static public int BicyclesCreated = 0; + + // readonly values are set at run time + // they can only be assigned upon declaration or in a constructor + readonly bool _hasCardsInSpokes = false; // read-only private + + // Constructors are a way of creating classes + // This is a default constructor + public Bicycle() + { + this.Gear = 1; // you can access members of the object with the keyword this + Cadence = 50; // but you don't always need it + _speed = 5; + Name = "Bontrager"; + Brand = BikeBrand.AIST; + BicyclesCreated++; + } + + // This is a specified constructor (it contains arguments) + public Bicycle(int startCadence, int startSpeed, int startGear, + string name, bool hasCardsInSpokes, BikeBrand brand) + : base() // calls base first + { + Gear = startGear; + Cadence = startCadence; + _speed = startSpeed; + Name = name; + _hasCardsInSpokes = hasCardsInSpokes; + Brand = brand; + } + + // Constructors can be chained + public Bicycle(int startCadence, int startSpeed, BikeBrand brand) : + this(startCadence, startSpeed, 0, "big wheels", true, brand) + { + } + + // Function Syntax: + // () + + // classes can implement getters and setters for their fields + // or they can implement properties (this is the preferred way in C#) + + // Method parameters can have default values. + // In this case, methods can be called with these parameters omitted + public void SpeedUp(int increment = 1) + { + _speed += increment; + } + + public void SlowDown(int decrement = 1) + { + _speed -= decrement; + } + + // properties get/set values + // when only data needs to be accessed, consider using properties. + // properties may have either get or set, or both + private bool _hasTassles; // private variable + public bool HasTassles // public accessor + { + get { return _hasTassles; } + set { _hasTassles = value; } + } + + // You can also define an automatic property in one line + // this syntax will create a backing field automatically. + // You can set an access modifier on either the getter or the setter (or both) + // to restrict its access: + public bool IsBroken { get; private set; } + + // Properties can be auto-implemented + public int FrameSize + { + get; + // you are able to specify access modifiers for either get or set + // this means only Bicycle class can call set on Framesize + private set; + } + + // It's also possible to define custom Indexers on objects. + // All though this is not entirely useful in this example, you + // could do bicycle[0] which yields "chris" to get the first passenger or + // bicycle[1] = "lisa" to set the passenger. (of this apparent quattrocycle) + private string[] passengers = { "chris", "phil", "darren", "regina" } + + public string this[int i] + { + get { + return passengers[i]; + } + + set { + return passengers[i] = value; + } + } + + //Method to display the attribute values of this Object. + public virtual string Info() + { + return "Gear: " + Gear + + " Cadence: " + Cadence + + " Speed: " + _speed + + " Name: " + Name + + " Cards in Spokes: " + (_hasCardsInSpokes ? "yes" : "no") + + "\n------------------------------\n" + ; + } + + // Methods can also be static. It can be useful for helper methods + public static bool DidWeCreateEnoughBycles() + { + // Within a static method, we only can reference static class members + return BicyclesCreated > 9000; + } // If your class only needs static members, consider marking the class itself as static. + + + } // end class Bicycle + + // PennyFarthing is a subclass of Bicycle + class PennyFarthing : Bicycle + { + // (Penny Farthings are those bicycles with the big front wheel. + // They have no gears.) + + // calling parent constructor + public PennyFarthing(int startCadence, int startSpeed) : + base(startCadence, startSpeed, 0, "PennyFarthing", true, BikeBrand.Electra) + { + } + + protected override int Gear + { + get + { + return 0; + } + set + { + throw new ArgumentException("You can't change gears on a PennyFarthing"); + } + } + + public override string Info() + { + string result = "PennyFarthing bicycle "; + result += base.ToString(); // Calling the base version of the method + return result; + } + } + + // Interfaces only contain signatures of the members, without the implementation. + interface IJumpable + { + void Jump(int meters); // all interface members are implicitly public + } + + interface IBreakable + { + bool Broken { get; } // interfaces can contain properties as well as methods & events + } + + // Class can inherit only one other class, but can implement any amount of interfaces + class MountainBike : Bicycle, IJumpable, IBreakable + { + int damage = 0; + + public void Jump(int meters) + { + damage += meters; + } + + public bool Broken + { + get + { + return damage > 100; + } + } + } + + /// + /// Used to connect to DB for LinqToSql example. + /// EntityFramework Code First is awesome (similar to Ruby's ActiveRecord, but bidirectional) + /// http://msdn.microsoft.com/en-us/data/jj193542.aspx + /// + public class BikeRepository : DbSet + { + public BikeRepository() + : base() + { + } + + public DbSet Bikes { get; set; } + } +} // End Namespace +``` + +## Topics Not Covered + + * Flags + * Attributes + * Static properties + * Exceptions, Abstraction + * ASP.NET (Web Forms/MVC/WebMatrix) + * Winforms + * Windows Presentation Foundation (WPF) + +## Further Reading + + * [DotNetPerls](http://www.dotnetperls.com) + * [C# in Depth](http://manning.com/skeet2) + * [Programming C#](http://shop.oreilly.com/product/0636920024064.do) + * [LINQ](http://shop.oreilly.com/product/9780596519254.do) + * [MSDN Library](http://msdn.microsoft.com/en-us/library/618ayhy6.aspx) + * [ASP.NET MVC Tutorials](http://www.asp.net/mvc/tutorials) + * [ASP.NET Web Matrix Tutorials](http://www.asp.net/web-pages/tutorials) + * [ASP.NET Web Forms Tutorials](http://www.asp.net/web-forms/tutorials) + * [Windows Forms Programming in C#](http://www.amazon.com/Windows-Forms-Programming-Chris-Sells/dp/0321116208) + + + +[C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx) -- cgit v1.2.3 From 32174fe9ce787f9135bda27dd3d3fddc9b0225bd Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 12:01:40 +0200 Subject: types --- tr-tr/csharp-tr.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index ecbc2b18..29c29145 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -81,8 +81,8 @@ namespace Learning // Long - 64-bit integer long fooLong = 100000L; // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807) ulong fooUlong = 100000L; // (0 <= ulong <= 18,446,744,073,709,551,615) - // Numbers default to being int or uint depending on size. - // L is used to denote that this variable value is of type long or ulong + // Sayılar boyutlarına göre ön tanımlı olarak int ya da uint olabilir. + // L, bir değerin long ya da ulong tipinde olduğunu belirtmek için kullanılır. // Double - Double-precision 64-bit IEEE 754 Floating Point double fooDouble = 123.4; // Precision: 15-16 digits -- cgit v1.2.3 From 20a921fd03a8274e817944f5732b7b69f4267abd Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 16:07:18 +0200 Subject: arrays --- tr-tr/csharp-tr.html.markdown | 52 +++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index 29c29145..8c6a7d43 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -82,63 +82,63 @@ namespace Learning long fooLong = 100000L; // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807) ulong fooUlong = 100000L; // (0 <= ulong <= 18,446,744,073,709,551,615) // Sayılar boyutlarına göre ön tanımlı olarak int ya da uint olabilir. - // L, bir değerin long ya da ulong tipinde olduğunu belirtmek için kullanılır. + // L, değişken değerinin long ya da ulong tipinde olduğunu belirtmek için kullanılır. - // Double - Double-precision 64-bit IEEE 754 Floating Point - double fooDouble = 123.4; // Precision: 15-16 digits + // Double - Çift hassasiyetli 64-bit IEEE 754 kayan sayı + double fooDouble = 123.4; // Hassasiyet: 15-16 basamak - // Float - Single-precision 32-bit IEEE 754 Floating Point - float fooFloat = 234.5f; // Precision: 7 digits - // f is used to denote that this variable value is of type float + // Float - Tek hassasiyetli 32-bit IEEE 754 kayan sayı + float fooFloat = 234.5f; // Hassasiyet: 7 basamak + // f, değişken değerinin float tipinde olduğunu belirtmek için kullanılır. - // Decimal - a 128-bits data type, with more precision than other floating-point types, - // suited for financial and monetary calculations + // Decimal - 128-bit veri tiğinde ve diğer kayan sayı veri tiplerinden daha hassastır, + // finansal ve mali hesaplamalar için uygundur. decimal fooDecimal = 150.3m; // Boolean - true & false - bool fooBoolean = true; // or false + bool fooBoolean = true; // veya false - // Char - A single 16-bit Unicode character + // Char - 16-bitlik tek bir unicode karakter char fooChar = 'A'; - // Strings -- unlike the previous base types which are all value types, - // a string is a reference type. That is, you can set it to null + // Strings -- Önceki baz tiplerinin hepsi değer tipiyken, + // string bir referans tipidir. Null değer atayabilirsiniz string fooString = "\"escape\" quotes and add \n (new lines) and \t (tabs)"; Console.WriteLine(fooString); - // You can access each character of the string with an indexer: + // İndeks numarası kullanarak bir string'in bütün karakterlerine erişilebilirsiniz: char charFromString = fooString[1]; // => 'e' - // Strings are immutable: you can't do fooString[1] = 'X'; + // String'ler değiştirilemez: fooString[1] = 'X' işlemini yapamazsınız; - // Compare strings with current culture, ignoring case + // String'leri geçerli kültür değeri ve büyük küçük harf duyarlılığı olmadan karşılaştırma string.Compare(fooString, "x", StringComparison.CurrentCultureIgnoreCase); - // Formatting, based on sprintf + // sprintf baz alınarak formatlama string fooFs = string.Format("Check Check, {0} {1}, {0} {1:0.0}", 1, 2); - // Dates & Formatting + // Tarihler & Formatlama DateTime fooDate = DateTime.Now; Console.WriteLine(fooDate.ToString("hh:mm, dd MMM yyyy")); - // You can split a string over two lines with the @ symbol. To escape " use "" + // Bir string'i iki satıra bölmek için @ sembolü kullanabilirsiniz. " işaretinden kaçmak için "" kullanın string bazString = @"Here's some stuff on a new line! ""Wow!"", the masses cried"; - // Use const or read-only to make a variable immutable - // const values are calculated at compile time + // Bir değişkeni değiştirilemez yapmak için const ya da read-only kullanın. + // const değerleri derleme sırasında hesaplanır const int HOURS_I_WORK_PER_WEEK = 9001; /////////////////////////////////////////////////// - // Data Structures + // Veri Yapıları /////////////////////////////////////////////////// - // Arrays - zero indexed - // The array size must be decided upon declaration - // The format for declaring an array is follows: - // [] = new []; + // Diziler - Sıfır indeksli + // Dizi boyutuna tanımlama sırasında karar verilmelidir. + // Dizi tanımlama formatı şöyledir: + // [] = new []; int[] intArray = new int[10]; - // Another way to declare & initialize an array + // Bir diğer dizi tanımlama formatı şöyledir: int[] y = { 9000, 1000, 1337 }; // Indexing an array - Accessing an element -- cgit v1.2.3 From 4ba98e1b9782ac8dc1a476296fb9cf1095943787 Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 16:46:49 +0200 Subject: swithc case --- tr-tr/csharp-tr.html.markdown | 98 +++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index 8c6a7d43..1ecf18e8 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -141,46 +141,46 @@ on a new line! ""Wow!"", the masses cried"; // Bir diğer dizi tanımlama formatı şöyledir: int[] y = { 9000, 1000, 1337 }; - // Indexing an array - Accessing an element + // Bir diziyi indeksleme - Bir elemente erişme Console.WriteLine("intArray @ 0: " + intArray[0]); - // Arrays are mutable. + // Diziler değiştirilebilir. intArray[1] = 1; - // Lists - // Lists are used more frequently than arrays as they are more flexible - // The format for declaring a list is follows: - // List = new List(); + // Listeler + // Listeler daha esnek oldukları için dizilerden daha sık kullanılırlar. + // Bir liste tanımlama formatı şöyledir: + // List = new List(); List intList = new List(); List stringList = new List(); - List z = new List { 9000, 1000, 1337 }; // intialize - // The <> are for generics - Check out the cool stuff section + List z = new List { 9000, 1000, 1337 }; // tanımlama + // <> işareti genelleme içindir - Güzel özellikler sekmesini inceleyin - // Lists don't default to a value; - // A value must be added before accessing the index + // Listelerin varsayılan bir değeri yoktur; + // İndekse erişmeden önce değer eklenmiş olmalıdır intList.Add(1); Console.WriteLine("intList @ 0: " + intList[0]); - // Others data structures to check out: - // Stack/Queue - // Dictionary (an implementation of a hash map) - // HashSet - // Read-only Collections - // Tuple (.Net 4+) + // Diğer veri yapıları için şunlara bakın: + // Stack/Queue (Yığın/Kuyruk) + // Dictionary (hash map'in uygulanması) (Sözlük) + // HashSet (karma seti) + // Read-only Collections (Değiştirilemez koleksiyonlar) + // Tuple (.Net 4+) (tüp) /////////////////////////////////////// - // Operators + // Operatörler /////////////////////////////////////// Console.WriteLine("\n->Operators"); - int i1 = 1, i2 = 2; // Shorthand for multiple declarations + int i1 = 1, i2 = 2; // Birden çok tanımlamanın kısa yolu - // Arithmetic is straightforward + // Aritmetik basittir Console.WriteLine(i1 + i2 - i1 * 3 / 7); // => 3 - // Modulo + // Mod Console.WriteLine("11%3 = " + (11 % 3)); // => 2 - // Comparison operators + // Karşılaştırma operatörleri Console.WriteLine("3 == 2? " + (3 == 2)); // => false Console.WriteLine("3 != 2? " + (3 != 2)); // => true Console.WriteLine("3 > 2? " + (3 > 2)); // => true @@ -188,17 +188,17 @@ on a new line! ""Wow!"", the masses cried"; Console.WriteLine("2 <= 2? " + (2 <= 2)); // => true Console.WriteLine("2 >= 2? " + (2 >= 2)); // => true - // Bitwise operators! + // Bit düzeyi operatörleri! /* - ~ Unary bitwise complement - << Signed left shift - >> Signed right shift - & Bitwise AND - ^ Bitwise exclusive OR - | Bitwise inclusive OR + ~ Tekli bit tamamlayıcısı + << Sola kaydırma Signed left shift + >> Sağa kaydırma Signed right shift + & Bit düzeyi AND + ^ Bit düzeyi harici OR + | Bit düzeyi kapsayan OR */ - // Incrementations + // Arttırma int i = 0; Console.WriteLine("\n->Inc/Dec-rementation"); Console.WriteLine(i++); //i = 1. Post-Incrementation @@ -207,11 +207,11 @@ on a new line! ""Wow!"", the masses cried"; Console.WriteLine(--i); //i = 0. Pre-Decrementation /////////////////////////////////////// - // Control Structures + // Kontrol Yapıları /////////////////////////////////////// Console.WriteLine("\n->Control Structures"); - // If statements are c-like + // If ifadesi c benzeridir int j = 10; if (j == 10) { @@ -226,47 +226,47 @@ on a new line! ""Wow!"", the masses cried"; Console.WriteLine("I also don't"); } - // Ternary operators - // A simple if/else can be written as follows - // ? : + // Üçlü operatörler + // Basit bir if/else ifadesi şöyle yazılabilir + // ? : string isTrue = (true) ? "True" : "False"; - // While loop + // While döngüsü int fooWhile = 0; while (fooWhile < 100) { - //Iterated 100 times, fooWhile 0->99 + //100 kere tekrarlanır, fooWhile 0->99 fooWhile++; } - // Do While Loop + // Do While Döngüsü int fooDoWhile = 0; do { - //Iterated 100 times, fooDoWhile 0->99 + //100 kere tekrarlanır, fooDoWhile 0->99 fooDoWhile++; } while (fooDoWhile < 100); - //for loop structure => for(; ; ) + //for döngüsü yapısı => for(; ; ) for (int fooFor = 0; fooFor < 10; fooFor++) { - //Iterated 10 times, fooFor 0->9 + //10 kere tekrarlanır, fooFor 0->9 } - // For Each Loop - // foreach loop structure => foreach( in ) - // The foreach loop loops over any object implementing IEnumerable or IEnumerable - // All the collection types (Array, List, Dictionary...) in the .Net framework - // implement one or both of these interfaces. - // (The ToCharArray() could be removed, because a string also implements IEnumerable) + // For Each Döngüsü + // foreach döngüsü yapısı => foreach( in ) + // foreach döngüsü, IEnumerable ya da IEnumerable e dönüştürülmüş herhangi bir obje üzerinde döngü yapabilir + // .Net framework üzerindeki bütün koleksiyon tiplerinden (Dizi, Liste, Sözlük...) + // biri ya da hepsi uygulanarak gerçekleştirilebilir. + // (ToCharArray() silindi, çünkü string'ler aynı zamanda IEnumerable'dır.) foreach (char character in "Hello World".ToCharArray()) { - //Iterated over all the characters in the string + //String içindeki bütün karakterler üzerinde döner } // Switch Case - // A switch works with the byte, short, char, and int data types. - // It also works with enumerated types (discussed in Enum Types), + // Bir switch byte, short, char ve int veri tipleri ile çalışır. + // Aynı zamanda sıralı tipler ilede çalışabilir.(Enum Tipleri bölümünde tartışıldı), // the String class, and a few special classes that wrap // primitive types: Character, Byte, Short, and Integer. int month = 3; -- cgit v1.2.3 From 9b1b260c6c3510ccbcc213dd37175ae4383cf08f Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 17:13:30 +0200 Subject: classes --- tr-tr/csharp-tr.html.markdown | 50 +++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index 1ecf18e8..37a1090a 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -266,9 +266,9 @@ on a new line! ""Wow!"", the masses cried"; // Switch Case // Bir switch byte, short, char ve int veri tipleri ile çalışır. - // Aynı zamanda sıralı tipler ilede çalışabilir.(Enum Tipleri bölümünde tartışıldı), - // the String class, and a few special classes that wrap - // primitive types: Character, Byte, Short, and Integer. + // Aynı zamanda sıralı tipler ile de çalışabilir.(Enum Tipleri bölümünde tartışıldı), + // String sınıfı, ve bir kaç özel sınıf kaydırılır + // basit tipler: Character, Byte, Short, and Integer. int month = 3; string monthString; switch (month) @@ -282,9 +282,9 @@ on a new line! ""Wow!"", the masses cried"; case 3: monthString = "March"; break; - // You can assign more than one case to an action - // But you can't add an action without a break before another case - // (if you want to do this, you would have to explicitly add a goto case x + // Bir aksiyon için birden fazla durum atayabilirsiniz + // Ancak, break olmadan yeni bir durum ekleyemezsiniz + // (Eğer bunu yapmak istiyorsanız, goto komutu eklemek zorundasınız) case 6: case 7: case 8: @@ -296,51 +296,51 @@ on a new line! ""Wow!"", the masses cried"; } /////////////////////////////////////// - // Converting Data Types And Typecasting + // Veri Tipleri Dönüştürme ve Typecasting /////////////////////////////////////// - // Converting data + // Veri Dönüştürme - // Convert String To Integer - // this will throw an Exception on failure - int.Parse("123");//returns an integer version of "123" + // String'i Integer'a Dönüştürme + // bu başarısız olursa hata fırlatacaktır + int.Parse("123");// "123" 'in Integer değerini döndürür - // try parse will default to type default on failure - // in this case: 0 + // try parse hata durumunda değişkene varsayılan bir değer atamak için kullanılır + // bu durumda: 0 int tryInt; - if (int.TryParse("123", out tryInt)) // Function is boolean + if (int.TryParse("123", out tryInt)) // Fonksiyon boolean'dır Console.WriteLine(tryInt); // 123 - // Convert Integer To String - // Convert class has a number of methods to facilitate conversions + // Integer'ı String'e Dönüştürme + // Convert sınıfı dönüştürme işlemini kolaylaştırmak için bir dizi metoda sahiptir Convert.ToString(123); - // or + // veya tryInt.ToString(); } /////////////////////////////////////// - // CLASSES - see definitions at end of file + // SINIFLAR - dosyanın sonunda tanımları görebilirsiniz /////////////////////////////////////// public static void Classes() { - // See Declaration of objects at end of file + // Obje tanımlamalarını dosyanın sonunda görebilirsiniz - // Use new to instantiate a class + // Bir sınıfı türetmek için new kullanın Bicycle trek = new Bicycle(); - // Call object methods - trek.SpeedUp(3); // You should always use setter and getter methods + // Obje metodlarını çağırma + trek.SpeedUp(3); // Her zaman setter ve getter metodları kullanmalısınız trek.Cadence = 100; - // ToString is a convention to display the value of this Object. + // ToString objenin değerini göstermek için kullanılır. Console.WriteLine("trek info: " + trek.Info()); - // Instantiate a new Penny Farthing + // Yeni bir Penny Farthing sınıfı türetmek PennyFarthing funbike = new PennyFarthing(1, 10); Console.WriteLine("funbike info: " + funbike.Info()); Console.Read(); - } // End main method + } // Ana metodun sonu // CONSOLE ENTRY A console application must have a main method as an entry point public static void Main(string[] args) -- cgit v1.2.3 From 765e4d3be987edd441b5f3cdee83543645fca642 Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 19:30:07 +0200 Subject: lasssstttt --- tr-tr/csharp-tr.html.markdown | 232 +++++++++++++++++++++--------------------- 1 file changed, 114 insertions(+), 118 deletions(-) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index 37a1090a..cfbee5e8 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -153,7 +153,7 @@ on a new line! ""Wow!"", the masses cried"; List intList = new List(); List stringList = new List(); List z = new List { 9000, 1000, 1337 }; // tanımlama - // <> işareti genelleme içindir - Güzel özellikler sekmesini inceleyin + // <> işareti generic ifadeler içindir - Güzel özellikler sekmesini inceleyin // Listelerin varsayılan bir değeri yoktur; // İndekse erişmeden önce değer eklenmiş olmalıdır @@ -342,39 +342,39 @@ on a new line! ""Wow!"", the masses cried"; Console.Read(); } // Ana metodun sonu - // CONSOLE ENTRY A console application must have a main method as an entry point + // KONSOLE BAŞLANGICI Bir konsol uygulaması başlangıç olarak mutlaka ana metod'a sahip olmalı public static void Main(string[] args) { OtherInterestingFeatures(); } // - // INTERESTING FEATURES + // İLGİNÇ ÖZELLİKLER // - // DEFAULT METHOD SIGNATURES + // VARSAYILAN METOD TANIMLAMALARI - public // Visibility - static // Allows for direct call on class without object - int // Return Type, + public // Görünebilir + static // Sınıf üzerinden obje türetmeden çağırılabilir + int // Dönüş Tipi, MethodSignatures( - int maxCount, // First variable, expects an int - int count = 0, // will default the value to 0 if not passed in + int maxCount, // İlk değişken, int değer bekler + int count = 0, // Eğer değer gönderilmezse varsayılan olarak 0 değerini alır int another = 3, - params string[] otherParams // captures all other parameters passed to method + params string[] otherParams // Metoda gönderilen diğer bütün parametreleri alır ) { return -1; } - // Methods can have the same name, as long as the signature is unique + // Metodlar tanımlamalar benzersiz ise aynı isimleri alabilirler public static void MethodSignatures(string maxCount) { } - // GENERICS - // The classes for TKey and TValue is specified by the user calling this function. - // This method emulates the SetDefault of Python + // GENERIC'LER + // TKey ve TValue değerleri kullanıcı tarafından bu fonksiyon çağırılırken belirtilir. + // Bu metod Python'daki SetDefault'a benzer public static TValue SetDefault( IDictionary dictionary, TKey key, @@ -386,68 +386,66 @@ on a new line! ""Wow!"", the masses cried"; return result; } - // You can narrow down the objects that are passed in + // Gönderilen objeleri daraltabilirsiniz public static void IterateAndPrint(T toPrint) where T: IEnumerable { - // We can iterate, since T is a IEnumerable + // Eğer T IEnumerable ise tekrarlayabiliriz foreach (var item in toPrint) - // Item is an int + // Item bir int Console.WriteLine(item.ToString()); } public static void OtherInterestingFeatures() { - // OPTIONAL PARAMETERS + // İSTEĞE BAĞLI PARAMETRELER MethodSignatures(3, 1, 3, "Some", "Extra", "Strings"); - MethodSignatures(3, another: 3); // explicity set a parameter, skipping optional ones + MethodSignatures(3, another: 3); // isteğe bağlı olanlar gönderilmedi - // EXTENSION METHODS + // UZANTI METODLARI int i = 3; - i.Print(); // Defined below + i.Print(); // Aşağıda tanımlandı - // NULLABLE TYPES - great for database interaction / return values - // any value type (i.e. not a class) can be made nullable by suffixing a ? - // ? = - int? nullable = null; // short hand for Nullable + // NULLABLE TYPES - veri tabanı işlemleri için uygun / return values + // Herhangi bir değer tipi sonuna ? eklenerek nullable yapılabilir (sınıflar hariç) + // ? = + int? nullable = null; // Nullable için kısa yol Console.WriteLine("Nullable variable: " + nullable); - bool hasValue = nullable.HasValue; // true if not null + bool hasValue = nullable.HasValue; // eğer null değilse true döner - // ?? is syntactic sugar for specifying default value (coalesce) - // in case variable is null + // ?? varsayılan değer belirlemek için söz dizimsel güzel bir özellik + // bu durumda değişken null'dır int notNullable = nullable ?? 0; // 0 - // IMPLICITLY TYPED VARIABLES - you can let the compiler work out what the type is: + // TİPİ BELİRTİLMEMİŞ DEĞİŞKENLER - compiler değişkenin tipini bilmeden çalışabilir: var magic = "magic is a string, at compile time, so you still get type safety"; - // magic = 9; will not work as magic is a string, not an int + // magic = 9; string gibi çalışmayacaktır, bu bir int değil - // GENERICS + // GENERIC'LER // var phonebook = new Dictionary() { - {"Sarah", "212 555 5555"} // Add some entries to the phone book + {"Sarah", "212 555 5555"} // Telefon rehberine bir kaç numara ekleyelim. }; - // Calling SETDEFAULT defined as a generic above - Console.WriteLine(SetDefault(phonebook, "Shaun", "No Phone")); // No Phone - // nb, you don't need to specify the TKey and TValue since they can be - // derived implicitly + // Yukarıda generic olarak tanımlanan SETDEFAULT'u çağırma + Console.WriteLine(SetDefault(phonebook, "Shaun", "No Phone")); // Telefonu yok + // TKey ve TValue tipini belirtmek zorunda değilsiniz Console.WriteLine(SetDefault(phonebook, "Sarah", "No Phone")); // 212 555 5555 - // LAMBDA EXPRESSIONS - allow you to write code in line - Func square = (x) => x * x; // Last T item is the return value + // LAMBDA IFADELERİ - satır içinde kod yazmanıza olanak sağlar + Func square = (x) => x * x; // Son T nesnesi dönüş değeridir Console.WriteLine(square(3)); // 9 - // DISPOSABLE RESOURCES MANAGEMENT - let you handle unmanaged resources easily. - // Most of objects that access unmanaged resources (file handle, device contexts, etc.) - // implement the IDisposable interface. The using statement takes care of - // cleaning those IDisposable objects for you. + // TEK KULLANIMLIK KAYNAK YÖNETİMİ - Yönetilemeyen kaynakların üstesinden kolayca gelebilirsiniz. + // Bir çok obje yönetilemeyen kaynaklara (dosya yakalama, cihaz içeriği, vb.) + // IDisposable arabirimi ile erişebilir. Using ifadesi sizin için IDisposable objeleri temizler. using (StreamWriter writer = new StreamWriter("log.txt")) { writer.WriteLine("Nothing suspicious here"); - // At the end of scope, resources will be released. - // Even if an exception is thrown. + // Bu bölümün sonunda kaynaklar temilenir. + // Hata fırlatılmış olsa bile. } - // PARALLEL FRAMEWORK + // PARALEL FRAMEWORK // http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx var websites = new string[] { "http://www.google.com", "http://www.reddit.com", @@ -455,73 +453,71 @@ on a new line! ""Wow!"", the masses cried"; }; var responses = new Dictionary(); - // Will spin up separate threads for each request, and join on them - // before going to the next step! + // Her istek farklı bir thread de işlem görecek + // bir sonraki işleme geçmeden birleştirilecek. Parallel.ForEach(websites, - new ParallelOptions() {MaxDegreeOfParallelism = 3}, // max of 3 threads + new ParallelOptions() {MaxDegreeOfParallelism = 3}, // en fazla 3 thread kullanmak için website => { - // Do something that takes a long time on the file + // Uzun sürecek bir işlem yapın using (var r = WebRequest.Create(new Uri(website)).GetResponse()) { responses[website] = r.ContentType; } }); - // This won't happen till after all requests have been completed + // Bütün istekler tamamlanmadan bu döndü çalışmayacaktır. foreach (var key in responses.Keys) Console.WriteLine("{0}:{1}", key, responses[key]); - // DYNAMIC OBJECTS (great for working with other languages) + // DİNAMİK OBJELER (diğer dillerle çalışırken kullanmak için uygun) dynamic student = new ExpandoObject(); - student.FirstName = "First Name"; // No need to define class first! + student.FirstName = "First Name"; // Önce yeni bir sınıf tanımlamanız gerekmez! - // You can even add methods (returns a string, and takes in a string) + // Hatta metod bile ekleyebilirsiniz (bir string döner, ve bir string alır) student.Introduce = new Func( (introduceTo) => string.Format("Hey {0}, this is {1}", student.FirstName, introduceTo)); Console.WriteLine(student.Introduce("Beth")); - // IQUERYABLE - almost all collections implement this, which gives you a lot of - // very useful Map / Filter / Reduce style methods + // IQUERYABLE - neredeyse bütün koleksiyonlar bundan türer, bu size bir çok + // kullanışlı Map / Filter / Reduce stili metod sağlar. var bikes = new List(); - bikes.Sort(); // Sorts the array - bikes.Sort((b1, b2) => b1.Wheels.CompareTo(b2.Wheels)); // Sorts based on wheels + bikes.Sort(); // Dizi sıralama + bikes.Sort((b1, b2) => b1.Wheels.CompareTo(b2.Wheels)); // Wheels baz alınarak sıralama var result = bikes - .Where(b => b.Wheels > 3) // Filters - chainable (returns IQueryable of previous type) + .Where(b => b.Wheels > 3) // Filters- chainable (bir önceki tipin IQueryable'ını döner) .Where(b => b.IsBroken && b.HasTassles) - .Select(b => b.ToString()); // Map - we only this selects, so result is a IQueryable + .Select(b => b.ToString()); // Map - sadece bunu seçiyoruz, yani sonuç bir IQueryable olacak - var sum = bikes.Sum(b => b.Wheels); // Reduce - sums all the wheels in the collection + var sum = bikes.Sum(b => b.Wheels); // Reduce - koleksiyonda bulunan bütün wheel değerlerinin toplamı - // Create a list of IMPLICIT objects based on some parameters of the bike + // Bike içindeki bazı parametreleri baz alarak bir liste oluşturmak var bikeSummaries = bikes.Select(b=>new { Name = b.Name, IsAwesome = !b.IsBroken && b.HasTassles }); - // Hard to show here, but you get type ahead completion since the compiler can implicitly work - // out the types above! + // Burada göstermek zor ama, compiler yukaridaki tipleri çözümleyebilirse derlenmeden önce tipi verebilir. foreach (var bikeSummary in bikeSummaries.Where(b => b.IsAwesome)) Console.WriteLine(bikeSummary.Name); // ASPARALLEL - // And this is where things get wicked - combines linq and parallel operations + // Linq ve paralel işlemlerini birleştirme var threeWheelers = bikes.AsParallel().Where(b => b.Wheels == 3).Select(b => b.Name); - // this will happen in parallel! Threads will automagically be spun up and the - // results divvied amongst them! Amazing for large datasets when you have lots of - // cores + // bu paralel bir şekilde gerçekleşecek! Threadler otomatik ve sihirli bir şekilde işleri paylaşacak! + // Birden fazla çekirdeğiniz varsa büyük veri setleri ile kullanmak için oldukça uygun bir yapı. - // LINQ - maps a store to IQueryable objects, with delayed execution - // e.g. LinqToSql - maps to a database, LinqToXml maps to an xml document + // LINQ - IQueryable objelerini mapler ve saklar, gecikmeli bir işlemdir + // e.g. LinqToSql - veri tabanını mapler, LinqToXml xml dökümanlarını mapler. var db = new BikeRepository(); - // execution is delayed, which is great when querying a database - var filter = db.Bikes.Where(b => b.HasTassles); // no query run - if (42 > 6) // You can keep adding filters, even conditionally - great for "advanced search" functionality - filter = filter.Where(b => b.IsBroken); // no query run + // işlem gecikmelidir, bir veri tabanı üzerinde sorgulama yaparken harikadır. + var filter = db.Bikes.Where(b => b.HasTassles); // sorgu henüz çalışmadı + if (42 > 6) // Filtreler eklemeye devam edebilirsiniz - ileri düzey arama fonksiyonları için harikadır + filter = filter.Where(b => b.IsBroken); // sorgu henüz çalışmadı var query = filter .OrderBy(b => b.Wheels) .ThenBy(b => b.Name) - .Select(b => b.Name); // still no query run + .Select(b => b.Name); // hala sorgu çalışmadı - // Now the query runs, but opens a reader, so only populates are you iterate through + // Şimdi sorgu çalışıyor, reader'ı açar ama sadece sizin sorgunuza uyanlar foreach döngüsüne girer. foreach (string bike in query) Console.WriteLine(result); @@ -529,98 +525,98 @@ on a new line! ""Wow!"", the masses cried"; } - } // End LearnCSharp class + } // LearnCSharp sınıfının sonu - // You can include other classes in a .cs file + // Bir .cs dosyasına diğer sınıflarıda dahil edebilirsiniz public static class Extensions { - // EXTENSION FUNCTIONS + // UZANTI FONKSİYONLARI public static void Print(this object obj) { Console.WriteLine(obj.ToString()); } } - // Class Declaration Syntax: - // class { - // //data fields, constructors, functions all inside. - // //functions are called as methods in Java. + // Sınıf Tanımlama Sözdizimi: + // class { + // //veri alanları, kurucular , fonksiyonlar hepsi içindedir. + // //Fonksiyonlar Java'daki gibi metod olarak çağırılır. // } public class Bicycle { - // Bicycle's Fields/Variables - public int Cadence // Public: Can be accessed from anywhere + // Bicycle'ın Alanları/Değişkenleri + public int Cadence // Public: herhangi bir yerden erişilebilir { - get // get - define a method to retrieve the property + get // get - değeri almak için tanımlanan metod { return _cadence; } - set // set - define a method to set a proprety + set // set - değer atamak için tanımlanan metod { - _cadence = value; // Value is the value passed in to the setter + _cadence = value; // Değer setter'a gönderilen value değeridir } } private int _cadence; - protected virtual int Gear // Protected: Accessible from the class and subclasses + protected virtual int Gear // Protected: Sınıf ve alt sınıflar tarafından erişilebilir { - get; // creates an auto property so you don't need a member field + get; // bir üye alanına ihtiyacınız yok, bu otomatik olarak bir değer oluşturacaktır set; } - internal int Wheels // Internal: Accessible from within the assembly + internal int Wheels // Internal: Assembly tarafından erişilebilir { get; - private set; // You can set modifiers on the get/set methods + private set; // Nitelik belirleyicileri get/set metodlarında atayabilirsiniz } - int _speed; // Everything is private by default: Only accessible from within this class. - // can also use keyword private + int _speed; // Her şey varsayılan olarak private'dır : Sadece sınıf içinden erişilebilir. + // İsterseniz yinede private kelimesini kullanabilirsiniz. public string Name { get; set; } - // Enum is a value type that consists of a set of named constants - // It is really just mapping a name to a value (an int, unless specified otherwise). - // The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong. - // An enum can't contain the same value twice. + // Enum sabitler kümesinden oluşan bir değer tipidir. + // Gerçekten sadece bir isim ile bir değeri tutmak için kullanılır. (aksi belirtilmedikçe bir int'dir). + // İzin verilen enum tipleri şunlardır byte, sbyte, short, ushort, int, uint, long, veya ulong. + // Bir enum aynı değeri birden fazla sayıda barındıramaz. public enum BikeBrand { AIST, BMC, - Electra = 42, //you can explicitly set a value to a name + Electra = 42, // bir isme tam bir değer verebilirsiniz Gitane // 43 } - // We defined this type inside a Bicycle class, so it is a nested type - // Code outside of this class should reference this type as Bicycle.Brand + // Bu tipi Bicycle sınıfı içinde tanımladığımız için bu bir bağımlı tipdir. + // Bu sınıf dışında kullanmak için tipi Bicycle.Brand olarak kullanmamız gerekir - public BikeBrand Brand; // After declaring an enum type, we can declare the field of this type + public BikeBrand Brand; // Enum tipini tanımladıktan sonra alan tipini tanımlayabiliriz - // Static members belong to the type itself rather then specific object. - // You can access them without a reference to any object: + // Static üyeler belirli bir obje yerine kendi tipine aittir + // Onlara bir obje referans göstermeden erişebilirsiniz: // Console.WriteLine("Bicycles created: " + Bicycle.bicyclesCreated); static public int BicyclesCreated = 0; - // readonly values are set at run time - // they can only be assigned upon declaration or in a constructor + // readonly değerleri çalışma zamanında atanır + // onlara sadece tanımlama yapılarak ya da kurucular içinden atama yapılabilir readonly bool _hasCardsInSpokes = false; // read-only private - // Constructors are a way of creating classes - // This is a default constructor + // Kurucular sınıf oluşturmanın bir yoludur + // Bu bir varsayılan kurucudur. public Bicycle() { - this.Gear = 1; // you can access members of the object with the keyword this - Cadence = 50; // but you don't always need it + this.Gear = 1; // bu objenin üyelerine this anahtar kelimesi ile ulaşılır + Cadence = 50; // ama her zaman buna ihtiyaç duyulmaz _speed = 5; Name = "Bontrager"; Brand = BikeBrand.AIST; BicyclesCreated++; } - // This is a specified constructor (it contains arguments) + // Bu belirlenmiş bir kurucudur. (argümanlar içerir) public Bicycle(int startCadence, int startSpeed, int startGear, string name, bool hasCardsInSpokes, BikeBrand brand) - : base() // calls base first + : base() // önce base'i çağırın { Gear = startGear; Cadence = startCadence; @@ -630,20 +626,20 @@ on a new line! ""Wow!"", the masses cried"; Brand = brand; } - // Constructors can be chained + // Kurucular zincirleme olabilir public Bicycle(int startCadence, int startSpeed, BikeBrand brand) : this(startCadence, startSpeed, 0, "big wheels", true, brand) { } - // Function Syntax: - // () + // Fonksiyon Sözdizimi: + // () - // classes can implement getters and setters for their fields - // or they can implement properties (this is the preferred way in C#) + // sınıflar getter ve setter'ları alanları için kendisi uygular + // veya kendisi özellikleri uygulayabilir (C# da tercih edilen yol budur) - // Method parameters can have default values. - // In this case, methods can be called with these parameters omitted + // Metod parametreleri varsayılan değerlere sahip olabilir. + // Bu durumda, metodlar bu parametreler olmadan çağırılabilir. public void SpeedUp(int increment = 1) { _speed += increment; -- cgit v1.2.3 From 3f305ab2831b9e3a1ca9dce35ab42386989e9a61 Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 20:07:15 +0200 Subject: completed --- tr-tr/csharp-tr.html.markdown | 71 +++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index cfbee5e8..e5cd3730 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -636,7 +636,7 @@ on a new line! ""Wow!"", the masses cried"; // () // sınıflar getter ve setter'ları alanları için kendisi uygular - // veya kendisi özellikleri uygulayabilir (C# da tercih edilen yol budur) + // veya property'ler eklenebilir (C# da tercih edilen yol budur) // Metod parametreleri varsayılan değerlere sahip olabilir. // Bu durumda, metodlar bu parametreler olmadan çağırılabilir. @@ -650,35 +650,34 @@ on a new line! ""Wow!"", the masses cried"; _speed -= decrement; } - // properties get/set values - // when only data needs to be accessed, consider using properties. - // properties may have either get or set, or both - private bool _hasTassles; // private variable + // property'lerin get/set değerleri + // sadece veri gerektiği zaman erişilebilir, kullanmak için bunu göz önünde bulundurun. + // property'ler sadece get ya da set'e sahip olabilir veya ikisine birden + private bool _hasTassles; // private değişken public bool HasTassles // public accessor { get { return _hasTassles; } set { _hasTassles = value; } } - // You can also define an automatic property in one line - // this syntax will create a backing field automatically. - // You can set an access modifier on either the getter or the setter (or both) - // to restrict its access: + // Ayrıca tek bir satırda otomatik property tanımlayabilirsiniz. + // bu söz dizimi otomatik olarak alan oluşturacaktır. + // Erişimi kısıtlamak için nitelik belirleyiciler getter veya setter'a ya da ikisine birden atanabilir: public bool IsBroken { get; private set; } - // Properties can be auto-implemented + // Property'ler otomatik eklenmiş olabilir public int FrameSize { get; - // you are able to specify access modifiers for either get or set - // this means only Bicycle class can call set on Framesize + // nitelik beliryecileri get veya set için tanımlayabilirsiniz + // bu sadece Bicycle sınıfı Framesize değerine atama yapabilir demektir private set; } - // It's also possible to define custom Indexers on objects. - // All though this is not entirely useful in this example, you - // could do bicycle[0] which yields "chris" to get the first passenger or - // bicycle[1] = "lisa" to set the passenger. (of this apparent quattrocycle) + // Ayrıca obje üzerinde özel indeksleyici belirlemek mümkündür. + // Tüm bunlar bu örnek için çok kullanışlı değil, + // bicycle[0] ile ilk yolcu olan "chris" i almak mümkün veya + // bicycle[1] = "lisa" ile yolcuyu atayabilirsiniz. (bariz quattrocycle) private string[] passengers = { "chris", "phil", "darren", "regina" } public string this[int i] @@ -692,7 +691,7 @@ on a new line! ""Wow!"", the masses cried"; } } - //Method to display the attribute values of this Object. + //Bu objenin nitelik değerlerini göstermek için bir metod. public virtual string Info() { return "Gear: " + Gear + @@ -704,23 +703,23 @@ on a new line! ""Wow!"", the masses cried"; ; } - // Methods can also be static. It can be useful for helper methods + // Metodlar static olabilir. Yardımcı metodlar için kullanışlı olabilir. public static bool DidWeCreateEnoughBycles() { - // Within a static method, we only can reference static class members + // Bir static metod içinde sadece static sınıf üyeleri referans gösterilebilir return BicyclesCreated > 9000; - } // If your class only needs static members, consider marking the class itself as static. + } // Eğer sınıfınızın sadece static üyelere ihtiyacı varsa, sınıfın kendisini static yapmayı düşünebilirsiniz. - } // end class Bicycle + } // Bicycle sınıfı sonu - // PennyFarthing is a subclass of Bicycle + // PennyFarthing , Bicycle sınıfının alt sınıfıdır. class PennyFarthing : Bicycle { - // (Penny Farthings are those bicycles with the big front wheel. - // They have no gears.) + // (Penny Farthing'ler ön jantı büyük bisikletlerdir. + // Vitesleri yoktur.) - // calling parent constructor + // Ana kurucuyu çağırmak public PennyFarthing(int startCadence, int startSpeed) : base(startCadence, startSpeed, 0, "PennyFarthing", true, BikeBrand.Electra) { @@ -741,23 +740,23 @@ on a new line! ""Wow!"", the masses cried"; public override string Info() { string result = "PennyFarthing bicycle "; - result += base.ToString(); // Calling the base version of the method + result += base.ToString(); // Metodun temel versiyonunu çağırmak return result; } } - // Interfaces only contain signatures of the members, without the implementation. + // Arabirimler sadece üyelerin izlerini içerir, değerlerini değil. interface IJumpable { - void Jump(int meters); // all interface members are implicitly public + void Jump(int meters); // bütün arbirim üyeleri public'tir } interface IBreakable { - bool Broken { get; } // interfaces can contain properties as well as methods & events + bool Broken { get; } // arabirimler property'leri, metodları ve olayları içerebilir } - // Class can inherit only one other class, but can implement any amount of interfaces + // Sınıflar sadece tek bir sınıftan miras alabilir ama sınırsız sayıda arabirime sahip olabilir class MountainBike : Bicycle, IJumpable, IBreakable { int damage = 0; @@ -777,8 +776,8 @@ on a new line! ""Wow!"", the masses cried"; } /// - /// Used to connect to DB for LinqToSql example. - /// EntityFramework Code First is awesome (similar to Ruby's ActiveRecord, but bidirectional) + /// LinqToSql örneği veri tabanına bağlanmak için kullanılır. + /// EntityFramework Code First harika! (Ruby'deki ActiveRecord'a benzer, ama iki yönlü) /// http://msdn.microsoft.com/en-us/data/jj193542.aspx /// public class BikeRepository : DbSet @@ -790,10 +789,10 @@ on a new line! ""Wow!"", the masses cried"; public DbSet Bikes { get; set; } } -} // End Namespace +} // Namespace sonu ``` -## Topics Not Covered +## İşlenmeyen Konular * Flags * Attributes @@ -803,7 +802,7 @@ on a new line! ""Wow!"", the masses cried"; * Winforms * Windows Presentation Foundation (WPF) -## Further Reading +## Daha Fazlasını Okuyun * [DotNetPerls](http://www.dotnetperls.com) * [C# in Depth](http://manning.com/skeet2) @@ -817,4 +816,4 @@ on a new line! ""Wow!"", the masses cried"; -[C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx) +[C# Kodlama Adetleri](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx) -- cgit v1.2.3 From 634efbb8caaf02feba5f09edd450df1d684e6660 Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 20:08:42 +0200 Subject: csharp/tr --- tr-tr/csharp-tr.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index e5cd3730..c20f90ad 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -789,7 +789,7 @@ on a new line! ""Wow!"", the masses cried"; public DbSet Bikes { get; set; } } -} // Namespace sonu +} // namespace sonu ``` ## İşlenmeyen Konular -- cgit v1.2.3 From 71eda7df766a2be9777d977b8b3b946e37ee82d9 Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 20:11:54 +0200 Subject: csharp/tr --- tr-tr/csharp-tr.html.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index c20f90ad..3573bbd4 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -11,6 +11,8 @@ filename: LearnCSharp.cs C# zarif ve tip güvenli nesne yönelimli bir dil olup geliştiricilerin .NET framework üzerinde çalışan güçlü ve güvenli uygulamalar geliştirmesini sağlar. +[Yazım yanlışları ve öneriler için bana ulaşabilirsiniz](mailto:melihmucuk@gmail.com) + [Daha fazlasını okuyun.](http://msdn.microsoft.com/en-us/library/vstudio/z1zx9t92.aspx) ```c# -- cgit v1.2.3 From 3cb53d9e43143d330cd65c2f29fff93ffa0110f4 Mon Sep 17 00:00:00 2001 From: Melih Mucuk Date: Wed, 31 Dec 2014 20:18:46 +0200 Subject: csharp/tr --- tr-tr/csharp-tr.html.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tr-tr/csharp-tr.html.markdown b/tr-tr/csharp-tr.html.markdown index 3573bbd4..7755ed44 100644 --- a/tr-tr/csharp-tr.html.markdown +++ b/tr-tr/csharp-tr.html.markdown @@ -5,8 +5,11 @@ contributors: - ["Max Yankov", "https://github.com/golergka"] - ["Melvyn Laïly", "http://x2a.yt"] - ["Shaun McCarthy", "http://www.shaunmccarthy.com"] +translators: - ["Melih Mucuk", "http://melihmucuk.com"] +lang: tr-tr filename: LearnCSharp.cs + --- C# zarif ve tip güvenli nesne yönelimli bir dil olup geliştiricilerin .NET framework üzerinde çalışan güçlü ve güvenli uygulamalar geliştirmesini sağlar. -- cgit v1.2.3 From a7dc8b2f4c349d00754d346c78672844523b42ba Mon Sep 17 00:00:00 2001 From: Poor Yorick Date: Thu, 1 Jan 2015 21:41:21 -0700 Subject: add Tcl document --- tcl.html.markdown | 372 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100755 tcl.html.markdown diff --git a/tcl.html.markdown b/tcl.html.markdown new file mode 100755 index 00000000..32619b7c --- /dev/null +++ b/tcl.html.markdown @@ -0,0 +1,372 @@ +--- +language: Tcl +contributors: + - ["Poor Yorick", "http://pooryorick.com/"] +filename: learntcl +--- + +Tcl was created by [John Ousterhout](http://wiki.tcl.tk/John Ousterout) as a +reusable scripting language for chip design tools he was creating. In 1997 he +was awarded the [ACM Software System +Award](http://en.wikipedia.org/wiki/ACM_Software_System_Award) for Tcl. Tcl +can be used both as an embeddable scripting language and as a general +programming language. It can also be used as a portable C library, even in +cases where no scripting capability is needed, as it provides data structures +such as dynamic strings, lists, and hash tables. The C library also provides +portable functionality for loading dynamic libraries, string formatting and +code conversion, filesystem operations, network operations, and more. + +Tcl is a pleasure to program in. Its discipline of exposing all programmatic +functionality as commands, including things like loops and mathematical +operations that are usually baked into the syntax of other languages, allows it +to fade into the background of whatever domain-specific functionality a project +needs. Its design of exposing all values as strings, while internally caching +a structured representation, bridges the world of scripting and systems +programming in the best way. Even Lisp is more syntactically heavy than Tcl. + + + +```tcl +#! /bin/env tclsh + +################################################################################ +## 1. Guidelines +################################################################################ + +# Tcl is not Bash or C! This needs to be said because standard shell quoting +# habits almost work in Tcl and it is common for people to pick up Tcl and try +# to get by with syntax they know from another language. It works at first, +# but soon leads to frustration with more complex scripts. + +# Braces are just a quoting mechanism, not a code block constructor or a list +# constructor. Tcl doesn't have either of those things. Braces are used, +# though, to escape special characters in procedure bodies and in strings that +# are formatted as lists. + + +################################################################################ +## 2. Syntax +################################################################################ + +# Every line is a command. The first word is the name of the command, and +# subsequent words are arguments to the command. Words are delimited by +# whitespace. Since every word is a string, no escaping is necessary in the +# simple case. + +set greeting1 Sal +set greeting2 ut +set greeting3 ations + + +#semicolon also delimits commands + +set greeting1 Sal; set greeting2 ut; set greeting3 ations + + +# Dollar sign introduces variable substitution + +set greeting $greeting1$greeting2 + + +# Bracket introduces command substitution + +set greeting $greeting[set greeting3] + + +# backslash suppresses the special meaning of characters + +set amount \$16.42 + + +# backslash adds special meaning to certain characters + +puts lots\nof\n\n\n\n\n\nnewlines + + +# A word enclosed in braces is not subject to any special interpretation or +# substitutions, except that a backslash before a brace is not counted when look#ing for the closing brace +set somevar { + This is a literal $ sign, and this \} escaped + brace remains uninterpreted +} + +# In a word enclosed in double quotes, whitespace characters lose their special +# meaning + +set name Neo +set greeting "Hello, $name" + + +#variable names can be any string + +set {first name} New + + +# The brace form of variable substitution handles more complex variable names + +set greeting "Hello, ${first name}" + + +# The "set" command can always be used instead of variable substitution + +set greeting "Hello, [set {first name}]" + + +# To promote the words within a word to individual words of the current +# command, use the expansion operator, "{*}". + +set {*}{name Neo} + +# is equivalent to + +set name Neo + + +# An array is a special variable that is a container for other variables. + +set person(name) Neo +set person(gender) male + +set greeting "Hello, $person(name)" + +# A namespace holds commands and variables + +namespace eval people { + namespace eval person1 { + set name Neo + } +} + +#The full name of a variable includes its enclosing namespace(s), delimited by two colons: + +set greeting "Hello $people::person::name" + + + +################################################################################ +## 3. A Few Notes +################################################################################ + +# From this point on, there is no new syntax. Everything else there is to +# learn about Tcl is about the behaviour of individual commands, and what +# meaning they assign to their arguments. + + +# All other functionality is implemented via commands. To end up with an +# interpreter that can do nothing, delete the global namespace. It's not very +# useful to do such a thing, but it illustrates the nature of Tcl. + +namespace delete :: + + +# Because of name resolution behaviour, its safer to use the "variable" command to declare or to assign a value to a namespace. + +namespace eval people { + namespace eval person1 { + variable name Neo + } +} + + +# The full name of a variable can always be used, if desired. + +set people::person1::name Neo + + + +################################################################################ +## 4. Commands +################################################################################ + +# Math can be done with the "expr" command. + +set a 3 +set b 4 +set c [expr {$a + $b}] + +# Since "expr" performs variable substitution on its own, brace the expression +# to prevent Tcl from performing variable substitution first. See +# "http://wiki.tcl.tk/Brace%20your%20#%20expr-essions" for details. + + +# The "expr" command understands variable and command substitution + +set c [expr {$a + [set b]}] + + +# The "expr" command provides a set of mathematical functions + +set c [expr {pow($a,$b)}] + + +# Mathematical operators are available as commands in the ::tcl::mathop +# namespace + +::tcl::mathop::+ 5 3 + +# Commands can be imported from other namespaces + +namespace import ::tcl::mathop::+ +set result [+ 5 3] + + +# New commands can be created via the "proc" command. + +proc greet name { + return "Hello, $name!" +} + + +# As noted earlier, braces do not construct a code block. Every value, even +# the third argument of the "proc" command, is a string. The previous command +# could be defined without using braces at all: + +proc greet name return\ \"Hello,\ \$name! + + +# When the last parameter is the literal value, "args", it collects all extra +# arguments when the command is invoked + +proc fold {cmd args} { + set res 0 + foreach arg $args { + set res [cmd $res $arg] + } +} + +fold ::tcl::mathop::* 5 3 3 ;# -> 45 + + + +# Conditional execution is implemented as a command + +if {3 > 4} { + puts {This will never happen} +} elseif {4 > 4} { + puts {This will also never happen} +} else { + puts {This will always happen} +} + + +# Loops are implemented as commands. The first, second, and third +# arguments of the "for" command are treated as mathematical expressions + +for {set i 0} {$i < 10} {incr i} { + set res [expr {$res + $i}] +} + + +# The first argument of the "while" command is also treated as a mathematical +# expression + +set i 0 +while {$i < 10} { + incr i 2 +} + + +# A list is a specially-formatted string. In the simple case, whitespace is sufficient to delimit values + +set amounts 10\ 33\ 18 +set amount [lindex $amounts 1] + + +# Braces and backslash can be used to format more complex values in a list. +# There are three items in the following + +set values { + + one\ two + + {three four} + + five\{six + +} + + +# Since a list is a string, string operations could be performed on it, at the +# risk of corrupting the list. + +set values {one two three four} +set values [string map {two \{} $values] ;# $values is no-longer a \ + properly-formatted listwell-formed list + + +# The sure-fire way to get a properly-formmated list is to use "list" commands +set values [list one \{ three four] + +lappend values { } ;# add a single space as an item in the list + + +# Use "eval" to evaluate a value as a script + +eval { + set name Neo + set greeting "Hello, $name" +} + + +# A list can always be passed to "eval" as a script composed of a single +# command. + +eval {set name Neo} +eval [list set greeting "Hello, $name"] + + +# Therefore, when using "eval", use [list] to build up a desired command + +set command {set name} +lappend command {Archibald Sorbisol} +eval $command + + +# A common mistake is not to use list functions + +set command {set name} +append command { Archibald Sorbisol} +eval $command ;# There is an error here, because there are too many arguments \ + to "set" in {set name Archibald Sorbisol} + + +# This mistake can easily occur with the "subst" command. + +set replacement {Archibald Sorbisol} +set command {set name $replacement} +set command [subst $command] +eval $command ;# The same error as before: to many arguments to "set" in \ + {set name Archibald Sorbisol} + + +# The proper way is to format the substituted value using use the "list" +# command. + +set replacement [list {Archibald Sorbisol}] +set command {set name $replacement} +set command [subst $command] +eval $command + + +# It is extremely common to see the "list" command being used to properly +# format values that are substituted into Tcl script templates. There is an +# example of this in the following replacement "while" implementation. + + +#get rid of the built-in "while" command. + +rename ::while {} + + +# Define a new while command with the "proc" command. More sophisticated error +# handling is left as an exercise. + +proc while {condition script} { + if {[uplevel 1 [list expr $condition]]} { + uplevel 1 $script + tailcall [namespace which while] $condition $script + } +} +``` + + -- cgit v1.2.3 From 335d618b1a7ef1793ba30402101c58438bd44603 Mon Sep 17 00:00:00 2001 From: Poor Yorick Date: Thu, 1 Jan 2015 21:48:42 -0700 Subject: add reference --- tcl.html.markdown | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tcl.html.markdown b/tcl.html.markdown index 32619b7c..ddf53fe9 100755 --- a/tcl.html.markdown +++ b/tcl.html.markdown @@ -2,7 +2,6 @@ language: Tcl contributors: - ["Poor Yorick", "http://pooryorick.com/"] -filename: learntcl --- Tcl was created by [John Ousterhout](http://wiki.tcl.tk/John Ousterout) as a @@ -369,4 +368,10 @@ proc while {condition script} { } ``` +## Reference +[Official Tcl Documentation](http://www.tcl.tk/man/tcl/) + +[Tcl Wiki](http://wiki.tcl.tk) + +[Tcl Subreddit](http://www.reddit.com/r/Tcl) -- cgit v1.2.3 From a80663a4ceeadaa813e17918123eff837e91fc51 Mon Sep 17 00:00:00 2001 From: Poor Yorick Date: Fri, 2 Jan 2015 07:56:48 -0700 Subject: better verbiage, add more commands. --- tcl.html.markdown | 159 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 100 insertions(+), 59 deletions(-) diff --git a/tcl.html.markdown b/tcl.html.markdown index ddf53fe9..5402ce04 100755 --- a/tcl.html.markdown +++ b/tcl.html.markdown @@ -49,8 +49,10 @@ programming in the best way. Even Lisp is more syntactically heavy than Tcl. # Every line is a command. The first word is the name of the command, and # subsequent words are arguments to the command. Words are delimited by -# whitespace. Since every word is a string, no escaping is necessary in the -# simple case. +# whitespace. Since every word is a string, in the simple case no special +# markup such as quotes, braces, or backslash, is necessary. Even when quotes +# are used, they are not a string constructor, but just another escaping +# character. set greeting1 Sal set greeting2 ut @@ -58,27 +60,34 @@ set greeting3 ations #semicolon also delimits commands - set greeting1 Sal; set greeting2 ut; set greeting3 ations # Dollar sign introduces variable substitution +set greeting $greeting1$greeting2$greeting3 -set greeting $greeting1$greeting2 +# Bracket introduces command substitution. The result of the command is +# substituted in place of the bracketed script. When the "set" command is +# given only the name of a variable, it returns the value of that variable. +set greeting $greeting1$greeting2[set greeting3] -# Bracket introduces command substitution -set greeting $greeting[set greeting3] +# Command substitution should really be called script substitution, because an +# entire script, not just a command, can be placed between the brackets. The +# "incr" command increments the value of a variable and returns its value. +set greeting $greeting[ + incr i + incr i + incr i +] # backslash suppresses the special meaning of characters - set amount \$16.42 # backslash adds special meaning to certain characters - puts lots\nof\n\n\n\n\n\nnewlines @@ -89,55 +98,48 @@ set somevar { brace remains uninterpreted } + # In a word enclosed in double quotes, whitespace characters lose their special # meaning - set name Neo set greeting "Hello, $name" #variable names can be any string - set {first name} New # The brace form of variable substitution handles more complex variable names - set greeting "Hello, ${first name}" # The "set" command can always be used instead of variable substitution - set greeting "Hello, [set {first name}]" # To promote the words within a word to individual words of the current # command, use the expansion operator, "{*}". - set {*}{name Neo} # is equivalent to - set name Neo # An array is a special variable that is a container for other variables. - set person(name) Neo set person(gender) male - set greeting "Hello, $person(name)" -# A namespace holds commands and variables +# A namespace holds commands and variables namespace eval people { namespace eval person1 { set name Neo } } -#The full name of a variable includes its enclosing namespace(s), delimited by two colons: +#The full name of a variable includes its enclosing namespace(s), delimited by two colons: set greeting "Hello $people::person::name" @@ -146,20 +148,19 @@ set greeting "Hello $people::person::name" ## 3. A Few Notes ################################################################################ -# From this point on, there is no new syntax. Everything else there is to -# learn about Tcl is about the behaviour of individual commands, and what -# meaning they assign to their arguments. +# All other functionality is implemented via commands. From this point on, +# there is no new syntax. Everything else there is to learn about Tcl is about +# the behaviour of individual commands, and what meaning they assign to their +# arguments. -# All other functionality is implemented via commands. To end up with an -# interpreter that can do nothing, delete the global namespace. It's not very -# useful to do such a thing, but it illustrates the nature of Tcl. - +# To end up with an interpreter that can do nothing, delete the global +# namespace. It's not very useful to do such a thing, but it illustrates the +# nature of Tcl. namespace delete :: # Because of name resolution behaviour, its safer to use the "variable" command to declare or to assign a value to a namespace. - namespace eval people { namespace eval person1 { variable name Neo @@ -168,7 +169,6 @@ namespace eval people { # The full name of a variable can always be used, if desired. - set people::person1::name Neo @@ -178,7 +178,6 @@ set people::person1::name Neo ################################################################################ # Math can be done with the "expr" command. - set a 3 set b 4 set c [expr {$a + $b}] @@ -189,56 +188,52 @@ set c [expr {$a + $b}] # The "expr" command understands variable and command substitution - set c [expr {$a + [set b]}] # The "expr" command provides a set of mathematical functions - set c [expr {pow($a,$b)}] # Mathematical operators are available as commands in the ::tcl::mathop # namespace - ::tcl::mathop::+ 5 3 # Commands can be imported from other namespaces - namespace import ::tcl::mathop::+ set result [+ 5 3] # New commands can be created via the "proc" command. - proc greet name { return "Hello, $name!" } +#multiple parameters can be specified +proc greet {greeting name} { + return "$greeting, $name!" +} + # As noted earlier, braces do not construct a code block. Every value, even # the third argument of the "proc" command, is a string. The previous command -# could be defined without using braces at all: +# rewritten to not use braces at all: +proc greet greeting\ name return\ \"Hello,\ \$name! -proc greet name return\ \"Hello,\ \$name! # When the last parameter is the literal value, "args", it collects all extra # arguments when the command is invoked - proc fold {cmd args} { set res 0 foreach arg $args { set res [cmd $res $arg] } } - fold ::tcl::mathop::* 5 3 3 ;# -> 45 - # Conditional execution is implemented as a command - if {3 > 4} { puts {This will never happen} } elseif {4 > 4} { @@ -250,7 +245,6 @@ if {3 > 4} { # Loops are implemented as commands. The first, second, and third # arguments of the "for" command are treated as mathematical expressions - for {set i 0} {$i < 10} {incr i} { set res [expr {$res + $i}] } @@ -258,7 +252,6 @@ for {set i 0} {$i < 10} {incr i} { # The first argument of the "while" command is also treated as a mathematical # expression - set i 0 while {$i < 10} { incr i 2 @@ -266,14 +259,14 @@ while {$i < 10} { # A list is a specially-formatted string. In the simple case, whitespace is sufficient to delimit values - set amounts 10\ 33\ 18 set amount [lindex $amounts 1] -# Braces and backslash can be used to format more complex values in a list. -# There are three items in the following - +# Braces and backslash can be used to format more complex values in a list. A +# list looks exactly like a script, except that the newline character and the +# semicolon character lose their special meanings. This feature makes Tcl +# homoiconic. There are three items in the following list. set values { one\ two @@ -286,8 +279,7 @@ set values { # Since a list is a string, string operations could be performed on it, at the -# risk of corrupting the list. - +# risk of corrupting the formatting of the list. set values {one two three four} set values [string map {two \{} $values] ;# $values is no-longer a \ properly-formatted listwell-formed list @@ -295,12 +287,10 @@ set values [string map {two \{} $values] ;# $values is no-longer a \ # The sure-fire way to get a properly-formmated list is to use "list" commands set values [list one \{ three four] - lappend values { } ;# add a single space as an item in the list # Use "eval" to evaluate a value as a script - eval { set name Neo set greeting "Hello, $name" @@ -309,20 +299,17 @@ eval { # A list can always be passed to "eval" as a script composed of a single # command. - eval {set name Neo} eval [list set greeting "Hello, $name"] # Therefore, when using "eval", use [list] to build up a desired command - set command {set name} lappend command {Archibald Sorbisol} eval $command -# A common mistake is not to use list functions - +# A common mistake is not to use list functions when building up a command set command {set name} append command { Archibald Sorbisol} eval $command ;# There is an error here, because there are too many arguments \ @@ -330,7 +317,6 @@ eval $command ;# There is an error here, because there are too many arguments \ # This mistake can easily occur with the "subst" command. - set replacement {Archibald Sorbisol} set command {set name $replacement} set command [subst $command] @@ -340,7 +326,6 @@ eval $command ;# The same error as before: to many arguments to "set" in \ # The proper way is to format the substituted value using use the "list" # command. - set replacement [list {Archibald Sorbisol}] set command {set name $replacement} set command [subst $command] @@ -348,24 +333,80 @@ eval $command # It is extremely common to see the "list" command being used to properly -# format values that are substituted into Tcl script templates. There is an -# example of this in the following replacement "while" implementation. +# format values that are substituted into Tcl script templates. There are +# several examples of this, below. -#get rid of the built-in "while" command. +# The "apply" command evaluates a string as a command. +set cmd {{greeting name} { + return "$greeting, $name!" +}} +apply $cmd Whaddup Neo + + +# The "uplevel" command evaluates a script in some enclosing scope. +proc greet {} { + uplevel {puts "$greeting, $name"} +} + +proc set_double {varname value} { + if {[string is double $value]} { + uplevel [list variable $varname $value] + } else { + error [list {not a double} $value] + } +} + +# The "upvar" command links a variable in the current scope to a variable in +# some enclosing scope +proc set_double {varname value} { + if {[string is double $value]} { + upvar 1 $varname var + set var $value + } else { + error [list {not a double} $value] + } +} + + +#get rid of the built-in "while" command. rename ::while {} # Define a new while command with the "proc" command. More sophisticated error # handling is left as an exercise. - proc while {condition script} { if {[uplevel 1 [list expr $condition]]} { uplevel 1 $script tailcall [namespace which while] $condition $script } } + + +# The "coroutine" command creates a separate call stack, along with a command +# to enter that call stack. The "yield" command suspends execution in that +# stack. +proc countdown {} { + #send something back to the initial "coroutine" command + yield + + set count 3 + while {$count > 1} { + yield [incr count -1] + } + return 0 +} +coroutine countdown1 countdown +coroutine countdown2 countdown +puts [countdown 1] ;# -> 2 +puts [countdown 2] ;# -> 2 +puts [countdown 1] ;# -> 1 +puts [countdown 1] ;# -> 0 +puts [coundown 1] ;# -> invalid command name "countdown1" +puts [countdown 2] ;# -> 1 + + ``` ## Reference -- cgit v1.2.3 From aac20efb70dbd10383c9bfa4dd9108d8a4fda9ce Mon Sep 17 00:00:00 2001 From: Poor Yorick Date: Fri, 2 Jan 2015 08:19:41 -0700 Subject: Reworked summary --- tcl.html.markdown | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/tcl.html.markdown b/tcl.html.markdown index 5402ce04..44805b5c 100755 --- a/tcl.html.markdown +++ b/tcl.html.markdown @@ -13,15 +13,43 @@ programming language. It can also be used as a portable C library, even in cases where no scripting capability is needed, as it provides data structures such as dynamic strings, lists, and hash tables. The C library also provides portable functionality for loading dynamic libraries, string formatting and -code conversion, filesystem operations, network operations, and more. - -Tcl is a pleasure to program in. Its discipline of exposing all programmatic -functionality as commands, including things like loops and mathematical -operations that are usually baked into the syntax of other languages, allows it -to fade into the background of whatever domain-specific functionality a project -needs. Its design of exposing all values as strings, while internally caching -a structured representation, bridges the world of scripting and systems -programming in the best way. Even Lisp is more syntactically heavy than Tcl. +code conversion, filesystem operations, network operations, and more. +Various features of Tcl stand out: + +* Convenient cross-platform networking API + +* Fully virtualized filesystem + +* Stackable I/O channels + +* Asynchronous to the core + +* Full coroutines + +* A threading model recognized as robust and easy to use + + +If Lisp is a list processor, then Tcl is a string processor. All values are +strings. A list is a string format. A procedure definition is a string +format. To achieve performance, Tcl internally caches structured +representations of these values. The list commands, for example, operate on +the internal cached representation, and Tcl takes care of updating the string +representation if it is ever actually needed in the script. The copy-on-write +design of Tcl allows script authors can pass around large data values without +actually incurring additional memory overhead. Procedures are automatically +byte-compiled unless they use the more dynamic commands such as "uplevel", +"upvar", and "trace". + +Tcl is a pleasure to program in. It will appeal to hacker types who find Lisp, +Forth, or Smalltalk interesting, as well as to engineers and scientists who +just want to get down to business with a tool that bends to their will. Its +discipline of exposing all programmatic functionality as commands, including +things like loops and mathematical operations that are usually baked into the +syntax of other languages, allows it to fade into the background of whatever +domain-specific functionality a project needs. It's syntax, which is even +lighter that that of Lisp, just gets out of the way. + + -- cgit v1.2.3 From e059cd98f32fbd7793f2e8622cb6061c1a142146 Mon Sep 17 00:00:00 2001 From: Adam Bard Date: Fri, 2 Jan 2015 19:53:49 +0000 Subject: Let's see how factor highlighting looks in forth --- forth.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forth.html.markdown b/forth.html.markdown index 570e12ed..4457e607 100644 --- a/forth.html.markdown +++ b/forth.html.markdown @@ -12,7 +12,7 @@ such as Open Firmware. It's also used by NASA. Note: This article focuses predominantly on the Gforth implementation of Forth, but most of what is written here should work elsewhere. -```forth +```factor \ This is a comment ( This is also a comment but it's only used when defining words ) -- cgit v1.2.3 From 732cdbed1ad345f2b826254bc7f0b6283124955e Mon Sep 17 00:00:00 2001 From: Adam Bard Date: Fri, 2 Jan 2015 20:33:47 +0000 Subject: Update forth.html.markdown --- forth.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forth.html.markdown b/forth.html.markdown index 4457e607..f7c0bf34 100644 --- a/forth.html.markdown +++ b/forth.html.markdown @@ -12,7 +12,7 @@ such as Open Firmware. It's also used by NASA. Note: This article focuses predominantly on the Gforth implementation of Forth, but most of what is written here should work elsewhere. -```factor +``` \ This is a comment ( This is also a comment but it's only used when defining words ) -- cgit v1.2.3 From 6263dda6de1f9163a80a3ceab2a05666149e6a79 Mon Sep 17 00:00:00 2001 From: sunxb10 Date: Sat, 3 Jan 2015 20:49:39 +0800 Subject: Chinese translation of MATLAB tutorial --- zh-cn/matlab-cn.html.markdown | 491 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 491 insertions(+) create mode 100644 zh-cn/matlab-cn.html.markdown diff --git a/zh-cn/matlab-cn.html.markdown b/zh-cn/matlab-cn.html.markdown new file mode 100644 index 00000000..77ba765a --- /dev/null +++ b/zh-cn/matlab-cn.html.markdown @@ -0,0 +1,491 @@ +--- +language: Matlab +contributors: + - ["mendozao", "http://github.com/mendozao"] + - ["jamesscottbrown", "http://jamesscottbrown.com"] +translators: + - ["sunxb10", "https://github.com/sunxb10"] +lang: zh-cn +--- + +MATLAB 是 MATrix LABoratory (矩阵实验室)的缩写,它是一种功能强大的数值计算语言,在工程和数学领域中应用广泛。 + +如果您有任何需要反馈或交流的内容,请联系本教程作者[@the_ozzinator](https://twitter.com/the_ozzinator)、[osvaldo.t.mendoza@gmail.com](mailto:osvaldo.t.mendoza@gmail.com)。 + +```matlab +% 以百分号作为注释符 + +%{ +多行注释 +可以 +这样 +表示 +%} + +% 指令可以随意跨行,但需要在跨行处用 '...' 标明: + a = 1 + 2 + ... + + 4 + +% 可以在MATLAB中直接向操作系统发出指令 +!ping google.com + +who % 显示内存中的所有变量 +whos % 显示内存中的所有变量以及它们的类型 +clear % 清除内存中的所有变量 +clear('A') % 清除指定的变量 +openvar('A') % 在变量编辑器中编辑指定变量 + +clc % 清除命令窗口中显示的所有指令 +diary % 将命令窗口中的内容写入本地文件 +ctrl-c % 终止当前计算 + +edit('myfunction.m') % 在编辑器中打开指定函数或脚本 +type('myfunction.m') % 在命令窗口中打印指定函数或脚本的源码 + +profile on % 打开 profile 代码分析工具 +profile of % 关闭 profile 代码分析工具 +profile viewer % 查看 profile 代码分析工具的分析结果 + +help command % 在命令窗口中显示指定命令的帮助文档 +doc command % 在帮助窗口中显示指定命令的帮助文档 +lookfor command % 在所有 MATLAB 内置函数的头部注释块的第一行中搜索指定命令 +lookfor command -all % 在所有 MATLAB 内置函数的整个头部注释块中搜索指定命令 + + +% 输出格式 +format short % 浮点数保留 4 位小数 +format long % 浮点数保留 15 位小数 +format bank % 金融格式,浮点数只保留 2 位小数 +fprintf('text') % 在命令窗口中显示 "text" +disp('text') % 在命令窗口中显示 "text" + + +% 变量与表达式 +myVariable = 4 % 命令窗口中将新创建的变量 +myVariable = 4; % 加上分号可使命令窗口中不显示当前语句执行结果 +4 + 6 % ans = 10 +8 * myVariable % ans = 32 +2 ^ 3 % ans = 8 +a = 2; b = 3; +c = exp(a)*sin(pi/2) % c = 7.3891 + + +% 调用函数有两种方式: +% 标准函数语法: +load('myFile.mat', 'y') % 参数放在括号内,以英文逗号分隔 +% 指令语法: +load myFile.mat y % 不加括号,以空格分隔参数 +% 注意在指令语法中参数不需要加引号:在这种语法下,所有输入参数都只能是文本文字, +% 不能是变量的具体值,同样也不能是输出变量 +[V,D] = eig(A); % 这条函数调用无法转换成等价的指令语法 +[~,D] = eig(A); % 如果结果中只需要 D 而不需要 V 则可以这样写 + + + +% 逻辑运算 +1 > 5 % 假,ans = 0 +10 >= 10 % 真,ans = 1 +3 ~= 4 % 不等于 -> ans = 1 +3 == 3 % 等于 -> ans = 1 +3 > 1 && 4 > 1 % 与 -> ans = 1 +3 > 1 || 4 > 1 % 或 -> ans = 1 +~1 % 非 -> ans = 0 + +% 逻辑运算可直接应用于矩阵,运算结果也是矩阵 +A > 5 +% 对矩阵中每个元素做逻辑运算,若为真,则在运算结果的矩阵中对应位置的元素就是 1 +A( A > 5 ) +% 如此返回的向量,其元素就是 A 矩阵中所有逻辑运算为真的元素 + +% 字符串 +a = 'MyString' +length(a) % ans = 8 +a(2) % ans = y +[a,a] % ans = MyStringMyString +b = '字符串' % MATLAB目前已经可以支持包括中文在内的多种文字 +length(b) % ans = 3 +b(2) % ans = 符 +[b,b] % ans = 字符串字符串 + + +% 元组(cell 数组) +a = {'one', 'two', 'three'} +a(1) % ans = 'one' - 返回一个元组 +char(a(1)) % ans = one - 返回一个字符串 + + +% 结构体 +A.b = {'one','two'}; +A.c = [1 2]; +A.d.e = false; + + +% 向量 +x = [4 32 53 7 1] +x(2) % ans = 32,MATLAB中向量的下标索引从1开始,不是0 +x(2:3) % ans = 32 53 +x(2:end) % ans = 32 53 7 1 + +x = [4; 32; 53; 7; 1] % 列向量 + +x = [1:10] % x = 1 2 3 4 5 6 7 8 9 10 + + +% 矩阵 +A = [1 2 3; 4 5 6; 7 8 9] +% 以分号分隔不同的行,以空格或逗号分隔同一行中的不同元素 +% A = + +% 1 2 3 +% 4 5 6 +% 7 8 9 + +A(2,3) % ans = 6,A(row, column) +A(6) % ans = 8 +% (隐式地将 A 的三列首尾相接组成一个列向量,然后取其下标为 6 的元素) + + +A(2,3) = 42 % 将第 2 行第 3 列的元素设为 42 +% A = + +% 1 2 3 +% 4 5 42 +% 7 8 9 + +A(2:3,2:3) % 取原矩阵中的一块作为新矩阵 +%ans = + +% 5 42 +% 8 9 + +A(:,1) % 第 1 列的所有元素 +%ans = + +% 1 +% 4 +% 7 + +A(1,:) % 第 1 行的所有元素 +%ans = + +% 1 2 3 + +[A ; A] % 将两个矩阵上下相接构成新矩阵 +%ans = + +% 1 2 3 +% 4 5 42 +% 7 8 9 +% 1 2 3 +% 4 5 42 +% 7 8 9 + +% 等价于 +vertcat(A, A); + + +[A , A] % 将两个矩阵左右相接构成新矩阵 + +%ans = + +% 1 2 3 1 2 3 +% 4 5 42 4 5 42 +% 7 8 9 7 8 9 + +% 等价于 +horzcat(A, A); + + +A(:, [3 1 2]) % 重新排布原矩阵的各列 +%ans = + +% 3 1 2 +% 42 4 5 +% 9 7 8 + +size(A) % 返回矩阵的行数和列数,ans = 3 3 + +A(1, :) =[] % 删除矩阵的第 1 行 +A(:, 1) =[] % 删除矩阵的第 1 列 + +transpose(A) % 矩阵转置,等价于 A' +ctranspose(A) % 矩阵的共轭转置(对矩阵中的每个元素取共轭复数) + + +% 元素运算 vs. 矩阵运算 +% 单独运算符就是对矩阵整体进行矩阵运算 +% 在运算符加上英文句点就是对矩阵中的元素进行元素计算 +% 示例如下: +A * B % 矩阵乘法,要求 A 的列数等于 B 的行数 +A .* B % 元素乘法,要求 A 和 B 形状一致(A 的行数等于 B 的行数, A 的列数等于 B 的列数) +% 元素乘法的结果是与 A 和 B 形状一致的矩阵,其每个元素等于 A 对应位置的元素乘 B 对应位置的元素 + +% 以下函数中,函数名以 m 结尾的执行矩阵运算,其余执行元素运算: +exp(A) % 对矩阵中每个元素做指数运算 +expm(A) % 对矩阵整体做指数运算 +sqrt(A) % 对矩阵中每个元素做开方运算 +sqrtm(A) % 对矩阵整体做开放运算(即试图求出一个矩阵,该矩阵与自身的乘积等于 A 矩阵) + + +% 绘图 +x = 0:.10:2*pi; % 生成一向量,其元素从 0 开始,以 0.1 的间隔一直递增到 2*pi(pi 就是圆周率) +y = sin(x); +plot(x,y) +xlabel('x axis') +ylabel('y axis') +title('Plot of y = sin(x)') +axis([0 2*pi -1 1]) % x 轴范围是从 0 到 2*pi,y 轴范围是从 -1 到 1 + +plot(x,y1,'-',x,y2,'--',x,y3,':') % 在同一张图中绘制多条曲线 +legend('Line 1 label', 'Line 2 label') % 为图片加注图例 +% 图例数量应当小于或等于实际绘制的曲线数目,从 plot 绘制的第一条曲线开始对应 + +% 在同一张图上绘制多条曲线的另一种方法: +% 使用 hold on,令系统保留前次绘图结果并在其上直接叠加新的曲线, +% 如果没有 hold on,则每个 plot 都会首先清除之前的绘图结果再进行绘制。 +% 在 hold on 和 hold off 中可以放置任意多的 plot 指令, +% 它们和 hold on 前最后一个 plot 指令的结果都将显示在同一张图中。 +plot(x, y1) +hold on +plot(x, y2) +plot(x, y3) +plot(x, y4) +hold off + +loglog(x, y) % 对数—对数绘图 +semilogx(x, y) % 半对数(x 轴对数)绘图 +semilogy(x, y) % 半对数(y 轴对数)绘图 + +fplot (@(x) x^2, [2,5]) % 绘制函数 x^2 在 [2, 5] 区间的曲线 + +grid on % 在绘制的图中显示网格,使用 grid off 可取消网格显示 +axis square % 将当前坐标系设定为正方形(保证在图形显示上各轴等长) +axis equal % 将当前坐标系设定为相等(保证在实际数值上各轴等长) + +scatter(x, y); % 散点图 +hist(x); % 直方图 + +z = sin(x); +plot3(x,y,z); % 绘制三维曲线 + +pcolor(A) % 伪彩色图(热图) +contour(A) % 等高线图 +mesh(A) % 网格曲面图 + +h = figure % 创建新的图片对象并返回其句柄 h +figure(h) % 将句柄 h 对应的图片作为当前图片 +close(h) % 关闭句柄 h 对应的图片 +close all % 关闭 MATLAB 中所用打开的图片 +close % 关闭当前图片 + +shg % 显示图形窗口 +clf clear % 清除图形窗口中的图像,并重置图像属性 + +% 图像属性可以通过图像句柄进行设定 +% 在创建图像时可以保存图像句柄以便于设置 +% 也可以用 gcf 函数返回当前图像的句柄 +h = plot(x, y); % 在创建图像时显式地保存图像句柄 +set(h, 'Color', 'r') +% 颜色代码:'y' 黄色,'m' 洋红色,'c' 青色,'r' 红色,'g' 绿色,'b' 蓝色,'w' 白色,'k' 黑色 +set(h, 'Color', [0.5, 0.5, 0.4]) +% 也可以使用 RGB 值指定颜色 +set(h, 'LineStyle', '--') +% 线型代码:'--' 实线,'---' 虚线,':' 点线,'-.' 点划线,'none' 不划线 +get(h, 'LineStyle') +% 获取当前句柄的线型 + + +% 用 gca 函数返回当前图像的坐标轴句柄 +set(gca, 'XDir', 'reverse'); % 令 x 轴反向 + +% 用 subplot 指令创建平铺排列的多张子图 +subplot(2,3,1); % 选择 2 x 3 排列的子图中的第 1 张图 +plot(x1); title('First Plot') % 在选中的图中绘图 +subplot(2,3,2); % 选择 2 x 3 排列的子图中的第 2 张图 +plot(x2); title('Second Plot') % 在选中的图中绘图 + + +% 要调用函数或脚本,必须保证它们在你的当前工作目录中 +path % 显示当前工作目录 +addpath /path/to/dir % 将指定路径加入到当前工作目录中 +rmpath /path/to/dir % 将指定路径从当前工作目录中删除 +cd /path/to/move/into % 以制定路径作为当前工作目录 + + +% 变量可保存到 .mat 格式的本地文件 +save('myFileName.mat') % 保存当前工作空间中的所有变量 +load('myFileName.mat') % 将指定文件中的变量载入到当前工作空间 + + +% .m 脚本文件 +% 脚本文件是一个包含多条 MATLAB 指令的外部文件,以 .m 为后缀名 +% 使用脚本文件可以避免在命令窗口中重复输入冗长的指令 + + +% .m 函数文件 +% 与脚本文件类似,同样以 .m 作为后缀名 +% 但函数文件可以接受用户输入的参数并返回运算结果 +% 并且函数拥有自己的工作空间(变量域),不必担心变量名称冲突 +% 函数文件的名称应当与其所定义的函数的名称一致(比如下面例子中函数文件就应命名为 double_input.m) +% 使用 'help double_input.m' 可返回函数定义中第一行注释信息 +function output = double_input(x) + % double_input(x) 返回 x 的 2 倍 + output = 2*x; +end +double_input(6) % ans = 12 + + +% 同样还可以定义子函数和内嵌函数 +% 子函数与主函数放在同一个函数文件中,且只能被这个主函数调用 +% 内嵌函数放在另一个函数体内,可以直接访问被嵌套函数的各个变量 + + +% 使用匿名函数可以不必创建 .m 函数文件 +% 匿名函数适用于快速定义某函数以便传递给另一指令或函数(如绘图、积分、求根、求极值等) +% 下面示例的匿名函数返回输入参数的平方根,可以使用句柄 sqr 进行调用: +sqr = @(x) x.^2; +sqr(10) % ans = 100 +doc function_handle % find out more + + +% 接受用户输入 +a = input('Enter the value: ') + + +% 从文件中读取数据 +fopen(filename) +% 类似函数还有 xlsread(excel 文件)、importdata(CSV 文件)、imread(图像文件) + + +% 输出 +disp(a) % 在命令窗口中打印变量 a 的值 +disp('Hello World') % 在命令窗口中打印字符串 +fprintf % 按照指定格式在命令窗口中打印内容 + +% 条件语句(if 和 elseif 语句中的括号并非必需,但推荐加括号避免混淆) +if (a > 15) + disp('Greater than 15') +elseif (a == 23) + disp('a is 23') +else + disp('neither condition met') +end + +% 循环语句 +% 注意:对向量或矩阵使用循环语句进行元素遍历的效率很低!! +% 注意:只要有可能,就尽量使用向量或矩阵的整体运算取代逐元素循环遍历!! +% MATLAB 在开发时对向量和矩阵运算做了专门优化,做向量和矩阵整体运算的效率高于循环语句 +for k = 1:5 + disp(k) +end + +k = 0; +while (k < 5) + k = k + 1; +end + + +% 程序运行计时:'tic' 是计时开始,'toc' 是计时结束并打印结果 +tic +A = rand(1000); +A*A*A*A*A*A*A; +toc + + +% 链接 MySQL 数据库 +dbname = 'database_name'; +username = 'root'; +password = 'root'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://localhost:8889/' dbname]; +javaclasspath('mysql-connector-java-5.1.xx-bin.jar'); % 此处 xx 代表具体版本号 +% 这里的 mysql-connector-java-5.1.xx-bin.jar 可从 http://dev.mysql.com/downloads/connector/j/ 下载 +conn = database(dbname, username, password, driver, dburl); +sql = ['SELECT * from table_name where id = 22'] % SQL 语句 +a = fetch(conn, sql) % a 即包含所需数据 + + +% 常用数学函数 +sin(x) +cos(x) +tan(x) +asin(x) +acos(x) +atan(x) +exp(x) +sqrt(x) +log(x) +log10(x) +abs(x) +min(x) +max(x) +ceil(x) +floor(x) +round(x) +rem(x) +rand % 均匀分布的伪随机浮点数 +randi % 均匀分布的伪随机整数 +randn % 正态分布的伪随机浮点数 + +% 常用常数 +pi +NaN +inf + +% 求解矩阵方程(如果方程无解,则返回最小二乘近似解) +% \ 操作符等价于 mldivide 函数,/ 操作符等价于 mrdivide 函数 +x=A\b % 求解 Ax=b,比先求逆再左乘 inv(A)*b 更加高效、准确 +x=b/A % 求解 xA=b + +inv(A) % 逆矩阵 +pinv(A) % 伪逆矩阵 + + +% 常用矩阵函数 +zeros(m, n) % m x n 阶矩阵,元素全为 0 +ones(m, n) % m x n 阶矩阵,元素全为 1 +diag(A) % 返回矩阵 A 的对角线元素 +diag(x) % 构造一个对角阵,对角线元素就是向量 x 的各元素 +eye(m, n) % m x n 阶单位矩阵 +linspace(x1, x2, n) % 返回介于 x1 和 x2 之间的 n 个等距节点 +inv(A) % 矩阵 A 的逆矩阵 +det(A) % 矩阵 A 的行列式 +eig(A) % 矩阵 A 的特征值和特征向量 +trace(A) % 矩阵 A 的迹(即对角线元素之和),等价于 sum(diag(A)) +isempty(A) % 测试 A 是否为空 +all(A) % 测试 A 中所有元素是否都非 0 或都为真(逻辑值) +any(A) % 测试 A 中是否有元素非 0 或为真(逻辑值) +isequal(A, B) % 测试 A 和 B是否相等 +numel(A) % 矩阵 A 的元素个数 +triu(x) % 返回 x 的上三角这部分 +tril(x) % 返回 x 的下三角这部分 +cross(A, B) % 返回 A 和 B 的叉积(矢量积、外积) +dot(A, B) % 返回 A 和 B 的点积(数量积、内积),要求 A 和 B 必须等长 +transpose(A) % A 的转置,等价于 A' +fliplr(A) % 将一个矩阵左右翻转 +flipud(A) % 将一个矩阵上下翻转 + +% 矩阵分解 +[L, U, P] = lu(A) % LU 分解:PA = LU,L 是下三角阵,U 是上三角阵,P 是置换阵 +[P, D] = eig(A) % 特征值分解:AP = PD,D 是由特征值构成的对角阵,P 的各列就是对应的特征向量 +[U, S, V] = svd(X) % 奇异值分解:XV = US,U 和 V 是酉矩阵,S 是由奇异值构成的半正定实数对角阵 + +% 常用向量函数 +max % 最大值 +min % 最小值 +length % 元素个数 +sort % 按升序排列 +sum % 各元素之和 +prod % 各元素之积 +mode % 众数 +median % 中位数 +mean % 平均值 +std % 标准差 +perms(x) % x 元素的全排列 + +``` + +## 相关资料 + +* 官方网页:[http://http://www.mathworks.com/products/matlab/](http://www.mathworks.com/products/matlab/) +* 官方论坛:[http://www.mathworks.com/matlabcentral/answers/](http://www.mathworks.com/matlabcentral/answers/) -- cgit v1.2.3 From d7672a2bc53dd8b81c4da8c620178cc2458c9238 Mon Sep 17 00:00:00 2001 From: Artur Mkrtchyan Date: Sat, 3 Jan 2015 19:48:53 +0100 Subject: Added warning on return usage --- scala.html.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scala.html.markdown b/scala.html.markdown index 35645922..cfc5a1e9 100644 --- a/scala.html.markdown +++ b/scala.html.markdown @@ -198,7 +198,9 @@ weirdSum(2, 4) // => 16 // The return keyword exists in Scala, but it only returns from the inner-most -// def that surrounds it. It has no effect on anonymous functions. For example: +// def that surrounds it. +// WARNING: Using return in Scala is error-prone and should be avoided. +// It has no effect on anonymous functions. For example: def foo(x: Int): Int = { val anonFunc: Int => Int = { z => if (z > 5) -- cgit v1.2.3 From 79b730dcaa8994cb6b58af1e25a5aa9e06f48471 Mon Sep 17 00:00:00 2001 From: Poor Yorick Date: Sun, 4 Jan 2015 23:00:23 -0700 Subject: add filename: learntcl.tcl --- tcl.html.markdown | 893 +++++++++++++++++++++++++++--------------------------- 1 file changed, 447 insertions(+), 446 deletions(-) diff --git a/tcl.html.markdown b/tcl.html.markdown index 44805b5c..f2d92fcd 100755 --- a/tcl.html.markdown +++ b/tcl.html.markdown @@ -1,446 +1,447 @@ ---- -language: Tcl -contributors: - - ["Poor Yorick", "http://pooryorick.com/"] ---- - -Tcl was created by [John Ousterhout](http://wiki.tcl.tk/John Ousterout) as a -reusable scripting language for chip design tools he was creating. In 1997 he -was awarded the [ACM Software System -Award](http://en.wikipedia.org/wiki/ACM_Software_System_Award) for Tcl. Tcl -can be used both as an embeddable scripting language and as a general -programming language. It can also be used as a portable C library, even in -cases where no scripting capability is needed, as it provides data structures -such as dynamic strings, lists, and hash tables. The C library also provides -portable functionality for loading dynamic libraries, string formatting and -code conversion, filesystem operations, network operations, and more. -Various features of Tcl stand out: - -* Convenient cross-platform networking API - -* Fully virtualized filesystem - -* Stackable I/O channels - -* Asynchronous to the core - -* Full coroutines - -* A threading model recognized as robust and easy to use - - -If Lisp is a list processor, then Tcl is a string processor. All values are -strings. A list is a string format. A procedure definition is a string -format. To achieve performance, Tcl internally caches structured -representations of these values. The list commands, for example, operate on -the internal cached representation, and Tcl takes care of updating the string -representation if it is ever actually needed in the script. The copy-on-write -design of Tcl allows script authors can pass around large data values without -actually incurring additional memory overhead. Procedures are automatically -byte-compiled unless they use the more dynamic commands such as "uplevel", -"upvar", and "trace". - -Tcl is a pleasure to program in. It will appeal to hacker types who find Lisp, -Forth, or Smalltalk interesting, as well as to engineers and scientists who -just want to get down to business with a tool that bends to their will. Its -discipline of exposing all programmatic functionality as commands, including -things like loops and mathematical operations that are usually baked into the -syntax of other languages, allows it to fade into the background of whatever -domain-specific functionality a project needs. It's syntax, which is even -lighter that that of Lisp, just gets out of the way. - - - - - -```tcl -#! /bin/env tclsh - -################################################################################ -## 1. Guidelines -################################################################################ - -# Tcl is not Bash or C! This needs to be said because standard shell quoting -# habits almost work in Tcl and it is common for people to pick up Tcl and try -# to get by with syntax they know from another language. It works at first, -# but soon leads to frustration with more complex scripts. - -# Braces are just a quoting mechanism, not a code block constructor or a list -# constructor. Tcl doesn't have either of those things. Braces are used, -# though, to escape special characters in procedure bodies and in strings that -# are formatted as lists. - - -################################################################################ -## 2. Syntax -################################################################################ - -# Every line is a command. The first word is the name of the command, and -# subsequent words are arguments to the command. Words are delimited by -# whitespace. Since every word is a string, in the simple case no special -# markup such as quotes, braces, or backslash, is necessary. Even when quotes -# are used, they are not a string constructor, but just another escaping -# character. - -set greeting1 Sal -set greeting2 ut -set greeting3 ations - - -#semicolon also delimits commands -set greeting1 Sal; set greeting2 ut; set greeting3 ations - - -# Dollar sign introduces variable substitution -set greeting $greeting1$greeting2$greeting3 - - -# Bracket introduces command substitution. The result of the command is -# substituted in place of the bracketed script. When the "set" command is -# given only the name of a variable, it returns the value of that variable. -set greeting $greeting1$greeting2[set greeting3] - - -# Command substitution should really be called script substitution, because an -# entire script, not just a command, can be placed between the brackets. The -# "incr" command increments the value of a variable and returns its value. -set greeting $greeting[ - incr i - incr i - incr i -] - - -# backslash suppresses the special meaning of characters -set amount \$16.42 - - -# backslash adds special meaning to certain characters -puts lots\nof\n\n\n\n\n\nnewlines - - -# A word enclosed in braces is not subject to any special interpretation or -# substitutions, except that a backslash before a brace is not counted when look#ing for the closing brace -set somevar { - This is a literal $ sign, and this \} escaped - brace remains uninterpreted -} - - -# In a word enclosed in double quotes, whitespace characters lose their special -# meaning -set name Neo -set greeting "Hello, $name" - - -#variable names can be any string -set {first name} New - - -# The brace form of variable substitution handles more complex variable names -set greeting "Hello, ${first name}" - - -# The "set" command can always be used instead of variable substitution -set greeting "Hello, [set {first name}]" - - -# To promote the words within a word to individual words of the current -# command, use the expansion operator, "{*}". -set {*}{name Neo} - -# is equivalent to -set name Neo - - -# An array is a special variable that is a container for other variables. -set person(name) Neo -set person(gender) male -set greeting "Hello, $person(name)" - - -# A namespace holds commands and variables -namespace eval people { - namespace eval person1 { - set name Neo - } -} - - -#The full name of a variable includes its enclosing namespace(s), delimited by two colons: -set greeting "Hello $people::person::name" - - - -################################################################################ -## 3. A Few Notes -################################################################################ - -# All other functionality is implemented via commands. From this point on, -# there is no new syntax. Everything else there is to learn about Tcl is about -# the behaviour of individual commands, and what meaning they assign to their -# arguments. - - -# To end up with an interpreter that can do nothing, delete the global -# namespace. It's not very useful to do such a thing, but it illustrates the -# nature of Tcl. -namespace delete :: - - -# Because of name resolution behaviour, its safer to use the "variable" command to declare or to assign a value to a namespace. -namespace eval people { - namespace eval person1 { - variable name Neo - } -} - - -# The full name of a variable can always be used, if desired. -set people::person1::name Neo - - - -################################################################################ -## 4. Commands -################################################################################ - -# Math can be done with the "expr" command. -set a 3 -set b 4 -set c [expr {$a + $b}] - -# Since "expr" performs variable substitution on its own, brace the expression -# to prevent Tcl from performing variable substitution first. See -# "http://wiki.tcl.tk/Brace%20your%20#%20expr-essions" for details. - - -# The "expr" command understands variable and command substitution -set c [expr {$a + [set b]}] - - -# The "expr" command provides a set of mathematical functions -set c [expr {pow($a,$b)}] - - -# Mathematical operators are available as commands in the ::tcl::mathop -# namespace -::tcl::mathop::+ 5 3 - -# Commands can be imported from other namespaces -namespace import ::tcl::mathop::+ -set result [+ 5 3] - - -# New commands can be created via the "proc" command. -proc greet name { - return "Hello, $name!" -} - -#multiple parameters can be specified -proc greet {greeting name} { - return "$greeting, $name!" -} - - -# As noted earlier, braces do not construct a code block. Every value, even -# the third argument of the "proc" command, is a string. The previous command -# rewritten to not use braces at all: -proc greet greeting\ name return\ \"Hello,\ \$name! - - - -# When the last parameter is the literal value, "args", it collects all extra -# arguments when the command is invoked -proc fold {cmd args} { - set res 0 - foreach arg $args { - set res [cmd $res $arg] - } -} -fold ::tcl::mathop::* 5 3 3 ;# -> 45 - - -# Conditional execution is implemented as a command -if {3 > 4} { - puts {This will never happen} -} elseif {4 > 4} { - puts {This will also never happen} -} else { - puts {This will always happen} -} - - -# Loops are implemented as commands. The first, second, and third -# arguments of the "for" command are treated as mathematical expressions -for {set i 0} {$i < 10} {incr i} { - set res [expr {$res + $i}] -} - - -# The first argument of the "while" command is also treated as a mathematical -# expression -set i 0 -while {$i < 10} { - incr i 2 -} - - -# A list is a specially-formatted string. In the simple case, whitespace is sufficient to delimit values -set amounts 10\ 33\ 18 -set amount [lindex $amounts 1] - - -# Braces and backslash can be used to format more complex values in a list. A -# list looks exactly like a script, except that the newline character and the -# semicolon character lose their special meanings. This feature makes Tcl -# homoiconic. There are three items in the following list. -set values { - - one\ two - - {three four} - - five\{six - -} - - -# Since a list is a string, string operations could be performed on it, at the -# risk of corrupting the formatting of the list. -set values {one two three four} -set values [string map {two \{} $values] ;# $values is no-longer a \ - properly-formatted listwell-formed list - - -# The sure-fire way to get a properly-formmated list is to use "list" commands -set values [list one \{ three four] -lappend values { } ;# add a single space as an item in the list - - -# Use "eval" to evaluate a value as a script -eval { - set name Neo - set greeting "Hello, $name" -} - - -# A list can always be passed to "eval" as a script composed of a single -# command. -eval {set name Neo} -eval [list set greeting "Hello, $name"] - - -# Therefore, when using "eval", use [list] to build up a desired command -set command {set name} -lappend command {Archibald Sorbisol} -eval $command - - -# A common mistake is not to use list functions when building up a command -set command {set name} -append command { Archibald Sorbisol} -eval $command ;# There is an error here, because there are too many arguments \ - to "set" in {set name Archibald Sorbisol} - - -# This mistake can easily occur with the "subst" command. -set replacement {Archibald Sorbisol} -set command {set name $replacement} -set command [subst $command] -eval $command ;# The same error as before: to many arguments to "set" in \ - {set name Archibald Sorbisol} - - -# The proper way is to format the substituted value using use the "list" -# command. -set replacement [list {Archibald Sorbisol}] -set command {set name $replacement} -set command [subst $command] -eval $command - - -# It is extremely common to see the "list" command being used to properly -# format values that are substituted into Tcl script templates. There are -# several examples of this, below. - - -# The "apply" command evaluates a string as a command. -set cmd {{greeting name} { - return "$greeting, $name!" -}} -apply $cmd Whaddup Neo - - -# The "uplevel" command evaluates a script in some enclosing scope. -proc greet {} { - uplevel {puts "$greeting, $name"} -} - -proc set_double {varname value} { - if {[string is double $value]} { - uplevel [list variable $varname $value] - } else { - error [list {not a double} $value] - } -} - - -# The "upvar" command links a variable in the current scope to a variable in -# some enclosing scope -proc set_double {varname value} { - if {[string is double $value]} { - upvar 1 $varname var - set var $value - } else { - error [list {not a double} $value] - } -} - - -#get rid of the built-in "while" command. -rename ::while {} - - -# Define a new while command with the "proc" command. More sophisticated error -# handling is left as an exercise. -proc while {condition script} { - if {[uplevel 1 [list expr $condition]]} { - uplevel 1 $script - tailcall [namespace which while] $condition $script - } -} - - -# The "coroutine" command creates a separate call stack, along with a command -# to enter that call stack. The "yield" command suspends execution in that -# stack. -proc countdown {} { - #send something back to the initial "coroutine" command - yield - - set count 3 - while {$count > 1} { - yield [incr count -1] - } - return 0 -} -coroutine countdown1 countdown -coroutine countdown2 countdown -puts [countdown 1] ;# -> 2 -puts [countdown 2] ;# -> 2 -puts [countdown 1] ;# -> 1 -puts [countdown 1] ;# -> 0 -puts [coundown 1] ;# -> invalid command name "countdown1" -puts [countdown 2] ;# -> 1 - - -``` - -## Reference - -[Official Tcl Documentation](http://www.tcl.tk/man/tcl/) - -[Tcl Wiki](http://wiki.tcl.tk) - -[Tcl Subreddit](http://www.reddit.com/r/Tcl) +--- +language: Tcl +contributors: + - ["Poor Yorick", "http://pooryorick.com/"] +filename: learntcl.tcl +--- + +Tcl was created by [John Ousterhout](http://wiki.tcl.tk/John Ousterout) as a +reusable scripting language for chip design tools he was creating. In 1997 he +was awarded the [ACM Software System +Award](http://en.wikipedia.org/wiki/ACM_Software_System_Award) for Tcl. Tcl +can be used both as an embeddable scripting language and as a general +programming language. It can also be used as a portable C library, even in +cases where no scripting capability is needed, as it provides data structures +such as dynamic strings, lists, and hash tables. The C library also provides +portable functionality for loading dynamic libraries, string formatting and +code conversion, filesystem operations, network operations, and more. +Various features of Tcl stand out: + +* Convenient cross-platform networking API + +* Fully virtualized filesystem + +* Stackable I/O channels + +* Asynchronous to the core + +* Full coroutines + +* A threading model recognized as robust and easy to use + + +If Lisp is a list processor, then Tcl is a string processor. All values are +strings. A list is a string format. A procedure definition is a string +format. To achieve performance, Tcl internally caches structured +representations of these values. The list commands, for example, operate on +the internal cached representation, and Tcl takes care of updating the string +representation if it is ever actually needed in the script. The copy-on-write +design of Tcl allows script authors can pass around large data values without +actually incurring additional memory overhead. Procedures are automatically +byte-compiled unless they use the more dynamic commands such as "uplevel", +"upvar", and "trace". + +Tcl is a pleasure to program in. It will appeal to hacker types who find Lisp, +Forth, or Smalltalk interesting, as well as to engineers and scientists who +just want to get down to business with a tool that bends to their will. Its +discipline of exposing all programmatic functionality as commands, including +things like loops and mathematical operations that are usually baked into the +syntax of other languages, allows it to fade into the background of whatever +domain-specific functionality a project needs. It's syntax, which is even +lighter that that of Lisp, just gets out of the way. + + + + + +```tcl +#! /bin/env tclsh + +################################################################################ +## 1. Guidelines +################################################################################ + +# Tcl is not Bash or C! This needs to be said because standard shell quoting +# habits almost work in Tcl and it is common for people to pick up Tcl and try +# to get by with syntax they know from another language. It works at first, +# but soon leads to frustration with more complex scripts. + +# Braces are just a quoting mechanism, not a code block constructor or a list +# constructor. Tcl doesn't have either of those things. Braces are used, +# though, to escape special characters in procedure bodies and in strings that +# are formatted as lists. + + +################################################################################ +## 2. Syntax +################################################################################ + +# Every line is a command. The first word is the name of the command, and +# subsequent words are arguments to the command. Words are delimited by +# whitespace. Since every word is a string, in the simple case no special +# markup such as quotes, braces, or backslash, is necessary. Even when quotes +# are used, they are not a string constructor, but just another escaping +# character. + +set greeting1 Sal +set greeting2 ut +set greeting3 ations + + +#semicolon also delimits commands +set greeting1 Sal; set greeting2 ut; set greeting3 ations + + +# Dollar sign introduces variable substitution +set greeting $greeting1$greeting2$greeting3 + + +# Bracket introduces command substitution. The result of the command is +# substituted in place of the bracketed script. When the "set" command is +# given only the name of a variable, it returns the value of that variable. +set greeting $greeting1$greeting2[set greeting3] + + +# Command substitution should really be called script substitution, because an +# entire script, not just a command, can be placed between the brackets. The +# "incr" command increments the value of a variable and returns its value. +set greeting $greeting[ + incr i + incr i + incr i +] + + +# backslash suppresses the special meaning of characters +set amount \$16.42 + + +# backslash adds special meaning to certain characters +puts lots\nof\n\n\n\n\n\nnewlines + + +# A word enclosed in braces is not subject to any special interpretation or +# substitutions, except that a backslash before a brace is not counted when look#ing for the closing brace +set somevar { + This is a literal $ sign, and this \} escaped + brace remains uninterpreted +} + + +# In a word enclosed in double quotes, whitespace characters lose their special +# meaning +set name Neo +set greeting "Hello, $name" + + +#variable names can be any string +set {first name} New + + +# The brace form of variable substitution handles more complex variable names +set greeting "Hello, ${first name}" + + +# The "set" command can always be used instead of variable substitution +set greeting "Hello, [set {first name}]" + + +# To promote the words within a word to individual words of the current +# command, use the expansion operator, "{*}". +set {*}{name Neo} + +# is equivalent to +set name Neo + + +# An array is a special variable that is a container for other variables. +set person(name) Neo +set person(gender) male +set greeting "Hello, $person(name)" + + +# A namespace holds commands and variables +namespace eval people { + namespace eval person1 { + set name Neo + } +} + + +#The full name of a variable includes its enclosing namespace(s), delimited by two colons: +set greeting "Hello $people::person::name" + + + +################################################################################ +## 3. A Few Notes +################################################################################ + +# All other functionality is implemented via commands. From this point on, +# there is no new syntax. Everything else there is to learn about Tcl is about +# the behaviour of individual commands, and what meaning they assign to their +# arguments. + + +# To end up with an interpreter that can do nothing, delete the global +# namespace. It's not very useful to do such a thing, but it illustrates the +# nature of Tcl. +namespace delete :: + + +# Because of name resolution behaviour, its safer to use the "variable" command to declare or to assign a value to a namespace. +namespace eval people { + namespace eval person1 { + variable name Neo + } +} + + +# The full name of a variable can always be used, if desired. +set people::person1::name Neo + + + +################################################################################ +## 4. Commands +################################################################################ + +# Math can be done with the "expr" command. +set a 3 +set b 4 +set c [expr {$a + $b}] + +# Since "expr" performs variable substitution on its own, brace the expression +# to prevent Tcl from performing variable substitution first. See +# "http://wiki.tcl.tk/Brace%20your%20#%20expr-essions" for details. + + +# The "expr" command understands variable and command substitution +set c [expr {$a + [set b]}] + + +# The "expr" command provides a set of mathematical functions +set c [expr {pow($a,$b)}] + + +# Mathematical operators are available as commands in the ::tcl::mathop +# namespace +::tcl::mathop::+ 5 3 + +# Commands can be imported from other namespaces +namespace import ::tcl::mathop::+ +set result [+ 5 3] + + +# New commands can be created via the "proc" command. +proc greet name { + return "Hello, $name!" +} + +#multiple parameters can be specified +proc greet {greeting name} { + return "$greeting, $name!" +} + + +# As noted earlier, braces do not construct a code block. Every value, even +# the third argument of the "proc" command, is a string. The previous command +# rewritten to not use braces at all: +proc greet greeting\ name return\ \"Hello,\ \$name! + + + +# When the last parameter is the literal value, "args", it collects all extra +# arguments when the command is invoked +proc fold {cmd args} { + set res 0 + foreach arg $args { + set res [cmd $res $arg] + } +} +fold ::tcl::mathop::* 5 3 3 ;# -> 45 + + +# Conditional execution is implemented as a command +if {3 > 4} { + puts {This will never happen} +} elseif {4 > 4} { + puts {This will also never happen} +} else { + puts {This will always happen} +} + + +# Loops are implemented as commands. The first, second, and third +# arguments of the "for" command are treated as mathematical expressions +for {set i 0} {$i < 10} {incr i} { + set res [expr {$res + $i}] +} + + +# The first argument of the "while" command is also treated as a mathematical +# expression +set i 0 +while {$i < 10} { + incr i 2 +} + + +# A list is a specially-formatted string. In the simple case, whitespace is sufficient to delimit values +set amounts 10\ 33\ 18 +set amount [lindex $amounts 1] + + +# Braces and backslash can be used to format more complex values in a list. A +# list looks exactly like a script, except that the newline character and the +# semicolon character lose their special meanings. This feature makes Tcl +# homoiconic. There are three items in the following list. +set values { + + one\ two + + {three four} + + five\{six + +} + + +# Since a list is a string, string operations could be performed on it, at the +# risk of corrupting the formatting of the list. +set values {one two three four} +set values [string map {two \{} $values] ;# $values is no-longer a \ + properly-formatted listwell-formed list + + +# The sure-fire way to get a properly-formmated list is to use "list" commands +set values [list one \{ three four] +lappend values { } ;# add a single space as an item in the list + + +# Use "eval" to evaluate a value as a script +eval { + set name Neo + set greeting "Hello, $name" +} + + +# A list can always be passed to "eval" as a script composed of a single +# command. +eval {set name Neo} +eval [list set greeting "Hello, $name"] + + +# Therefore, when using "eval", use [list] to build up a desired command +set command {set name} +lappend command {Archibald Sorbisol} +eval $command + + +# A common mistake is not to use list functions when building up a command +set command {set name} +append command { Archibald Sorbisol} +eval $command ;# There is an error here, because there are too many arguments \ + to "set" in {set name Archibald Sorbisol} + + +# This mistake can easily occur with the "subst" command. +set replacement {Archibald Sorbisol} +set command {set name $replacement} +set command [subst $command] +eval $command ;# The same error as before: to many arguments to "set" in \ + {set name Archibald Sorbisol} + + +# The proper way is to format the substituted value using use the "list" +# command. +set replacement [list {Archibald Sorbisol}] +set command {set name $replacement} +set command [subst $command] +eval $command + + +# It is extremely common to see the "list" command being used to properly +# format values that are substituted into Tcl script templates. There are +# several examples of this, below. + + +# The "apply" command evaluates a string as a command. +set cmd {{greeting name} { + return "$greeting, $name!" +}} +apply $cmd Whaddup Neo + + +# The "uplevel" command evaluates a script in some enclosing scope. +proc greet {} { + uplevel {puts "$greeting, $name"} +} + +proc set_double {varname value} { + if {[string is double $value]} { + uplevel [list variable $varname $value] + } else { + error [list {not a double} $value] + } +} + + +# The "upvar" command links a variable in the current scope to a variable in +# some enclosing scope +proc set_double {varname value} { + if {[string is double $value]} { + upvar 1 $varname var + set var $value + } else { + error [list {not a double} $value] + } +} + + +#get rid of the built-in "while" command. +rename ::while {} + + +# Define a new while command with the "proc" command. More sophisticated error +# handling is left as an exercise. +proc while {condition script} { + if {[uplevel 1 [list expr $condition]]} { + uplevel 1 $script + tailcall [namespace which while] $condition $script + } +} + + +# The "coroutine" command creates a separate call stack, along with a command +# to enter that call stack. The "yield" command suspends execution in that +# stack. +proc countdown {} { + #send something back to the initial "coroutine" command + yield + + set count 3 + while {$count > 1} { + yield [incr count -1] + } + return 0 +} +coroutine countdown1 countdown +coroutine countdown2 countdown +puts [countdown 1] ;# -> 2 +puts [countdown 2] ;# -> 2 +puts [countdown 1] ;# -> 1 +puts [countdown 1] ;# -> 0 +puts [coundown 1] ;# -> invalid command name "countdown1" +puts [countdown 2] ;# -> 1 + + +``` + +## Reference + +[Official Tcl Documentation](http://www.tcl.tk/man/tcl/) + +[Tcl Wiki](http://wiki.tcl.tk) + +[Tcl Subreddit](http://www.reddit.com/r/Tcl) -- cgit v1.2.3 From 0512b3120acbe9d3a534cbc7685c30a65e067801 Mon Sep 17 00:00:00 2001 From: Jakukyo Friel Date: Wed, 7 Jan 2015 23:15:25 +0800 Subject: java: Add `@Override` for interfaces. --- java.html.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java.html.markdown b/java.html.markdown index 4661d4f9..3dd65679 100644 --- a/java.html.markdown +++ b/java.html.markdown @@ -4,6 +4,7 @@ language: java contributors: - ["Jake Prather", "http://github.com/JakeHP"] - ["Madison Dickson", "http://github.com/mix3d"] + - ["Jakukyo Friel", "http://weakish.github.io"] filename: LearnJava.java --- @@ -433,10 +434,12 @@ public interface Digestible { //We can now create a class that implements both of these interfaces public class Fruit implements Edible, Digestible { + @Override public void eat() { //... } + @Override public void digest() { //... } @@ -445,10 +448,12 @@ public class Fruit implements Edible, Digestible { //In java, you can extend only one class, but you can implement many interfaces. //For example: public class ExampleClass extends ExampleClassParent implements InterfaceOne, InterfaceTwo { + @Override public void InterfaceOneMethod() { } + @Override public void InterfaceTwoMethod() { } -- cgit v1.2.3 From aa13db251bec274a1227235f0cea376c100f003b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Ara=C3=BAjo?= Date: Wed, 7 Jan 2015 14:35:03 -0300 Subject: [XML/en] translated to [XML/pt-br] --- pt-br/xml-pt.html.markdown | 133 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 pt-br/xml-pt.html.markdown diff --git a/pt-br/xml-pt.html.markdown b/pt-br/xml-pt.html.markdown new file mode 100644 index 00000000..40ddbc3a --- /dev/null +++ b/pt-br/xml-pt.html.markdown @@ -0,0 +1,133 @@ +--- +language: xml +filename: learnxml.xml +contributors: + - ["João Farias", "https://github.com/JoaoGFarias"] +translators: + - ["Miguel Araújo", "https://github.com/miguelarauj1o"] +lang: pt-br +--- + +XML é uma linguagem de marcação projetada para armazenar e transportar dados. + +Ao contrário de HTML, XML não especifica como exibir ou formatar os dados, +basta carregá-lo. + +* Sintaxe XML + +```xml + + + + + + Everyday Italian + Giada De Laurentiis + 2005 + 30.00 + + + Harry Potter + J K. Rowling + 2005 + 29.99 + + + Learning XML + Erik T. Ray + 2003 + 39.95 + + + + + + + + + + +computer.gif + + +``` + +* Documento bem formatado x Validação + +Um documento XML é bem formatado se estiver sintaticamente correto.No entanto, +é possível injetar mais restrições no documento, utilizando definições de +documentos, tais como DTD e XML Schema. + +Um documento XML que segue uma definição de documento é chamado válido, sobre +esse documento. + +Com esta ferramenta, você pode verificar os dados XML fora da lógica da aplicação. + +```xml + + + + + + + + Everyday Italian + 30.00 + + + + + + + + + + +]> + + + + + + + + + + + + + +]> + + + + Everyday Italian + 30.00 + + +``` \ No newline at end of file -- cgit v1.2.3 From 7dad0b92cc81b34c98bdcb204ada59c4fd1f627b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Ara=C3=BAjo?= Date: Thu, 8 Jan 2015 11:28:11 -0300 Subject: [Hy/en] translated to [Hy/pt-bt] --- pt-br/hy-pt.html.markdown | 176 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 pt-br/hy-pt.html.markdown diff --git a/pt-br/hy-pt.html.markdown b/pt-br/hy-pt.html.markdown new file mode 100644 index 00000000..4230579d --- /dev/null +++ b/pt-br/hy-pt.html.markdown @@ -0,0 +1,176 @@ +--- +language: hy +filename: learnhy.hy +contributors: + - ["Abhishek L", "http://twitter.com/abhishekl"] +translators: + - ["Miguel Araújo", "https://github.com/miguelarauj1o"] +lang: pt-br +--- + +Hy é um dialeto de Lisp escrito sobre Python. Isto é possível convertendo +código Hy em árvore sintática abstrata python (ast). Portanto, isto permite +hy chamar código python nativo e vice-versa. + +Este tutorial funciona para hy ≥ 0.9.12 + +```clojure +;; Isso dá uma introdução básica em hy, como uma preliminar para o link abaixo +;; http://try-hy.appspot.com +;; +; Comentários em ponto-e-vírgula, como em outros LISPS + +;; s-noções básicas de expressão +; programas Lisp são feitos de expressões simbólicas ou sexps que se assemelham +(some-function args) +; agora o essencial "Olá mundo" +(print "hello world") + +;; Tipos de dados simples +; Todos os tipos de dados simples são exatamente semelhantes aos seus homólogos +; em python que +42 ; => 42 +3.14 ; => 3.14 +True ; => True +4+10j ; => (4+10j) um número complexo + +; Vamos começar com um pouco de aritmética muito simples +(+ 4 1) ;=> 5 +; o operador é aplicado a todos os argumentos, como outros lisps +(+ 4 1 2 3) ;=> 10 +(- 2 1) ;=> 1 +(* 4 2) ;=> 8 +(/ 4 1) ;=> 4 +(% 4 2) ;=> 0 o operador módulo +; exponenciação é representado pelo operador ** como python +(** 3 2) ;=> 9 +; formas aninhadas vão fazer a coisa esperada +(+ 2 (* 4 2)) ;=> 10 +; também operadores lógicos e ou não e igual etc. faz como esperado +(= 5 4) ;=> False +(not (= 5 4)) ;=> True + +;; variáveis +; variáveis são definidas usando SETV, nomes de variáveis podem usar utf-8, exceto +; for ()[]{}",'`;#| +(setv a 42) +(setv π 3.14159) +(def *foo* 42) +;; outros tipos de dados de armazenamento +; strings, lists, tuples & dicts +; estes são exatamente os mesmos tipos de armazenamento de python +"hello world" ;=> "hello world" +; operações de string funcionam semelhante em python +(+ "hello " "world") ;=> "hello world" +; Listas são criadas usando [], a indexação começa em 0 +(setv mylist [1 2 3 4]) +; tuplas são estruturas de dados imutáveis +(setv mytuple (, 1 2)) +; dicionários são pares de valores-chave +(setv dict1 {"key1" 42 "key2" 21}) +; :nome pode ser utilizado para definir palavras-chave em hy que podem ser utilizados para as chaves +(setv dict2 {:key1 41 :key2 20}) +; usar 'get' para obter o elemento em um índice/key +(get mylist 1) ;=> 2 +(get dict1 "key1") ;=> 42 +; Alternativamente, se foram utilizadas palavras-chave que podem ser chamadas diretamente +(:key1 dict2) ;=> 41 + +;; funções e outras estruturas de programa +; funções são definidas usando defn, o último sexp é devolvido por padrão +(defn greet [name] + "A simple greeting" ; uma docstring opcional + (print "hello " name)) + +(greet "bilbo") ;=> "hello bilbo" + +; funções podem ter argumentos opcionais, bem como argumentos-chave +(defn foolists [arg1 &optional [arg2 2]] + [arg1 arg2]) + +(foolists 3) ;=> [3 2] +(foolists 10 3) ;=> [10 3] + +; funções anônimas são criados usando construtores 'fn' ou 'lambda' +; que são semelhantes para 'defn' +(map (fn [x] (* x x)) [1 2 3 4]) ;=> [1 4 9 16] + +;; operações de sequência +; hy tem algumas utils embutidas para operações de sequência, etc. +; recuperar o primeiro elemento usando 'first' ou 'car' +(setv mylist [1 2 3 4]) +(setv mydict {"a" 1 "b" 2}) +(first mylist) ;=> 1 + +; corte listas usando 'slice' +(slice mylist 1 3) ;=> [2 3] + +; obter elementos de uma lista ou dict usando 'get' +(get mylist 1) ;=> 2 +(get mydict "b") ;=> 2 +; lista de indexação começa a partir de 0, igual em python +; assoc pode definir elementos em chaves/índices +(assoc mylist 2 10) ; faz mylist [1 2 10 4] +(assoc mydict "c" 3) ; faz mydict {"a" 1 "b" 2 "c" 3} +; há toda uma série de outras funções essenciais que torna o trabalho com +; sequências uma diversão + +;; Python interop +;; importação funciona exatamente como em python +(import datetime) +(import [functools [partial reduce]]) ; importa fun1 e fun2 do module1 +(import [matplotlib.pyplot :as plt]) ; fazendo uma importação em foo como em bar +; todos os métodos de python embutidas etc. são acessíveis a partir hy +; a.foo(arg) is called as (.foo a arg) +(.split (.strip "hello world ")) ;=> ["hello" "world"] + +;; Condicionais +; (if condition (body-if-true) (body-if-false) +(if (= passcode "moria") + (print "welcome") + (print "Speak friend, and Enter!")) + +; aninhe múltiplas cláusulas 'if else if' com cond +(cond + [(= someval 42) + (print "Life, universe and everything else!")] + [(> someval 42) + (print "val too large")] + [(< someval 42) + (print "val too small")]) + +; declarações de grupo com 'do', essas são executadas sequencialmente +; formas como defn tem um 'do' implícito +(do + (setv someval 10) + (print "someval is set to " someval)) ;=> 10 + +; criar ligações lexicais com 'let', todas as variáveis definidas desta forma +; tem escopo local +(let [[nemesis {"superman" "lex luther" + "sherlock" "moriarty" + "seinfeld" "newman"}]] + (for [(, h v) (.items nemesis)] + (print (.format "{0}'s nemesis was {1}" h v)))) + +;; classes +; classes são definidas da seguinte maneira +(defclass Wizard [object] + [[--init-- (fn [self spell] + (setv self.spell spell) ; init a mágica attr + None)] + [get-spell (fn [self] + self.spell)]]) + +;; acesse hylang.org +``` + +### Outras Leituras + +Este tutorial é apenas uma introdução básica para hy/lisp/python. + +Docs Hy: [http://hy.readthedocs.org](http://hy.readthedocs.org) + +Repo Hy no Github: [http://github.com/hylang/hy](http://github.com/hylang/hy) + +Acesso ao freenode irc com #hy, hashtag no twitter: #hylang -- cgit v1.2.3 From d1171443ddc0eda7cbabfc41d110a76a67e494ab Mon Sep 17 00:00:00 2001 From: mordner Date: Thu, 8 Jan 2015 23:21:39 +0100 Subject: Fixed one line being cut off and a comment about the export attribute was referring to the wrong function and variable. --- c.html.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/c.html.markdown b/c.html.markdown index b5b804af..7670824a 100644 --- a/c.html.markdown +++ b/c.html.markdown @@ -386,7 +386,8 @@ int main() { // or when it's the argument of the `sizeof` or `alignof` operator: int arraythethird[10]; int *ptr = arraythethird; // equivalent with int *ptr = &arr[0]; - printf("%zu, %zu\n", sizeof arraythethird, sizeof ptr); // probably prints "40, 4" or "40, 8" + printf("%zu, %zu\n", sizeof arraythethird, sizeof ptr); + // probably prints "40, 4" or "40, 8" // Pointers are incremented and decremented based on their type @@ -477,7 +478,7 @@ void testFunc() { } //make external variables private to source file with static: -static int j = 0; //other files using testFunc() cannot access variable i +static int j = 0; //other files using testFunc2() cannot access variable j void testFunc2() { extern int j; } -- cgit v1.2.3 From 4ef0e78009896395804c609201c9b70254bddcb2 Mon Sep 17 00:00:00 2001 From: raiph Date: Fri, 9 Jan 2015 18:39:56 -0500 Subject: Fix link to synopses and call them 'design docs' --- perl6.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl6.html.markdown b/perl6.html.markdown index b10e04bf..13f383fe 100644 --- a/perl6.html.markdown +++ b/perl6.html.markdown @@ -1481,5 +1481,5 @@ If you want to go further, you can: - Read the [Perl 6 Advent Calendar](http://perl6advent.wordpress.com/). This is probably the greatest source of Perl 6 information, snippets and such. - Come along on `#perl6` at `irc.freenode.net`. The folks here are always helpful. - Check the [source of Perl 6's functions and classes](https://github.com/rakudo/rakudo/tree/nom/src/core). Rakudo is mainly written in Perl 6 (with a lot of NQP, "Not Quite Perl", a Perl 6 subset easier to implement and optimize). - - Read the [Synopses](perlcabal.org/syn). They explain it from an implementor point-of-view, but it's still very interesting. + - Read [the language design documents](http://design.perl6.org). They explain P6 from an implementor point-of-view, but it's still very interesting. -- cgit v1.2.3 From 8f29b15cda9cbc7ca8fc1f31ed0755245c9fc9c7 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Sun, 11 Jan 2015 15:30:12 -0700 Subject: Rewrite the pattern matching section --- scala.html.markdown | 64 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/scala.html.markdown b/scala.html.markdown index 336251ba..3fa4d4b8 100644 --- a/scala.html.markdown +++ b/scala.html.markdown @@ -198,8 +198,8 @@ weirdSum(2, 4) // => 16 // The return keyword exists in Scala, but it only returns from the inner-most -// def that surrounds it. -// WARNING: Using return in Scala is error-prone and should be avoided. +// def that surrounds it. +// WARNING: Using return in Scala is error-prone and should be avoided. // It has no effect on anonymous functions. For example: def foo(x: Int): Int = { val anonFunc: Int => Int = { z => @@ -407,41 +407,55 @@ val otherGeorge = george.copy(phoneNumber = "9876") // 6. Pattern Matching ///////////////////////////////////////////////// -val me = Person("George", "1234") +// Pattern matching is a powerful and commonly used feature in Scala. Here's how +// you pattern match a case class. NB: Unlike other languages, Scala cases do +// not have breaks. -me match { case Person(name, number) => { - "We matched someone : " + name + ", phone : " + number }} - -me match { case Person(name, number) => "Match : " + name; case _ => "Hm..." } +def matchPerson(person: Person): String = person match { + // Then you specify the patterns: + case Person("George", number) => "We found George! His number is " + number + case Person("Kate", number) => "We found Kate! Her number is " + number + case Person(name, number) => "We matched someone : " + name + ", phone : " + number +} -me match { case Person("George", number) => "Match"; case _ => "Hm..." } +val email = "(.*)@(.*)".r // Define a regex for the next example. -me match { case Person("Kate", number) => "Match"; case _ => "Hm..." } +// Pattern matching might look familiar to the switch statements in the C family +// of languages, but this is much more powerful. In Scala, you can match much +// more: +def matchEverything(obj: Any): String = obj match { + // You can match values: + case "Hello world" => "Got the string Hello world" -me match { case Person("Kate", _) => "Girl"; case Person("George", _) => "Boy" } + // You can match by type: + case x: Double => "Got a Double: " + x -val kate = Person("Kate", "1234") + // You can specify conditions: + case x: Int if x > 10000 => "Got a pretty big number!" -kate match { case Person("Kate", _) => "Girl"; case Person("George", _) => "Boy" } + // You can match case classes as before: + case Person(name, number) => s"Got contact info for $name!" + // You can match regular expressions: + case email(name, domain) => s"Got email address $name@$domain" + // You can match tuples: + case (a: Int, b: Double, c: String) => s"Got a tuple: $a, $b, $c" -// Regular expressions -val email = "(.*)@(.*)".r // Invoking r on String makes it a Regex -val serialKey = """(\d{5})-(\d{5})-(\d{5})-(\d{5})""".r // Using verbatim (multiline) syntax + // You can match data structures: + case List(1, b, c) => s"Got a list with three elements and starts with 1: 1, $b, $c" -val matcher = (value: String) => { - println(value match { - case email(name, domain) => s"It was an email: $name" - case serialKey(p1, p2, p3, p4) => s"Serial key: $p1, $p2, $p3, $p4" - case _ => s"No match on '$value'" // default if no match found - }) + // You can nest patterns: + case List(List((1, 2,"YAY"))) => "Got a list of list of tuple" } -matcher("mrbean@pyahoo.com") // => "It was an email: mrbean" -matcher("nope..") // => "No match on 'nope..'" -matcher("52917") // => "No match on '52917'" -matcher("52752-16432-22178-47917") // => "Serial key: 52752, 16432, 22178, 47917" +// In fact, you can pattern match any object with an "unapply" method. This +// feature is so powerful that Scala lets you define whole functions as +// patterns: +val patternFunc: Person => String = { + case Person("George", number") => s"George's number: $number" + case Person(name, number) => s"Random person's number: $number" +} ///////////////////////////////////////////////// -- cgit v1.2.3 From c053f1559bb357d9e8ced2452096bf3a95cc7ddb Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Sun, 11 Jan 2015 18:11:06 -0700 Subject: Better wording about breaks in cases --- scala.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scala.html.markdown b/scala.html.markdown index 3fa4d4b8..61c735e3 100644 --- a/scala.html.markdown +++ b/scala.html.markdown @@ -409,7 +409,7 @@ val otherGeorge = george.copy(phoneNumber = "9876") // Pattern matching is a powerful and commonly used feature in Scala. Here's how // you pattern match a case class. NB: Unlike other languages, Scala cases do -// not have breaks. +// not need breaks, fall-through does not happen. def matchPerson(person: Person): String = person match { // Then you specify the patterns: -- cgit v1.2.3 From 22d0cb02a8e08532555edde1f5ccf9a34a2b6a77 Mon Sep 17 00:00:00 2001 From: Fla Date: Mon, 12 Jan 2015 14:10:41 +0100 Subject: Typo --- fr-fr/ruby-fr.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fr-fr/ruby-fr.html.markdown b/fr-fr/ruby-fr.html.markdown index 75c8d0d3..1564d2b6 100644 --- a/fr-fr/ruby-fr.html.markdown +++ b/fr-fr/ruby-fr.html.markdown @@ -268,7 +268,7 @@ end # implicitement la valeur de la dernière instruction évaluée double(2) #=> 4 -# Les paranthèses sont facultative +# Les parenthèses sont facultatives # lorsqu'il n'y a pas d'ambiguïté sur le résultat double 3 #=> 6 -- cgit v1.2.3 From bb2ef18bcc24549560f56bcf1e3b1d8cdcf68f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=20Polykanine=20A=2EK=2EA=2E=20Menelion=20Elens=C3=BA?= =?UTF-8?q?l=C3=AB?= Date: Wed, 5 Nov 2014 22:39:28 +0200 Subject: Adding the lang header --- ru-ru/java-ru.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/ru-ru/java-ru.html.markdown b/ru-ru/java-ru.html.markdown index 005495cc..913c0fe2 100644 --- a/ru-ru/java-ru.html.markdown +++ b/ru-ru/java-ru.html.markdown @@ -1,5 +1,6 @@ --- language: java +lang: ru-ru contributors: - ["Jake Prather", "http://github.com/JakeHP"] - ["Madison Dickson", "http://github.com/mix3d"] -- cgit v1.2.3 From d2336d0ce4dc35e0d8627a4b0d089e06c8dffd88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=20Polykanine=20A=2EK=2EA=2E=20Menelion=20Elens=C3=BA?= =?UTF-8?q?l=C3=AB?= Date: Wed, 5 Nov 2014 22:52:46 +0200 Subject: Revert "Adding the lang header" This reverts commit 2b0aa461069d5356f5e6b4c166deac04d6597b4a. --- ru-ru/java-ru.html.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/ru-ru/java-ru.html.markdown b/ru-ru/java-ru.html.markdown index 913c0fe2..005495cc 100644 --- a/ru-ru/java-ru.html.markdown +++ b/ru-ru/java-ru.html.markdown @@ -1,6 +1,5 @@ --- language: java -lang: ru-ru contributors: - ["Jake Prather", "http://github.com/JakeHP"] - ["Madison Dickson", "http://github.com/mix3d"] -- cgit v1.2.3 From 7b9eb42fb5f2c3b29bef2e08b570a6b6ef0ad8a7 Mon Sep 17 00:00:00 2001 From: "a.gonchar" Date: Wed, 24 Dec 2014 16:15:34 +0300 Subject: translation javascript into Russian --- ru-ru/javascript-ru.html.markdown | 503 ++++++++++++++++++-------------------- 1 file changed, 235 insertions(+), 268 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index ad66b501..dc35d18c 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -3,261 +3,250 @@ language: javascript contributors: - ["Adam Brenecki", "http://adam.brenecki.id.au"] - ["Ariel Krakowski", "http://www.learneroo.com"] -translators: - - ["Maxim Koretskiy", "http://github.com/maximkoretskiy"] filename: javascript-ru.js +translators: + - ["Alexey Gonchar", "http://github.com/finico"] lang: ru-ru --- -Javascript был разработан Бренданом Айком из Netcape в 1995. Изначально -предполагалось, что он станет простым вариантом скриптового языка для сайтов, -дополняющий к Java, который бы в свою очередь использовался для более сложных -web-приложений. Но тонкая интегрированность javascript с web-страницей и -встроенная поддержка в браузерах привели к тому, чтобы он стал более -распространен в frontend-разработке, чем Java. - -Использование JavaScript не ограничивается браузерами. Проект Node.js, -предоставляющий независимую среду выполнения на движке Google Chrome V8 -JavaScript, становится все более популярным. +JavaScript был создан в 1995 году Бренданом Айком, работающим в компании Netscape. +Изначально он был задуман как простой язык сценариев для веб-сайтов, дополняющий +Java для более сложных веб-приложений, но его тесная интеграция с веб-страницами +и втроенная поддержка браузерами привели к тому, что он стал более распространынным, +чем Java в веб-интерфейсах. -Обратная связь важна и нужна! Вы можете написаться мне -на [@adambrenecki](https://twitter.com/adambrenecki) или -[adam@brenecki.id.au](mailto:adam@brenecki.id.au). +JavaScript не ограничивается только веб-браузером, например, Node.js, программная +платформа, позволяющая выполнять JavaScript, основанная на движке V8 от браузера +Google Chrome, становится все более популярной. ```js -// Комментарии оформляются как в C. -// Однострочнные коментарии начинаются с двух слешей, -/* а многострочные с слеша и звездочки - и заканчиваются звездочеий и слешом */ +// Си-подобные комментарии. Однострочные комментарии начинаются с двух символов слэш, +/* а многострочные комментарии начинаются с звёздочка-слэш + и заканчиваются символами слэш-звёздочка */ -// Выражения разделяются с помощью ; +// Выражения заканчиваються точкой с запятой ; doStuff(); -// ... но этого можно и не делать, разделители подставляются автоматически -// после перехода на новую строку за исключением особых случаев +// ... но они необязательны, так как точки с запятой автоматически вставляются +// везде, где есть символ новой строки, за некоторыми исключениями. doStuff() -// Это может приводить к непредсказуемому результату и поэтому мы будем -// использовать разделители в этом туре. -// Because those cases can cause unexpected results, we'll keep on using -// semicolons in this guide. +// Так как эти исключения могут привести к неожиданным результатам, мы будем всегда +// использовать точку с запятой в этом руководстве. /////////////////////////////////// // 1. Числа, Строки и Операторы -// 1. Numbers, Strings and Operators -// В Javasript всего 1 числовой тип - 64-битное число с плавающей точкой -// стандарта IEEE 754) -// Числа имеют 52-битную мантиссу, чего достаточно для хранения хранения целых -// чисел до 9✕10¹⁵ приблизительно. +// В JavaScript только один тип числа (64-bit IEEE 754 double). +// Он имеет 52-битную мантиссу, которой достаточно для хранения целых чисел +// с точностью вплоть до 9✕10¹⁵. 3; // = 3 1.5; // = 1.5 -// В основном базовая арифметика работает предсказуемо +// Некоторые простые арифметические операции работают так, как вы ожидаете. 1 + 1; // = 2 -.1 + .2; // = 0.30000000000000004 +0.1 + 0.2; // = 0.30000000000000004 (а некоторые - нет) 8 - 1; // = 7 10 * 2; // = 20 35 / 5; // = 7 -// Включая нецелочисленное деление +// Включая деление с остатком. 5 / 2; // = 2.5 -// Двоичные операции тоже есть. Если применить двоичную операцию к float-числу, -// оно будет приведено к 32-битному целому со знаком. +// Побитовые операции так же имеются; Они производят операции, используя +// двоичное представление числа, и возвращают новую последовательность из +// 32 бит (число) в качестве результата. 1 << 2; // = 4 -// (todo:перевести) -// Приоритет выполнения операций можно менять с помощью скобок. +// Приоритет в выражениях явно задаётся скобками. (1 + 3) * 2; // = 8 -// Есть три особых не реальных числовых значения: -Infinity; // допустим, результат операции 1/0 --Infinity; // допустим, результат операции -1/0 -NaN; // допустим, результат операции 0/0 +// Есть три специальных значения, которые не являются реальными числами: +Infinity; // "бесконечность", например, результат деления на 0 +-Infinity; // "минус бесконечность", результат деления отрицательного числа на 0 +NaN; // "не число", например, результат деления 0/0 -// Так же есть тип булевых данных. +// Существует также логический тип. true; false; -// Строки создаются с помощью ' или ". +// Строки создаются при помощи двойных или одинарных кавычек. 'abc'; "Hello, world"; -// Оператор ! означает отрицание +// Для логического отрицания используется символ восклицательного знака. !true; // = false !false; // = true -// Равество это === +// Строгое равенство === 1 === 1; // = true 2 === 1; // = false -// Неравенство это !== +// Строгое неравенство !== 1 !== 1; // = false 2 !== 1; // = true -// Еще сравнения +// Другие операторы сравнения 1 < 10; // = true 1 > 10; // = false 2 <= 2; // = true 2 >= 2; // = true -// Строки складываются с помощью + +// Строки конкатенируются при помощи оператора + "Hello " + "world!"; // = "Hello world!" -// и сравниваются с помощью < и > +// и сравниваются при помощи < и > "a" < "b"; // = true -// Приведение типов выполняется при сравнении с ==... +// Проверка равенства с приведением типов осуществляется двойным символом равно "5" == 5; // = true null == undefined; // = true -// ...в отличие от === +// ...а если использовать === "5" === 5; // = false null === undefined; // = false -// Для доступа к конкретному символу строки используйте charAt +// ...приведение типов может привести к странному поведению... +13 + !0; // 14 +"13" + !0; // '13true' + +// Вы можете получить доступ к любому символу строки, используя метод charAt "This is a string".charAt(0); // = 'T' -// ... или используйте substring для получения подстроки +// ...или используйте метод substring чтобы получить более крупные части "Hello world".substring(0, 5); // = "Hello" -// length(длина) - свойство, не используйте () +// length это свойство, для его получения не нужно использовать () "Hello".length; // = 5 -// Есть null и undefined -null; // используется что бы указать явно, что значения нет -undefined; // испрользуется чтобы показать, что значения не было установлено - // собственно, undefined так и переводится +// Так же есть null и undefined +null; // используется для обозначения намеренного значения "ничего" +undefined; // используется для обозначения переменных, не имеющих + // присвоенного значения (хотя переменная объявлена) -// false, null, undefined, NaN, 0 и "" являются falsy-значениями(при приведении -// в булеву типу становятся false) -// Обратите внимание что 0 приводится к false, а "0" к true, -// не смотря на то, что "0"==0 +// false, null, undefined, NaN, 0 и "" это ложь; все остальное - истина. +// Следует отметить, что 0 это ложь, а "0" - истина, несмотря на то, что 0 == "0". /////////////////////////////////// -// 2. Переменные, массивы и объекты +// 2. Переменные, Массивы и Объекты -// Переменные объявляются ключевым словом var. Javascript динамически -// типизируемый, так что указывать тип не нужно. -// Присвоение значения описывается с помощью оператора = +// Переменные объявляются при помощи ключевого слова var. JavaScript - язык с +// динамической типизацией, поэтому не нужно явно указывать тип. Для присваивания +// значения переменной используется символ = var someVar = 5; -// если не указать ключевого слова var, ошибки не будет... +// если вы пропустите слово var, вы не получите сообщение об ошибке... someOtherVar = 10; -// ...но переменная будет создана в глобальном контексте, в не области -// видимости, в которой она была объявлена. +// ...но ваша переменная будет создана в глобальном контексте, а не в текущем +// гед вы ее объявили. -// Переменные объявленные без присвоения значения, содержать undefined +// Переменным объявленным без присвоения устанавливается значение undefined. var someThirdVar; // = undefined -// Для математических операций над переменными есть короткая запись: -someVar += 5; // тоже что someVar = someVar + 5; someVar равно 10 теперь -someVar *= 10; // а теперь -- 100 +// У математических операций есть сокращённые формы: +someVar += 5; // как someVar = someVar + 5; someVar теперь имеет значение 10 +someVar *= 10; // теперь someVar имеет значение 100 -// еще более короткая запись для добавления и вычитания 1 -someVar++; // теперь someVar равно 101 -someVar--; // обратно к 100 +// а так же специальные операторы инкремент и декремент для увеличения и +// уменьшения переменной на единицу соответственно +someVar++; // теперь someVar имеет значение 101 +someVar--; // обратно 100 -// Массивы -- упорядоченные списки значений любых типов. +// Массивы это нумерованные списки из значений любого типа. var myArray = ["Hello", 45, true]; -// Для доступу к элементам массивов используйте квадратные скобки. -// Индексы массивов начинаются с 0 +// Их элементы могут быть доступны при помощи синтаксиса с квадратными скобками. +// Индексы массивов начинаются с нуля. myArray[1]; // = 45 -// Массивы мутабельны(изменяемы) и имеют переменную длину. -myArray.push("World"); // добавить элемент +// Массивы можно изменять, как и их длину. +myArray.push("World"); myArray.length; // = 4 -// Добавить или изменить значение по конкретному индексу +// Добавлять и редактировать определенный элемент myArray[3] = "Hello"; -// Объекты javascript похожи на dictionary или map из других языков -// программирования. Это неупорядочнные коллекции пар ключ-значение. +// Объекты в JavaScript похожи на "словари" или ассоциативные массиы в других +// языках: неупорядоченный набор пар ключ-значение. var myObj = {key1: "Hello", key2: "World"}; -// Ключи -- это строки, но кавычки не требуются если названия явлюятся -// корректными javascript идентификаторами. Значения могут быть любого типа. +// Ключи это строки, но кавычки необязательны, если строка удовлетворяет +// ограничениям для имён переменных. Значения могут быть любых типов. var myObj = {myKey: "myValue", "my other key": 4}; -// Доступ к атрибту объекта можно получить с помощью квадратных скобок +// Атрибуты объектов можно также получить, используя квадратные скобки, myObj["my other key"]; // = 4 -// ... или используя точечную нотацию, при условии что ключ является -// корректным идентификатором. +// или через точку, при условии, что ключ является допустимым идентификатором. myObj.myKey; // = "myValue" -// Объекты мутабельны. В существуюещем объекте можно изменить значние -// или добавить новый атрибут. +// Объекты изменяемы; можно изменять значения и добавлять новые ключи. myObj.myThirdKey = true; -// При попытке доступа к атрибуту, который до этого не был создан, будет -// возвращен undefined +// Если вы попытаетесь получить доступ к несуществующему свойству, +// вы получите undefined. myObj.myFourthKey; // = undefined /////////////////////////////////// -// 3. Логика и Управляющие структуры +// 3. Логика и управляющие конструкции. -// Синтаксис управляющих структур очень похож на его реализацию в Java. +// Синтаксис для этого раздела почти такой же как в Java. -// if работает так как вы ожидаете. +// Эта конструкция работает, как и следовало ожидать. var count = 1; -if (count == 3){ - // выполнится, если значение count равно 3 -} else if (count == 4){ - // выполнится, если значение count равно 4 +if (count == 3) { + // выполняется, если count равен 3 +} else if (count == 4) { + // выполняется, если count равен 4 } else { - // выполнится, если значение count не будет равно ни 3 ни 4 + // выполняется, если не 3 и не 4 } -// Поведение while тоже вполне предсказуемо +// Как это делает while. while (true){ - // Бесконечный цикл + // Бесконечный цикл! } -// Циклы do-while похожи на while, но они всегда выполняются хотябы 1 раз. -// Do-while loops are like while loops, except they always run at least once. +// Циклы do-while такие же как while, но они всегда выполняются хотя бы раз. var input do { input = getInput(); } while (!isValid(input)) -// Цикл for такой же как в C и Java: -// инициализация; условие продолжения; итерация -for (var i = 0; i < 5; i++){ - // выполнится 5 раз +// цикл for является таким же, как C и Java: +// инициализация; условие; шаг. +for (var i = 0; i < 5; i++) { + // будет запущен 5 раз } -// && - логическое и, || - логическое или -if (house.size == "big" && house.color == "blue"){ +// && это логическое И, || это логическое ИЛИ +if (house.size == "big" && house.colour == "blue") { house.contains = "bear"; } -if (color == "red" || color == "blue"){ - // если цвет или красный или синий +if (colour == "red" || colour == "blue") { + // цвет красный или синий } -// && и || удобны для установки значений по умолчанию. -// && and || "short circuit", which is useful for setting default values. +// || используется как "короткий цикл вычисления" для присваивания переменных. var name = otherName || "default"; -// выражение switch проверяет равество с помощью === -// используйте 'break' после каждого case, -// иначе помимо правильного case выполнятся и все последующие. -grade = '4'; // оценка +// Оператор switch выполняет проверку на равенство пр помощи === +// используйте break чтобы прервать выполнение после каждого case +// или выполнение пойдёт далее, игнорируя при этом остальные проверки. +grade = 'B'; switch (grade) { - case '5': - console.log("Великолепно"); + case 'A': + console.log("Great job"); break; - case '4': - console.log("Неплохо"); + case 'B': + console.log("OK job"); break; - case '3': - console.log("Можно и лучше"); + case 'C': + console.log("You can do better"); break; default: - console.log("Да уж."); + console.log("Oy vey"); break; } @@ -265,213 +254,197 @@ switch (grade) { /////////////////////////////////// // 4. Функции, Область видимости и Замыкания -// Функции в JavaScript объявляются с помощью ключевого слова function. -function myFunction(thing){ - return thing.toUpperCase(); // приведение к верхнему регистру +// Функции в JavaScript объявляются при помощи ключевого слова function. +function myFunction(thing) { + return thing.toUpperCase(); } myFunction("foo"); // = "FOO" -// Помните, что значение, которое должно быть возкращено должно начинаться -// на той же строке, где расположено ключевое слово 'return'. В противном случае -// будет возвращено undefined. Такое поведения объясняется автоматической -// вставкой разделителей ';'. Помните этот факт, если используете -// BSD стиль оформления кода. -// Note that the value to be returned must start on the same line as the -// 'return' keyword, otherwise you'll always return 'undefined' due to -// automatic semicolon insertion. Watch out for this when using Allman style. +// Обратите внимание, что значение, которое будет возвращено, должно начинаться +// на той же строке, что и ключевое слово return, в противном случае вы будете +// всегда возвращать undefined по причине автоматической вставки точки с запятой. +// Следите за этим при использовании стиля форматирования Allman. function myFunction() { - return // <- разделитель автоматически будет вставлен здесь + return // <- здесь точка с запятой вставится автоматически { thisIsAn: 'object literal' } } myFunction(); // = undefined -// Функции в JavaScript являются объектами, поэтому их можно назначить в -// переменные с разными названиями и передавать в другие функции, как аргументы, -// на пример, при указании обработчика события. -function myFunction(){ - // этот фрагмент кода будет вызван через 5 секунд +// JavaScript функции - это объекты, поэтому они могут быть переприсвоены на +// различные имена переменных и передаваться другим функциям в качестве аргументов, +// например, когда назначается обработчик события: +function myFunction() { + // этот код будет вызван через 5 секунд } setTimeout(myFunction, 5000); -// Обратите внимание, что setTimeout не является частью языка, однако он -// доступен в API браузеров и Node.js. +// Примечание: setTimeout не является частью языка, но реализован в браузерах и Node.js -// Объект функции на самом деле не обязательно объявлять с именем - можно -// создать анонимную функцию прямо в аргументах другой функции. -setTimeout(function(){ - // этот фрагмент кода будет вызван через 5 секунд +// Функции не обязательно должны иметь имя при объявлении - вы можете написать +// анонимное определение функции непосредственно в агрументе другой функции. +setTimeout(function() { + // этот код будет вызван через 5 секунд }, 5000); -// В JavaScript есть области видимости. У функций есть собственные области -// видимости, у других блоков их нет. -if (true){ +// В JavaScript есть область видимости функции; функции имеют свою область +// видимости, а другие блоки - нет. +if (true) { var i = 5; } -i; // = 5, а не undefined, как это было бы в языке, создающем - // области видисти для блоков кода +i; // = 5 - не undefined как ожидалось бы в языках с блочной областью видимости -// Это привело к появлению паттерна общего назначения "immediately-executing -// anonymous functions" (сразу выполняющиеся анонимные функции), который -// позволяет предотвратить запись временных переменных в общую облать видимости. -(function(){ +// Это привело к общепринятому шаблону "самозапускающихся анонимных функций", +// которые препятствуют проникновению переменных в глобальную область видимости +(function() { var temporary = 5; - // Для доступа к глобальной области видимости можно использовать запись в - // некоторый 'глобальный объект', для браузеров это 'window'. Глобальный - // объект может называться по-разному в небраузерных средах, таких Node.js. + // Мы можем получить доступ к глобальной области для записи в "глобальный объект", + // который в веб-браузере всегда window. Глобальный объект может иметь другое + // имя в таких платформах, как Node.js window.permanent = 10; })(); -temporary; // вызывает исключение ReferenceError +temporary; // вызовет сообщение об ошибке с типом ReferenceError permanent; // = 10 -// Одной из сильных сторон JavaScript являются замыкания. Если функция -// объявлена в внутри другой функции, внутренняя функция имеет доступ ко всем -// переменным внешней функции, даже после того, как внешняя функции завершила -// свое выполнение. -function sayHelloInFiveSeconds(name){ - var prompt = "Привет, " + name + "!"; - // Внутренние функции помещаются в локальную область видимости, как-будто - // они объявлены с ключевым словом 'var'. - function inner(){ +// Одной из самых мощных возможностей JavaScript являются замыкания. Если функция +// определена внутри другой функции, то внутренняя функция имеет доступ к +// переменным внешней функции, даже после того, как контекст выполнения выйдет из +// внешней функции. +function sayHelloInFiveSeconds(name) { + var prompt = "Hello, " + name + "!"; + // Внутренние функции по умолчанию помещаются в локальную область видимости, + // как если бы они были объявлены с var. + function inner() { alert(prompt); } setTimeout(inner, 5000); - // setTimeout является асинхроннной, и поэтому функция sayHelloInFiveSeconds - // завершит свое выполнение сразу и setTimeout вызовет inner позже. - // Однако, так как inner "закрыта внутри" или "замкнута в" - // sayHelloInFiveSeconds, inner все еще будет иметь доступ к переменной - // prompt, когда будет вызвана. + // setTimeout асинхронна, поэтому функция sayHelloInFiveSeconds сразу выйдет + // и тело setTimeout будет вызвано позже. Однако, поскольку внутренняя + // функция "замкнута", она по-прежнему имеет доступ к переменной prompt, + // когда sayHelloInFiveSeconds вызывется. } -sayHelloInFiveSeconds("Вася"); // откроет модальное окно с сообщением - // "Привет, Вася" по истечении 5 секунд. - +sayHelloInFiveSeconds("Adam"); // откроется окно с "Hello, Adam!" через 5 секунд /////////////////////////////////// -// 5. Немного еще об Объектах. Конструкторы и Прототипы +// 5. Подробнее про Объекты, Конструкторы и Прототипы -// Объекты могут содержать функции +// Объекты могут содержать в себе функции. var myObj = { - myFunc: function(){ + myFunc: function() { return "Hello world!"; } }; myObj.myFunc(); // = "Hello world!" -// Когда функции прикрепленные к объекту вызываются, они могут получить доступ -// к данным объекта, ипользуя ключевое слово this. +// Когда функции, прикрепленные к объекту, вызываются, они могут получить доступ +// к этому объекту с помощью ключевого слова this. myObj = { myString: "Hello world!", - myFunc: function(){ + myFunc: function() { return this.myString; } }; myObj.myFunc(); // = "Hello world!" -// Содержание this определяется исходя из того, как была вызвана функция, а -// не места её определения. По этой причине наша функция не будет работать вне -// контекста объекта. +// Какое это значение имеет к тому, как вызвана функция и где она определена. +// Итак, наша функция не работает, если она вызывается не в контексте объекта. var myFunc = myObj.myFunc; myFunc(); // = undefined -// И напротив, функция может быть присвоена объекту и получить доступ к нему -// через this, даже если она не была прикреплена к объекту в момент её создания. -var myOtherFunc = function(){ - return this.myString.toUpperCase(); +// И наоборот, функция может быть присвоена объекту и получать доступ к нему +// через this, даже если она не была присвоена при объявлении. +var myOtherFunc = function() { } myObj.myOtherFunc = myOtherFunc; myObj.myOtherFunc(); // = "HELLO WORLD!" -// Также можно указать контекс выполнения фунции с помощью 'call' или 'apply'. -var anotherFunc = function(s){ +// Мы можем также указать контекст для выполнения функции, когда мы вызываем ее +// с помощью call или apply. +var anotherFunc = function(s) { return this.myString + s; } anotherFunc.call(myObj, " And Hello Moon!"); // = "Hello World! And Hello Moon!" -// Функция 'apply' очень похожа, но принимает массив со списком аргументов. - +// Функция apply аналогична, но принимает массив аргументов. anotherFunc.apply(myObj, [" And Hello Sun!"]); // = "Hello World! And Hello Sun!" -// Это может быть удобно, когда работаешь с фунцией принимающей на вход -// последовательность аргументов и нужно передать их в виде массива. - +// Это полезно при работе с функцией, которая принимает последовательность +// аргументов, и вы хотите передать массив. Math.min(42, 6, 27); // = 6 -Math.min([42, 6, 27]); // = NaN (uh-oh!) +Math.min([42, 6, 27]); // = NaN (не сработает!) Math.min.apply(Math, [42, 6, 27]); // = 6 -// Однако, 'call' и 'apply' не имеют постоянного эффекта. Если вы хотите -// зафиксировать контекст для функции, используйте bind. - +// Но, call и apply - временные. Когда мы хотим связать функцию, мы можем +// использовать bind. var boundFunc = anotherFunc.bind(myObj); boundFunc(" And Hello Saturn!"); // = "Hello World! And Hello Saturn!" -// bind также можно использовать чтобы частично передать аргументы в -// функцию (каррировать). - -var product = function(a, b){ return a * b; } +// Bind также может использоваться, для частичного применения (каррирование) функции +var product = function(a, b) { return a * b; } var doubler = product.bind(this, 2); doubler(8); // = 16 -// Когда функция вызывается с ключевым словом new, создается новый объект. -// Данный объект становится доступным функции через ключевое слово this. -// Функции спроектированные вызываться таким способом называются конструкторами. - -var MyConstructor = function(){ +// Когда вы вызываете функцию с помощью ключевого слова new создается новый объект, +// и создает доступ к функции при помощи this. Такие функции называют конструкторами. +var MyConstructor = function() { this.myNumber = 5; } myNewObj = new MyConstructor(); // = {myNumber: 5} myNewObj.myNumber; // = 5 -// Любой объект в JavaScript имеет 'прототип'. Когда вы пытаетесь получить -// доступ к свойству не объявленному в данном объекте, интерпретатор будет -// искать его в прототипе. +// Каждый объект в JavaScript имеет свойтво prototype. Когда вы хотите получить +// доступ к свойтву объекта, которое не существует в этом объекте, интерпритатор +// будет искать это свойство в прототипе. -// Некоторые реализации JS позволяют получить доступ к прототипу с помощью -// "волшебного" свойства __proto__. До момента пока оно не являются стандартным, -// __proto__ полезно лишь для изучения прототипов в JavaScript. Мы разберемся -// со стандартными способами работы с прототипом несколько позже. +// Некоторые реализации языка позволяют получить доступ к объекту прототипа +// через свойство __proto__. Несмотря на то, что это может быть полезно для +// понимания прототипов, это не часть стандарта; мы увидим стандартные способы +// использования прототипов позже. var myObj = { myString: "Hello world!" }; var myPrototype = { meaningOfLife: 42, - myFunc: function(){ + myFunc: function() { return this.myString.toLowerCase() } }; myObj.__proto__ = myPrototype; myObj.meaningOfLife; // = 42 + +// Для функций это так же работает. myObj.myFunc(); // = "hello world!" -// Естественно, если в свойства нет в прототипе, поиск будет продолжен в +// Если интерпритатор не найдет свойство в прототипе, то продожит поиск в // прототипе прототипа и так далее. myPrototype.__proto__ = { myBoolean: true }; myObj.myBoolean; // = true -// Ничего не копируется, каждый объект хранит ссылку на свой прототип. Если -// изменить прототип, все изменения отразятся во всех его потомках. +// Здесь не участвует копирование; каждый объект хранит ссылку на свой прототип. +// Это означает, что мы можем изменить прототип и наши изменения будут отражены везде myPrototype.meaningOfLife = 43; myObj.meaningOfLife; // = 43 -// Как было сказано выше, __proto__ не является стандартом, и нет стандартного -// способа изменить прототип у созданного объекта. Однако, есть два способа -// создать объект с заданным прототипом. +// Мы упомянули, что свойтсво __proto__ нестандартно, и нет никакого стандартного +// способа, чтобы изменить прототип существующего объекта. Однако, есть два +// способа создать новый объект с заданным прототипом. -// Первый способ - Object.create, был добавлен в JS относительно недавно, и -// потому не доступен в более ранних реализациях языка. +// Первый способ это Object.create, который появился в ECMAScript 5 и есть еще +// не во всех реализациях языка. var myObj = Object.create(myPrototype); myObj.meaningOfLife; // = 43 -// Второй вариан доступен везде и связан с конструкторами. Конструкторы имеют -// свойство prototype. Это вовсе не прототип функции конструктора, напротив, -// это прототип, который присваевается новым объектам, созданным с этим -// конструктором с помощью ключевого слова new. +// Второй способ, который работает везде, имеет дело с конструкторами. +// У конструкторов есть свойство с именем prototype. Это не прототип +// функции-конструктора; напротив, это прототип для новых объектов, которые +// будут созданы с помощью этого конструктора и ключевого слова new MyConstructor.prototype = { myNumber: 5, - getMyNumber: function(){ + getMyNumber: function() { return this.myNumber; } }; @@ -480,42 +453,41 @@ myNewObj2.getMyNumber(); // = 5 myNewObj2.myNumber = 6 myNewObj2.getMyNumber(); // = 6 -// У встроенных типов таких, как строки и числа, тоже есть конструкторы, -// создающие эквивалентные объекты-обертки. +// У встроенных типов, таких как строки и числа также есть конструкторы, которые +// создают эквивалентые объекты-обертки. var myNumber = 12; var myNumberObj = new Number(12); myNumber == myNumberObj; // = true -// Правда, они не совсем эквивалентны. +// За исключением того, что они не в точности равны. typeof myNumber; // = 'number' typeof myNumberObj; // = 'object' myNumber === myNumberObj; // = false -if (0){ - // Этот фрагмент кода не будет выпонен, так как 0 приводится к false +if (0) { + // Этот код не выполнятся, потому что 0 - это ложь. } -if (Number(0)){ - // Этот фрагмент кода *будет* выпонен, так как Number(0) приводится к true. +if (Number(0)) { + // Этот код выполнится, потому что Number(0) это истина. } -// Однако, оберточные объекты и обычные встроенные типы имеют общие прототипы, -// следовательно вы можете расширить функциональность строки, например. -String.prototype.firstCharacter = function(){ +// Впрочем, обертки это объекты и их можно расширять, например: +String.prototype.firstCharacter = function() { return this.charAt(0); } "abc".firstCharacter(); // = "a" -// Этот факт часто используется для создания полифилов(polyfill) - реализации -// новых возможностей JS в его более старых версиях для того чтобы их можно было -// использовать в устаревших браузерах. +// Это часто используется в полифиллах, которые реализуют новые возможности +// JavaScript в старой реализации языка, так что они могут быть использованы в +// старых средах, таких как устаревшие браузеры. -// Например, мы упомянули, что Object.create не доступен во всех версиях -// JavaScript, но мы можем создать полифилл. -if (Object.create === undefined){ // не переопределяем, если есть - Object.create = function(proto){ - // создаем временный конструктор с заданным прототипом +// Например, мы упомянули, что Object.create доступен не во всех реализациях, но +// мы сможем использовать его с этим полифиллом: +if (Object.create === undefined) { // не перезаписывать метод, если он существует + Object.create = function(proto) { + // создать временный конструктор с правильным прототипом var Constructor = function(){}; Constructor.prototype = proto; - // создаём новый объект с правильным прототипом + // затем использовать его для создания нового объекта, на основе прототипа return new Constructor(); } } @@ -523,21 +495,16 @@ if (Object.create === undefined){ // не переопределяем, если ## Что еще почитать -[Современный учебник JavaScript](http://learn.javascript.ru/) от Ильи Кантора -является довольно качественным и глубоким учебным материалом, освещающим все -особенности современного языка. Помимо учебника на том же домене можно найти -[перевод спецификации ECMAScript 5.1](http://es5.javascript.ru/) и справочник по -возможностям языка. - -[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/ru/) позволяет -довольно быстро изучить основные тонкие места в работе с JS, но фокусируется -только на таких моментах +[Современный учебник JavaScript (Илья Кантор)](http://learn.javascript.ru) - +качественный учебник по JavaScript на русском языке. -[Справочник](https://developer.mozilla.org/ru/docs/JavaScript) от MDN -(Mozilla Development Network) содержит информацию о возможностях языка на -английском. +[Mozilla Developer Network](https://developer.mozilla.org/ru/docs/Web/JavaScript) - +предоставляет отличную документацию для JavaScript, как он используется в браузерах. +Кроме того, это вики, поэтому, если вы знаете больше, вы можете помочь другим, +делясь своими знаниями. -Название проекта ["Принципы написания консистентного, идиоматического кода на -JavaScript"](https://github.com/rwaldron/idiomatic.js/tree/master/translations/ru_RU) -говорит само за себя. +[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/ru/) - это +подробное руководство всех неинтуитивных особенностей языка. +[Stack Overflow](http://stackoverflow.com/questions/tagged/javascript) - можно +найти ответ почти на любой ваш вопрос, а если его нет, то задать вопрос самому. -- cgit v1.2.3 From 1a559fe83493cba67961e5009de068dae1ddcc53 Mon Sep 17 00:00:00 2001 From: "a.gonchar" Date: Wed, 24 Dec 2014 16:40:47 +0300 Subject: fix minor typos in javascript-ru #901 --- ru-ru/javascript-ru.html.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index dc35d18c..d7599e7e 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -12,7 +12,7 @@ lang: ru-ru JavaScript был создан в 1995 году Бренданом Айком, работающим в компании Netscape. Изначально он был задуман как простой язык сценариев для веб-сайтов, дополняющий Java для более сложных веб-приложений, но его тесная интеграция с веб-страницами -и втроенная поддержка браузерами привели к тому, что он стал более распространынным, +и втроенная поддержка браузерами привели к тому, что он стал более распространённым, чем Java в веб-интерфейсах. JavaScript не ограничивается только веб-браузером, например, Node.js, программная @@ -53,7 +53,7 @@ doStuff() // Включая деление с остатком. 5 / 2; // = 2.5 -// Побитовые операции так же имеются; Они производят операции, используя +// Побитовые операции также имеются; они производят операции, используя // двоичное представление числа, и возвращают новую последовательность из // 32 бит (число) в качестве результата. 1 << 2; // = 4 @@ -394,7 +394,7 @@ myNewObj = new MyConstructor(); // = {myNumber: 5} myNewObj.myNumber; // = 5 // Каждый объект в JavaScript имеет свойтво prototype. Когда вы хотите получить -// доступ к свойтву объекта, которое не существует в этом объекте, интерпритатор +// доступ к свойтву объекта, которое не существует в этом объекте, интерпретатор // будет искать это свойство в прототипе. // Некоторые реализации языка позволяют получить доступ к объекту прототипа @@ -417,7 +417,7 @@ myObj.meaningOfLife; // = 42 // Для функций это так же работает. myObj.myFunc(); // = "hello world!" -// Если интерпритатор не найдет свойство в прототипе, то продожит поиск в +// Если интерпретатор не найдет свойство в прототипе, то продожит поиск в // прототипе прототипа и так далее. myPrototype.__proto__ = { myBoolean: true -- cgit v1.2.3 From dd5803183c2c73cc8bd0aae05797c1493c334055 Mon Sep 17 00:00:00 2001 From: finico Date: Wed, 24 Dec 2014 22:32:24 +0300 Subject: [javascript/ru] needs correct typos #902 --- ru-ru/javascript-ru.html.markdown | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index d7599e7e..9efc2835 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -9,10 +9,10 @@ translators: lang: ru-ru --- -JavaScript был создан в 1995 году Бренданом Айком, работающим в компании Netscape. +JavaScript был создан в 1995 году Бренданом Айком, работавшим в компании Netscape. Изначально он был задуман как простой язык сценариев для веб-сайтов, дополняющий Java для более сложных веб-приложений, но его тесная интеграция с веб-страницами -и втроенная поддержка браузерами привели к тому, что он стал более распространённым, +и встроенная поддержка браузерами привели к тому, что он стал более распространённым, чем Java в веб-интерфейсах. JavaScript не ограничивается только веб-браузером, например, Node.js, программная @@ -27,7 +27,7 @@ Google Chrome, становится все более популярной. // Выражения заканчиваються точкой с запятой ; doStuff(); -// ... но они необязательны, так как точки с запятой автоматически вставляются +// ... но она необязательна, так как точки с запятой автоматически вставляются // везде, где есть символ новой строки, за некоторыми исключениями. doStuff() @@ -113,18 +113,18 @@ null === undefined; // = false // Вы можете получить доступ к любому символу строки, используя метод charAt "This is a string".charAt(0); // = 'T' -// ...или используйте метод substring чтобы получить более крупные части +// ...или используйте метод substring, чтобы получить более крупные части "Hello world".substring(0, 5); // = "Hello" -// length это свойство, для его получения не нужно использовать () +// length - это свойство, для его получения не нужно использовать () "Hello".length; // = 5 -// Так же есть null и undefined +// Также есть null и undefined null; // используется для обозначения намеренного значения "ничего" undefined; // используется для обозначения переменных, не имеющих // присвоенного значения (хотя переменная объявлена) -// false, null, undefined, NaN, 0 и "" это ложь; все остальное - истина. +// false, null, undefined, NaN, 0 и "" - это ложь; все остальное - истина. // Следует отметить, что 0 это ложь, а "0" - истина, несмотря на то, что 0 == "0". /////////////////////////////////// @@ -138,22 +138,22 @@ var someVar = 5; // если вы пропустите слово var, вы не получите сообщение об ошибке... someOtherVar = 10; -// ...но ваша переменная будет создана в глобальном контексте, а не в текущем -// гед вы ее объявили. +// ...но ваша переменная будет создана в глобальном контексте, а не в текущем, +// где вы ее объявили. -// Переменным объявленным без присвоения устанавливается значение undefined. +// Переменным, объявленным без присвоения, устанавливается значение undefined. var someThirdVar; // = undefined // У математических операций есть сокращённые формы: someVar += 5; // как someVar = someVar + 5; someVar теперь имеет значение 10 someVar *= 10; // теперь someVar имеет значение 100 -// а так же специальные операторы инкремент и декремент для увеличения и +// а также специальные операторы инкремент и декремент для увеличения и // уменьшения переменной на единицу соответственно someVar++; // теперь someVar имеет значение 101 someVar--; // обратно 100 -// Массивы это нумерованные списки из значений любого типа. +// Массивы - это нумерованные списки содержащие значения любого типа. var myArray = ["Hello", 45, true]; // Их элементы могут быть доступны при помощи синтаксиса с квадратными скобками. -- cgit v1.2.3 From e8d9163796ea76a028d5e23e7f833863425872f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=20Polykanine=20A=2EK=2EA=2E=20Menelion=20Elens=C3=BA?= =?UTF-8?q?l=C3=AB?= Date: Mon, 12 Jan 2015 02:33:53 +0200 Subject: [javascript/ru] Translating JavaScript guide into Russian --- ru-ru/javascript-ru.html.markdown | 266 +++++++++++++++++++------------------- 1 file changed, 136 insertions(+), 130 deletions(-) diff --git a/ru-ru/javascript-ru.html.markdown b/ru-ru/javascript-ru.html.markdown index 9efc2835..e7398c88 100644 --- a/ru-ru/javascript-ru.html.markdown +++ b/ru-ru/javascript-ru.html.markdown @@ -6,6 +6,7 @@ contributors: filename: javascript-ru.js translators: - ["Alexey Gonchar", "http://github.com/finico"] + - ["Andre Polykanine", "https://github.com/Oire"] lang: ru-ru --- @@ -15,7 +16,7 @@ Java для более сложных веб-приложений, но его и встроенная поддержка браузерами привели к тому, что он стал более распространённым, чем Java в веб-интерфейсах. -JavaScript не ограничивается только веб-браузером, например, Node.js, программная +JavaScript не ограничивается только веб-браузером: например, Node.js, программная платформа, позволяющая выполнять JavaScript, основанная на движке V8 от браузера Google Chrome, становится все более популярной. @@ -24,7 +25,7 @@ Google Chrome, становится все более популярной. /* а многострочные комментарии начинаются с звёздочка-слэш и заканчиваются символами слэш-звёздочка */ -// Выражения заканчиваються точкой с запятой ; +// Инструкции могут заканчиваться точкой с запятой ; doStuff(); // ... но она необязательна, так как точки с запятой автоматически вставляются @@ -53,12 +54,12 @@ doStuff() // Включая деление с остатком. 5 / 2; // = 2.5 -// Побитовые операции также имеются; они производят операции, используя -// двоичное представление числа, и возвращают новую последовательность из -// 32 бит (число) в качестве результата. +// Побитовые операции также имеются; когда вы проводите такую операцию, +// ваше число с плавающей запятой переводится в целое со знаком +// длиной *до* 32 разрядов. 1 << 2; // = 4 -// Приоритет в выражениях явно задаётся скобками. +// Приоритет в выражениях можно явно задать скобками. (1 + 3) * 2; // = 8 // Есть три специальных значения, которые не являются реальными числами: @@ -71,10 +72,10 @@ true; false; // Строки создаются при помощи двойных или одинарных кавычек. -'abc'; -"Hello, world"; +'абв'; +"Привет, мир!"; -// Для логического отрицания используется символ восклицательного знака. +// Для логического отрицания используется восклицательный знак. !true; // = false !false; // = true @@ -92,8 +93,8 @@ false; 2 <= 2; // = true 2 >= 2; // = true -// Строки конкатенируются при помощи оператора + -"Hello " + "world!"; // = "Hello world!" +// Строки объединяются при помощи оператора + +"привет, " + "мир!"; // = "Привет, мир!" // и сравниваются при помощи < и > "a" < "b"; // = true @@ -102,7 +103,7 @@ false; "5" == 5; // = true null == undefined; // = true -// ...а если использовать === +// ...если только не использовать === "5" === 5; // = false null === undefined; // = false @@ -111,31 +112,33 @@ null === undefined; // = false "13" + !0; // '13true' // Вы можете получить доступ к любому символу строки, используя метод charAt -"This is a string".charAt(0); // = 'T' +"Это строка".charAt(0); // = 'Э' // ...или используйте метод substring, чтобы получить более крупные части -"Hello world".substring(0, 5); // = "Hello" +"Привет, мир".substring(0, 6); // = "Привет" // length - это свойство, для его получения не нужно использовать () -"Hello".length; // = 5 +"Привет".length; // = 6 // Также есть null и undefined -null; // используется для обозначения намеренного значения "ничего" +null; // Намеренное отсутствие значения undefined; // используется для обозначения переменных, не имеющих - // присвоенного значения (хотя переменная объявлена) + // присвоенного значения (хотя непосредственно undefined + // является значением) -// false, null, undefined, NaN, 0 и "" - это ложь; все остальное - истина. -// Следует отметить, что 0 это ложь, а "0" - истина, несмотря на то, что 0 == "0". +// false, null, undefined, NaN, 0 и "" — это ложь; всё остальное - истина. +// Следует отметить, что 0 — это ложь, а "0" — истина, несмотря на то, что +// 0 == "0". /////////////////////////////////// // 2. Переменные, Массивы и Объекты -// Переменные объявляются при помощи ключевого слова var. JavaScript - язык с +// Переменные объявляются при помощи ключевого слова var. JavaScript — язык с // динамической типизацией, поэтому не нужно явно указывать тип. Для присваивания // значения переменной используется символ = var someVar = 5; -// если вы пропустите слово var, вы не получите сообщение об ошибке... +// если вы пропустите слово var, вы не получите сообщение об ошибке, ... someOtherVar = 10; // ...но ваша переменная будет создана в глобальном контексте, а не в текущем, @@ -148,34 +151,33 @@ var someThirdVar; // = undefined someVar += 5; // как someVar = someVar + 5; someVar теперь имеет значение 10 someVar *= 10; // теперь someVar имеет значение 100 -// а также специальные операторы инкремент и декремент для увеличения и -// уменьшения переменной на единицу соответственно +// Ещё более краткая запись увеличения и уменьшения на единицу: someVar++; // теперь someVar имеет значение 101 -someVar--; // обратно 100 +someVar--; // вернулись к 100 -// Массивы - это нумерованные списки содержащие значения любого типа. -var myArray = ["Hello", 45, true]; +// Массивы — это нумерованные списки, содержащие значения любого типа. +var myArray = ["Привет", 45, true]; // Их элементы могут быть доступны при помощи синтаксиса с квадратными скобками. // Индексы массивов начинаются с нуля. myArray[1]; // = 45 -// Массивы можно изменять, как и их длину. -myArray.push("World"); +// Массивы можно изменять, как и их длину, +myArray.push("Мир"); myArray.length; // = 4 -// Добавлять и редактировать определенный элемент -myArray[3] = "Hello"; +// добавлять и редактировать определённый элемент +myArray[3] = "Привет"; -// Объекты в JavaScript похожи на "словари" или ассоциативные массиы в других +// Объекты в JavaScript похожи на словари или ассоциативные массивы в других // языках: неупорядоченный набор пар ключ-значение. -var myObj = {key1: "Hello", key2: "World"}; +var myObj = {key1: "Привет", key2: "Мир"}; -// Ключи это строки, но кавычки необязательны, если строка удовлетворяет +// Ключи — это строки, но кавычки необязательны, если строка удовлетворяет // ограничениям для имён переменных. Значения могут быть любых типов. var myObj = {myKey: "myValue", "my other key": 4}; -// Атрибуты объектов можно также получить, используя квадратные скобки, +// Атрибуты объектов можно также получить, используя квадратные скобки myObj["my other key"]; // = 4 // или через точку, при условии, что ключ является допустимым идентификатором. @@ -184,16 +186,16 @@ myObj.myKey; // = "myValue" // Объекты изменяемы; можно изменять значения и добавлять новые ключи. myObj.myThirdKey = true; -// Если вы попытаетесь получить доступ к несуществующему свойству, +// Если вы попытаетесь получить доступ к несуществующему значению, // вы получите undefined. myObj.myFourthKey; // = undefined /////////////////////////////////// // 3. Логика и управляющие конструкции. -// Синтаксис для этого раздела почти такой же как в Java. +// Синтаксис для этого раздела почти такой же, как в Java. -// Эта конструкция работает, как и следовало ожидать. +// Условная конструкция работает, как и следовало ожидать, var count = 1; if (count == 3) { // выполняется, если count равен 3 @@ -203,50 +205,51 @@ if (count == 3) { // выполняется, если не 3 и не 4 } -// Как это делает while. +// ...как и цикл while. while (true){ // Бесконечный цикл! } -// Циклы do-while такие же как while, но они всегда выполняются хотя бы раз. +// Цикл do-while такой же, как while, но он всегда выполняется хотя бы раз. var input do { input = getInput(); } while (!isValid(input)) -// цикл for является таким же, как C и Java: +// цикл for такой же, как в C и Java: // инициализация; условие; шаг. for (var i = 0; i < 5; i++) { - // будет запущен 5 раз + // выполнится 5 раз } -// && это логическое И, || это логическое ИЛИ -if (house.size == "big" && house.colour == "blue") { +// && — это логическое И, || — это логическое ИЛИ +if (house.size == "big" && house.color == "blue") { house.contains = "bear"; } -if (colour == "red" || colour == "blue") { +if (color == "red" || color == "blue") { // цвет красный или синий } -// || используется как "короткий цикл вычисления" для присваивания переменных. +// && и || используют сокращённое вычисление, что полезно +// для задания значений по умолчанию. var name = otherName || "default"; -// Оператор switch выполняет проверку на равенство пр помощи === -// используйте break чтобы прервать выполнение после каждого case -// или выполнение пойдёт далее, игнорируя при этом остальные проверки. -grade = 'B'; +// Оператор switch выполняет проверку на равенство при помощи === +// используйте break, чтобы прервать выполнение после каждого case, +// или выполнение пойдёт далее даже после правильного варианта. +grade = 4; switch (grade) { - case 'A': - console.log("Great job"); + case 5: + console.log("Отлично"); break; - case 'B': - console.log("OK job"); + case 4: + console.log("Хорошо"); break; - case 'C': - console.log("You can do better"); + case 3: + console.log("Можете и лучше"); break; default: - console.log("Oy vey"); + console.log("Ой-вей!"); break; } @@ -273,33 +276,33 @@ function myFunction() } myFunction(); // = undefined -// JavaScript функции - это объекты, поэтому они могут быть переприсвоены на -// различные имена переменных и передаваться другим функциям в качестве аргументов, -// например, когда назначается обработчик события: +// В JavaScript функции — это объекты первого класса, поэтому они могут быть +// присвоены различным именам переменных и передаваться другим функциям +// в качестве аргументов, например, когда назначается обработчик события: function myFunction() { // этот код будет вызван через 5 секунд } setTimeout(myFunction, 5000); // Примечание: setTimeout не является частью языка, но реализован в браузерах и Node.js -// Функции не обязательно должны иметь имя при объявлении - вы можете написать -// анонимное определение функции непосредственно в агрументе другой функции. +// Функции не обязательно должны иметь имя при объявлении — вы можете написать +// анонимное определение функции непосредственно в аргументе другой функции. setTimeout(function() { // этот код будет вызван через 5 секунд }, 5000); -// В JavaScript есть область видимости функции; функции имеют свою область -// видимости, а другие блоки - нет. +// В JavaScript есть область видимости; функции имеют свою область +// видимости, а другие блоки — нет. if (true) { var i = 5; } -i; // = 5 - не undefined как ожидалось бы в языках с блочной областью видимости +i; // = 5, а не undefined, как ожидалось бы в языках с блочной областью видимости // Это привело к общепринятому шаблону "самозапускающихся анонимных функций", // которые препятствуют проникновению переменных в глобальную область видимости (function() { var temporary = 5; - // Мы можем получить доступ к глобальной области для записи в "глобальный объект", + // Мы можем получить доступ к глобальной области для записи в «глобальный объект», // который в веб-браузере всегда window. Глобальный объект может иметь другое // имя в таких платформах, как Node.js window.permanent = 10; @@ -309,100 +312,101 @@ permanent; // = 10 // Одной из самых мощных возможностей JavaScript являются замыкания. Если функция // определена внутри другой функции, то внутренняя функция имеет доступ к -// переменным внешней функции, даже после того, как контекст выполнения выйдет из +// переменным внешней функции даже после того, как контекст выполнения выйдет из // внешней функции. function sayHelloInFiveSeconds(name) { - var prompt = "Hello, " + name + "!"; + var prompt = "Привет, " + name + "!"; // Внутренние функции по умолчанию помещаются в локальную область видимости, - // как если бы они были объявлены с var. + // как если бы они были объявлены с помощью var. function inner() { alert(prompt); } setTimeout(inner, 5000); - // setTimeout асинхронна, поэтому функция sayHelloInFiveSeconds сразу выйдет - // и тело setTimeout будет вызвано позже. Однако, поскольку внутренняя - // функция "замкнута", она по-прежнему имеет доступ к переменной prompt, - // когда sayHelloInFiveSeconds вызывется. + // setTimeout асинхронна, поэтому функция sayHelloInFiveSeconds сразу выйдет, + // после чего setTimeout вызовет функцию inner. Однако поскольку функция inner + // «замкнута» вокруг sayHelloInFiveSeconds, она по-прежнему имеет доступ к переменной prompt + // на то время, когда она наконец будет вызвана. } -sayHelloInFiveSeconds("Adam"); // откроется окно с "Hello, Adam!" через 5 секунд +sayHelloInFiveSeconds("Адам"); // Через 5 с откроется окно «Привет, Адам!» /////////////////////////////////// -// 5. Подробнее про Объекты, Конструкторы и Прототипы +// 5. Подробнее об объектах; конструкторы и прототипы // Объекты могут содержать в себе функции. var myObj = { myFunc: function() { - return "Hello world!"; + return "Привет, мир!"; } }; -myObj.myFunc(); // = "Hello world!" +myObj.myFunc(); // = "Привет, мир!" -// Когда функции, прикрепленные к объекту, вызываются, они могут получить доступ +// Когда вызываются функции, прикреплённые к объекту, они могут получить доступ // к этому объекту с помощью ключевого слова this. myObj = { - myString: "Hello world!", + myString: "Привет, мир!", myFunc: function() { return this.myString; } }; -myObj.myFunc(); // = "Hello world!" +myObj.myFunc(); // = "Привет, мир!" -// Какое это значение имеет к тому, как вызвана функция и где она определена. -// Итак, наша функция не работает, если она вызывается не в контексте объекта. +// Значение this зависит от того, как функция вызывается, +// а не от того, где она определена. Таким образом, наша функция не работает, +// если она вызывается не в контексте объекта. var myFunc = myObj.myFunc; myFunc(); // = undefined // И наоборот, функция может быть присвоена объекту и получать доступ к нему -// через this, даже если она не была присвоена при объявлении. +// через this, даже если она не была прикреплена к нему при объявлении. var myOtherFunc = function() { } myObj.myOtherFunc = myOtherFunc; -myObj.myOtherFunc(); // = "HELLO WORLD!" +myObj.myOtherFunc(); // = "ПРИВЕТ, МИР!" -// Мы можем также указать контекст для выполнения функции, когда мы вызываем ее -// с помощью call или apply. +// Мы можем также указать контекст для выполнения функции при её вызове, +// используя call или apply. var anotherFunc = function(s) { return this.myString + s; } -anotherFunc.call(myObj, " And Hello Moon!"); // = "Hello World! And Hello Moon!" +anotherFunc.call(myObj, " И привет, Луна!"); // = "Привет, мир! И привет, Луна!" -// Функция apply аналогична, но принимает массив аргументов. -anotherFunc.apply(myObj, [" And Hello Sun!"]); // = "Hello World! And Hello Sun!" +// Функция apply почти такая же, но принимает в качестве списка аргументов массив. +anotherFunc.apply(myObj, [" И привет, Солнце!"]); // = "Привет, мир! И привет, Солнце!" // Это полезно при работе с функцией, которая принимает последовательность -// аргументов, и вы хотите передать массив. +// аргументов, а вы хотите передать массив. Math.min(42, 6, 27); // = 6 -Math.min([42, 6, 27]); // = NaN (не сработает!) +Math.min([42, 6, 27]); // = NaN (Ой-ой!) Math.min.apply(Math, [42, 6, 27]); // = 6 -// Но, call и apply - временные. Когда мы хотим связать функцию, мы можем -// использовать bind. +// Но call и apply — только временные. Когда мы хотим связать функцию с объектом, +// мы можем использовать bind. var boundFunc = anotherFunc.bind(myObj); -boundFunc(" And Hello Saturn!"); // = "Hello World! And Hello Saturn!" +boundFunc(" И привет, Сатурн!"); // = "Привет, мир! И привет, Сатурн!" -// Bind также может использоваться, для частичного применения (каррирование) функции +// Bind также может использоваться для частичного применения (каррирования) функции var product = function(a, b) { return a * b; } var doubler = product.bind(this, 2); doubler(8); // = 16 -// Когда вы вызываете функцию с помощью ключевого слова new создается новый объект, -// и создает доступ к функции при помощи this. Такие функции называют конструкторами. +// Когда вы вызываете функцию с помощью ключевого слова new, создается новый объект, +// доступный функции при помощи this. Такие функции называют конструкторами. var MyConstructor = function() { this.myNumber = 5; } myNewObj = new MyConstructor(); // = {myNumber: 5} myNewObj.myNumber; // = 5 -// Каждый объект в JavaScript имеет свойтво prototype. Когда вы хотите получить -// доступ к свойтву объекта, которое не существует в этом объекте, интерпретатор +// У каждого объекта в JavaScript есть прототип. Когда вы хотите получить +// доступ к свойству объекта, которое не существует в этом объекте, интерпретатор // будет искать это свойство в прототипе. -// Некоторые реализации языка позволяют получить доступ к объекту прототипа -// через свойство __proto__. Несмотря на то, что это может быть полезно для -// понимания прототипов, это не часть стандарта; мы увидим стандартные способы +// Некоторые реализации языка позволяют получить доступ к прототипу объекта +// через «магическое» свойство __proto__. Несмотря на то, что это может быть полезно +// для понимания прототипов, это не часть стандарта; мы увидим стандартные способы // использования прототипов позже. var myObj = { - myString: "Hello world!" + myString: "Привет, мир!" }; var myPrototype = { meaningOfLife: 42, @@ -414,34 +418,34 @@ var myPrototype = { myObj.__proto__ = myPrototype; myObj.meaningOfLife; // = 42 -// Для функций это так же работает. -myObj.myFunc(); // = "hello world!" +// Для функций это тоже работает. +myObj.myFunc(); // = "Привет, мир!" -// Если интерпретатор не найдет свойство в прототипе, то продожит поиск в -// прототипе прототипа и так далее. +// Если интерпретатор не найдёт свойство в прототипе, то продожит поиск +// в прототипе прототипа и так далее. myPrototype.__proto__ = { myBoolean: true }; myObj.myBoolean; // = true // Здесь не участвует копирование; каждый объект хранит ссылку на свой прототип. -// Это означает, что мы можем изменить прототип и наши изменения будут отражены везде +// Это означает, что мы можем изменить прототип, и наши изменения будут отражены везде. myPrototype.meaningOfLife = 43; myObj.meaningOfLife; // = 43 -// Мы упомянули, что свойтсво __proto__ нестандартно, и нет никакого стандартного -// способа, чтобы изменить прототип существующего объекта. Однако, есть два +// Мы упомянули, что свойство __proto__ нестандартно, и нет никакого стандартного +// способа, чтобы изменить прототип существующего объекта. Однако есть два // способа создать новый объект с заданным прототипом. -// Первый способ это Object.create, который появился в ECMAScript 5 и есть еще -// не во всех реализациях языка. +// Первый способ — это Object.create, который появился в JavaScript недавно, +// а потому доступен ещё не во всех реализациях языка. var myObj = Object.create(myPrototype); myObj.meaningOfLife; // = 43 // Второй способ, который работает везде, имеет дело с конструкторами. -// У конструкторов есть свойство с именем prototype. Это не прототип +// У конструкторов есть свойство с именем prototype. Это *не* прототип // функции-конструктора; напротив, это прототип для новых объектов, которые -// будут созданы с помощью этого конструктора и ключевого слова new +// будут созданы с помощью этого конструктора и ключевого слова new. MyConstructor.prototype = { myNumber: 5, getMyNumber: function() { @@ -453,8 +457,8 @@ myNewObj2.getMyNumber(); // = 5 myNewObj2.myNumber = 6 myNewObj2.getMyNumber(); // = 6 -// У встроенных типов, таких как строки и числа также есть конструкторы, которые -// создают эквивалентые объекты-обертки. +// У встроенных типов, таких, как строки и числа, также есть конструкторы, которые +// создают эквивалентные объекты-обёртки. var myNumber = 12; var myNumberObj = new Number(12); myNumber == myNumberObj; // = true @@ -464,47 +468,49 @@ typeof myNumber; // = 'number' typeof myNumberObj; // = 'object' myNumber === myNumberObj; // = false if (0) { - // Этот код не выполнятся, потому что 0 - это ложь. + // Этот код не выполнится, потому что 0 - это ложь. } if (Number(0)) { - // Этот код выполнится, потому что Number(0) это истина. + // Этот код *выполнится*, потому что Number(0) истинно. } -// Впрочем, обертки это объекты и их можно расширять, например: +// Впрочем, объекты-обёртки и встроенные типы имеют общие прототипы, +// поэтому вы можете расширить функционал строк, например: String.prototype.firstCharacter = function() { return this.charAt(0); } "abc".firstCharacter(); // = "a" -// Это часто используется в полифиллах, которые реализуют новые возможности +// Это часто используется в т.н. полифилах, которые реализуют новые возможности // JavaScript в старой реализации языка, так что они могут быть использованы в -// старых средах, таких как устаревшие браузеры. +// старых средах, таких, как устаревшие браузеры. // Например, мы упомянули, что Object.create доступен не во всех реализациях, но -// мы сможем использовать его с этим полифиллом: -if (Object.create === undefined) { // не перезаписывать метод, если он существует +// мы сможем использовать его с помощью такого полифила: +if (Object.create === undefined) { // не перезаписываем метод, если он существует Object.create = function(proto) { - // создать временный конструктор с правильным прототипом + // создаём временный конструктор с правильным прототипом var Constructor = function(){}; Constructor.prototype = proto; - // затем использовать его для создания нового объекта, на основе прототипа + // затем используем его для создания нового, + // правильно прототипированного объекта return new Constructor(); } } ``` -## Что еще почитать +## Что ещё почитать -[Современный учебник JavaScript (Илья Кантор)](http://learn.javascript.ru) - +[Современный учебник JavaScript (Илья Кантор)](http://learn.javascript.ru) — качественный учебник по JavaScript на русском языке. -[Mozilla Developer Network](https://developer.mozilla.org/ru/docs/Web/JavaScript) - +[Mozilla Developer Network](https://developer.mozilla.org/ru/docs/Web/JavaScript) — предоставляет отличную документацию для JavaScript, как он используется в браузерах. Кроме того, это вики, поэтому, если вы знаете больше, вы можете помочь другим, делясь своими знаниями. -[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/ru/) - это -подробное руководство всех неинтуитивных особенностей языка. +[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/ru/) — это +подробное руководство по всем неинтуитивным особенностей языка. -[Stack Overflow](http://stackoverflow.com/questions/tagged/javascript) - можно +[Stack Overflow](http://stackoverflow.com/questions/tagged/javascript) — можно найти ответ почти на любой ваш вопрос, а если его нет, то задать вопрос самому. -- cgit v1.2.3 From d02448f78946d098ea0c906c2622bb4e16235b79 Mon Sep 17 00:00:00 2001 From: Yuichi Motoyama Date: Tue, 13 Jan 2015 09:29:15 +0900 Subject: [julia/ja] Added missing `lang: ja-jp` Sorry, I missed writing `lang: ja-jp` in #894, and made a new Julia language tree in the top page. --- ja-jp/julia-jp.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/ja-jp/julia-jp.html.markdown b/ja-jp/julia-jp.html.markdown index 0c1d7e49..0c3160a2 100644 --- a/ja-jp/julia-jp.html.markdown +++ b/ja-jp/julia-jp.html.markdown @@ -5,6 +5,7 @@ contributors: translators: - ["Yuichi Motoyama", "https://github.com/yomichi"] filename: learnjulia-jp.jl +lang: ja-jp --- Julia は科学技術計算向けに作られた、同図像性を持った(homoiconic) プログラミング言語です。 -- cgit v1.2.3 From a7918fb33c82ae350326064d74a98411e8c79995 Mon Sep 17 00:00:00 2001 From: TheDmitry Date: Tue, 13 Jan 2015 11:46:28 +0300 Subject: [brainfuck/ru] Translating Brainfuck guide into Russian --- ru-ru/brainfuck-ru.html.markdown | 83 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 ru-ru/brainfuck-ru.html.markdown diff --git a/ru-ru/brainfuck-ru.html.markdown b/ru-ru/brainfuck-ru.html.markdown new file mode 100644 index 00000000..f6e27ed2 --- /dev/null +++ b/ru-ru/brainfuck-ru.html.markdown @@ -0,0 +1,83 @@ +--- +language: brainfuck +contributors: + - ["Prajit Ramachandran", "http://prajitr.github.io/"] + - ["Mathias Bynens", "http://mathiasbynens.be/"] +translators: + - ["Dmitry Bessonov", "https://github.com/TheDmitry"] +lang: ru-ru +--- + +Brainfuck (пишется маленькими буквами, кроме начала предложения) - это очень +маленький Тьюринг-полный язык программирования лишь с 8 командами. + +``` +Любой символ игнорируется кроме "><+-.,[]" (исключая кавычки). + +Brainfuck представлен массивом из 30000 ячеек, инициализированных нулями, +и указателем, указывающего на текущую ячейку. + +Всего восемь команд: ++ : Увеличивает значение на единицу в текущей ячейке. +- : Уменьшает значение на единицу в текущей ячейке. +> : Смещает указатель данных на следующую ячейку (ячейку справа). +< : Смещает указатель данных на предыдущую ячейку (ячейку слева). +. : Печатает ASCII символ из текущей ячейки (напр. 65 = 'A'). +, : Записывает один входной символ в текущую ячейку. +[ : Если значение в текущей ячейке равно нулю, то пропустить все команды + до соответствующей ] . В противном случае, перейти к следующей инструкции. +] : Если значение в текущей ячейке равно нулю, то перейти к следующей инструкции. + В противном случае, вернуться назад к соответствующей [ . + +[ и ] образуют цикл while. Очевидно, они должны быть сбалансированы. + +Давайте рассмотрим некоторые базовые brainfuck программы. + +++++++ [ > ++++++++++ < - ] > +++++ . + +Эта программа выводит букву 'A'. Сначала, программа увеличивает значение +ячейки №1 до 6. Ячейка #1 будет использоваться циклом. Затем, программа входит +в цикл ([) и переходит к ячейке №2. Ячейка №2 увеличивается до 10, переходим +назад к ячейке №1 и уменьшаем ячейку №1. Этот цикл проходит 6 раз (ячейка №1 +уменьшается до нуля, и с этого места пропускает инструкции до соответствующей ] +и идет дальше). + +В этот момент, мы в ячейке №1, которая имеет значение 0, значение ячейки №2 +пока 60. Мы переходим на ячейку №2, увеличиваем 5 раз, до значения 65, и затем +выводим значение ячейки №2. Код 65 является символом 'A' в кодировке ASCII, +так что 'A' выводится на терминал. + + +, [ > + < - ] > . + +Данная программа считывает символ из пользовательского ввода и копирует символ +в ячейку №1. Затем мы начинаем цикл. Переходим к ячейке №2, увеличиваем значение +ячейки №2, идем назад к ячейке №1 и уменьшаем значение ячейки №1. Это продолжается +до тех пор пока, ячейка №1 не равна 0, а ячейка №2 сохраняет старое значение +ячейки №1. Мы завершаем цикл на ячейке №1, поэтому переходим в ячейку №2, и +затем выводим символ ASCII. + +Также, имейте в виду, что пробелы здесь исключительно для читабельности. Вы можете +легко написать и так: + +,[>+<-]>. + +Попытайтесь разгадать, что следующая программа делает: + +,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >> + +Программа принимает два числа на вход и умножает их. + +Суть в том, что программа сначала читает два ввода. Затем начинается внешний цикл, +сохраняя ячейку №1. Затем программа перемещается в ячейку №2, и начинается +внутренний цикл с сохранением ячейки №2, увеличивая ячейку №3. Однако появляется +проблема: В конце внутреннего цикла, ячейка №2 равна нулю. В этом случае, +внутренний цикл не будет работать уже в следующий раз. Чтобы решить эту проблему, +мы также увеличим ячейку №4, а затем копируем ячейку №4 в ячейку №2. +Итак, ячейка №3 - результат. +``` + +Это и есть brainfuck. Не так уж сложно, правда? Забавы ради, вы можете написать +свою собственную brainfuck программу или интерпретатор на другом языке. +Интерпретатор достаточно легко реализовать, но если вы мазохист, попробуйте +написать brainfuck интерпретатор... на языке brainfuck. -- cgit v1.2.3 From dd5588a2194b4e1f98fc4cee8a2fc277f6eae2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Ara=C3=BAjo?= Date: Tue, 13 Jan 2015 10:26:08 -0300 Subject: [C++/en] translated to [C++/pt-br] --- pt-br/c++-pt.html.markdown | 591 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 591 insertions(+) create mode 100644 pt-br/c++-pt.html.markdown diff --git a/pt-br/c++-pt.html.markdown b/pt-br/c++-pt.html.markdown new file mode 100644 index 00000000..243627cb --- /dev/null +++ b/pt-br/c++-pt.html.markdown @@ -0,0 +1,591 @@ +--- +language: c++ +filename: learncpp.cpp +contributors: + - ["Steven Basart", "http://github.com/xksteven"] + - ["Matt Kline", "https://github.com/mrkline"] +translators: + - ["Miguel Araújo", "https://github.com/miguelarauj1o"] +lang: pt-br +--- + +C++ é uma linguagem de programação de sistemas que, +C++ is a systems programming language that, +[de acordo com seu inventor Bjarne Stroustrup](http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2014/Keynote), +foi concebida para + +- ser um "C melhor" +- suportar abstração de dados +- suportar programação orientada a objetos +- suportar programação genérica + +Embora sua sintaxe pode ser mais difícil ou complexa do que as linguagens mais +recentes, C++ é amplamente utilizado porque compila para instruções nativas que +podem ser executadas diretamente pelo processador e oferece um controlo rígido sobre hardware (como C), enquanto oferece recursos de alto nível, como os +genéricos, exceções e classes. Esta combinação de velocidade e funcionalidade +faz C++ uma das linguagens de programação mais utilizadas. + +```c++ +////////////////// +// Comparação com C +////////////////// + +// C ++ é quase um super conjunto de C e compartilha sua sintaxe básica para +// declarações de variáveis, tipos primitivos, e funções. No entanto, C++ varia +// em algumas das seguintes maneiras: + +// A função main() em C++ deve retornar um int, embora void main() é aceita +// pela maioria dos compiladores (gcc, bumbum, etc.) +// Este valor serve como o status de saída do programa. +// Veja http://en.wikipedia.org/wiki/Exit_status para mais informações. + +int main(int argc, char** argv) +{ + // Argumentos de linha de comando são passados em pelo argc e argv da mesma + // forma que eles estão em C. + // argc indica o número de argumentos, + // e argv é um array de strings, feito C (char*) representado os argumentos + // O primeiro argumento é o nome pelo qual o programa foi chamado. + // argc e argv pode ser omitido se você não se importa com argumentos, + // dando a assinatura da função de int main() + + // Uma saída de status de 0 indica sucesso. + return 0; +} + +// Em C++, caracteres literais são um byte. +sizeof('c') == 1 + +// Em C, caracteres literais são do mesmo tamanho que ints. +sizeof('c') == sizeof(10) + +// C++ tem prototipagem estrita +void func(); // função que não aceita argumentos + +// Em C +void func(); // função que pode aceitar qualquer número de argumentos + +// Use nullptr em vez de NULL em C++ +int* ip = nullptr; + +// Cabeçalhos padrão C estão disponíveis em C++, +// mas são prefixados com "c" e não têm sufixo .h + +#include + +int main() +{ + printf("Hello, world!\n"); + return 0; +} + +/////////////////////// +// Sobrecarga de função +/////////////////////// + +// C++ suporta sobrecarga de função +// desde que cada função tenha parâmetros diferentes. + +void print(char const* myString) +{ + printf("String %s\n", myString); +} + +void print(int myInt) +{ + printf("My int is %d", myInt); +} + +int main() +{ + print("Hello"); // Funciona para void print(const char*) + print(15); // Funciona para void print(int) +} + +///////////////////////////// +// Parâmetros padrão de função +///////////////////////////// + +// Você pode fornecer argumentos padrões para uma função se eles não são +// fornecidos pelo chamador. + +void doSomethingWithInts(int a = 1, int b = 4) +{ + // Faça alguma coisa com os ints aqui +} + +int main() +{ + doSomethingWithInts(); // a = 1, b = 4 + doSomethingWithInts(20); // a = 20, b = 4 + doSomethingWithInts(20, 5); // a = 20, b = 5 +} + +// Argumentos padrões devem estar no final da lista de argumentos. + +void invalidDeclaration(int a = 1, int b) // Erro! +{ +} + + +///////////// +// Namespaces (nome de espaços) +///////////// + +// Namespaces fornecem escopos distintos para variável, função e outras +// declarações. Namespaces podem estar aninhados. + +namespace First { + namespace Nested { + void foo() + { + printf("This is First::Nested::foo\n"); + } + } // Fim do namespace aninhado +} // Fim do namespace First + +namespace Second { + void foo() + { + printf("This is Second::foo\n") + } +} + +void foo() +{ + printf("This is global foo\n"); +} + +int main() +{ + // Assuma que tudo é do namespace "Second" a menos que especificado de + // outra forma. + using namespace Second; + + foo(); // imprime "This is Second::foo" + First::Nested::foo(); // imprime "This is First::Nested::foo" + ::foo(); // imprime "This is global foo" +} + +/////////////// +// Entrada/Saída +/////////////// + +// C ++ usa a entrada e saída de fluxos (streams) +// cin, cout, and cerr representa stdin, stdout, and stderr. +// << É o operador de inserção e >> é o operador de extração. + +#include // Inclusão para o I/O streams + +using namespace std; // Streams estão no namespace std (biblioteca padrão) + +int main() +{ + int myInt; + + // Imprime na saída padrão (ou terminal/tela) + cout << "Enter your favorite number:\n"; + // Pega a entrada + cin >> myInt; + + // cout também pode ser formatado + cout << "Your favorite number is " << myInt << "\n"; + // imprime "Your favorite number is " + + cerr << "Usado para mensagens de erro"; +} + +////////// +// Strings +////////// + +// Strings em C++ são objetos e têm muitas funções de membro +#include + +using namespace std; // Strings também estão no namespace std (bib. padrão) + +string myString = "Hello"; +string myOtherString = " World"; + +// + é usado para concatenação. +cout << myString + myOtherString; // "Hello World" + +cout << myString + " You"; // "Hello You" + +// Em C++, strings são mutáveis e têm valores semânticos. +myString.append(" Dog"); +cout << myString; // "Hello Dog" + + +///////////// +// Referência +///////////// + +// Além de indicadores como os de C, C++ têm _referências_. Esses são tipos de +// ponteiro que não pode ser reatribuída uma vez definidos e não pode ser nulo. +// Eles também têm a mesma sintaxe que a própria variável: Não * é necessário +// para _dereferencing_ e & (endereço de) não é usado para atribuição. + +using namespace std; + +string foo = "I am foo"; +string bar = "I am bar"; + + +string& fooRef = foo; // Isso cria uma referência para foo. +fooRef += ". Hi!"; // Modifica foo através da referência +cout << fooRef; // Imprime "I am foo. Hi!" + +// Não realocar "fooRef". Este é o mesmo que "foo = bar", e foo == "I am bar" +// depois desta linha. + +fooRef = bar; + +const string& barRef = bar; // Cria uma referência const para bar. +// Como C, valores const (e ponteiros e referências) não podem ser modificado. +barRef += ". Hi!"; // Erro, referência const não pode ser modificada. + +////////////////////////////////////////// +// Classes e programação orientada a objeto +////////////////////////////////////////// + +// Primeiro exemplo de classes +#include + +// Declara a classe. +// As classes são geralmente declarado no cabeçalho arquivos (.h ou .hpp). +class Dog { + // Variáveis de membro e funções são privadas por padrão. + std::string name; + int weight; + +// Todos os membros a seguir este são públicos até que "private:" ou +// "protected:" é encontrado. +public: + + // Construtor padrão + Dog(); + + // Declarações de função Membro (implementações a seguir) + // Note que usamos std :: string aqui em vez de colocar + // using namespace std; + // acima. + // Nunca coloque uma declaração "using namespace" em um cabeçalho. + void setName(const std::string& dogsName); + + void setWeight(int dogsWeight); + + // Funções que não modificam o estado do objecto devem ser marcadas como + // const. Isso permite que você chamá-los se for dada uma referência const + // para o objeto. Além disso, observe as funções devem ser explicitamente + // declarados como _virtual_, a fim de ser substituídas em classes + // derivadas. As funções não são virtuais por padrão por razões de + // performance. + + virtual void print() const; + + // As funções também podem ser definidas no interior do corpo da classe. + // Funções definidas como tal são automaticamente embutidas. + void bark() const { std::cout << name << " barks!\n" } + + // Junto com os construtores, C++ fornece destruidores. + // Estes são chamados quando um objeto é excluído ou fica fora do escopo. + // Isto permite paradigmas poderosos, como RAII + // (veja abaixo) + // Destruidores devem ser virtual para permitir que as classes de ser + // derivada desta. + virtual ~Dog(); + +}; // Um ponto e vírgula deve seguir a definição de classe. + +// Funções membro da classe geralmente são implementados em arquivos .cpp. +void Dog::Dog() +{ + std::cout << "A dog has been constructed\n"; +} + +// Objetos (como strings) devem ser passados por referência +// se você está modificando-os ou referência const se você não é. +void Dog::setName(const std::string& dogsName) +{ + name = dogsName; +} + +void Dog::setWeight(int dogsWeight) +{ + weight = dogsWeight; +} + +// Observe que "virtual" só é necessária na declaração, não a definição. +void Dog::print() const +{ + std::cout << "Dog is " << name << " and weighs " << weight << "kg\n"; +} + +void Dog::~Dog() +{ + cout << "Goodbye " << name << "\n"; +} + +int main() { + Dog myDog; // imprime "A dog has been constructed" + myDog.setName("Barkley"); + myDog.setWeight(10); + myDog.printDog(); // imprime "Dog is Barkley and weighs 10 kg" + return 0; +} // imprime "Goodbye Barkley" + +// herança: + +// Essa classe herda tudo público e protegido da classe Dog +class OwnedDog : public Dog { + + void setOwner(const std::string& dogsOwner) + + // Substituir o comportamento da função de impressão de todas OwnedDogs. + // Ver http://en.wikipedia.org/wiki/Polymorphism_(computer_science)#Subtyping + // Para uma introdução mais geral, se você não estiver familiarizado com o + // polimorfismo subtipo. A palavra-chave override é opcional, mas torna-se + // na verdade você está substituindo o método em uma classe base. + void print() const override; + +private: + std::string owner; +}; + +// Enquanto isso, no arquivo .cpp correspondente: + +void OwnedDog::setOwner(const std::string& dogsOwner) +{ + owner = dogsOwner; +} + +void OwnedDog::print() const +{ + Dog::print(); // Chame a função de impressão na classe Dog base de + std::cout << "Dog is owned by " << owner << "\n"; + // Prints "Dog is and weights " + // "Dog is owned by " +} + +////////////////////////////////////////// +// Inicialização e Sobrecarga de Operadores +////////////////////////////////////////// + +// Em C ++, você pode sobrecarregar o comportamento dos operadores, tais como +// +, -, *, /, etc. Isto é feito através da definição de uma função que é +// chamado sempre que o operador é usado. + +#include +using namespace std; + +class Point { +public: + // Variáveis membro pode ser dado valores padrão desta maneira. + double x = 0; + double y = 0; + + // Define um construtor padrão que não faz nada + // mas inicializar o Point para o valor padrão (0, 0) + Point() { }; + + // A sintaxe a seguir é conhecido como uma lista de inicialização + // e é a maneira correta de inicializar os valores de membro de classe + Point (double a, double b) : + x(a), + y(b) + { /* Não fazer nada, exceto inicializar os valores */ } + + // Sobrecarrega o operador +. + Point operator+(const Point& rhs) const; + + // Sobrecarregar o operador +=. + Point& operator+=(const Point& rhs); + + // Ele também faria sentido para adicionar os operadores - e -=, + // mas vamos pular para sermos breves. +}; + +Point Point::operator+(const Point& rhs) const +{ + // Criar um novo ponto que é a soma de um e rhs. + return Point(x + rhs.x, y + rhs.y); +} + +Point& Point::operator+=(const Point& rhs) +{ + x += rhs.x; + y += rhs.y; + return *this; +} + +int main () { + Point up (0,1); + Point right (1,0); + // Isto chama que o operador ponto + + // Ressalte-se a chamadas (função)+ com direito como seu parâmetro... + Point result = up + right; + // Imprime "Result is upright (1,1)" + cout << "Result is upright (" << result.x << ',' << result.y << ")\n"; + return 0; +} + +///////////////////////// +// Tratamento de Exceções +///////////////////////// + +// A biblioteca padrão fornece alguns tipos de exceção +// (see http://en.cppreference.com/w/cpp/error/exception) +// mas qualquer tipo pode ser jogado como uma exceção +#include + +// Todas as exceções lançadas dentro do bloco try pode ser capturado por +// manipuladores de captura subseqüentes +try { + // Não aloca exceções no heap usando _new_. + throw std::exception("A problem occurred"); +} +// Capturar exceções por referência const se eles são objetos +catch (const std::exception& ex) +{ + std::cout << ex.what(); +// Captura qualquer exceção não capturada pelos blocos _catch_ anteriores +} catch (...) +{ + std::cout << "Exceção desconhecida encontrada"; + throw; // Re-lança a exceção +} + +/////// +// RAII +/////// + +// RAII significa alocação de recursos é de inicialização. +// Muitas vezes, é considerado o paradigma mais poderoso em C++, e é o +// conceito simples que um construtor para um objeto adquire recursos daquele +// objeto e o destruidor liberá-los. + +// Para entender como isso é útil, +// Considere uma função que usa um identificador de arquivo C: +void doSomethingWithAFile(const char* filename) +{ + // Para começar, assuma que nada pode falhar. + + FILE* fh = fopen(filename, "r"); // Abra o arquivo em modo de leitura. + + doSomethingWithTheFile(fh); + doSomethingElseWithIt(fh); + + fclose(fh); // Feche o arquivo. +} + +// Infelizmente, as coisas são levemente complicadas para tratamento de erros. +// Suponha que fopen pode falhar, e que doSomethingWithTheFile e +// doSomethingElseWithIt retornam códigos de erro se eles falharem. (As +// exceções são a forma preferida de lidar com o fracasso, mas alguns +// programadores, especialmente aqueles com um conhecimento em C, discordam +// sobre a utilidade de exceções). Agora temos que verificar cada chamada para +// o fracasso e fechar o identificador de arquivo se ocorreu um problema. + +bool doSomethingWithAFile(const char* filename) +{ + FILE* fh = fopen(filename, "r"); // Abra o arquivo em modo de leitura + if (fh == nullptr) // O ponteiro retornado é nulo em caso de falha. + reuturn false; // Relate o fracasso para o chamador. + + // Suponha cada função retorne false, se falhar + if (!doSomethingWithTheFile(fh)) { + fclose(fh); // Feche o identificador de arquivo para que ele não vaze. + return false; // Propague o erro. + } + if (!doSomethingElseWithIt(fh)) { + fclose(fh); // Feche o identificador de arquivo para que ele não vaze. + return false; // Propague o erro. + } + + fclose(fh); // Feche o identificador de arquivo para que ele não vaze. + return true; // Indica sucesso +} + +// Programadores C frequentemente limpam isso um pouco usando Goto: +bool doSomethingWithAFile(const char* filename) +{ + FILE* fh = fopen(filename, "r"); + if (fh == nullptr) + reuturn false; + + if (!doSomethingWithTheFile(fh)) + goto failure; + + if (!doSomethingElseWithIt(fh)) + goto failure; + + fclose(fh); // Close the file + return true; // Indica sucesso + +failure: + fclose(fh); + return false; // Propague o erro. +} + +// Se as funções indicam erros usando exceções, +// as coisas são um pouco mais limpo, mas ainda abaixo do ideal. +void doSomethingWithAFile(const char* filename) +{ + FILE* fh = fopen(filename, "r"); // Abra o arquivo em modo de leitura. + if (fh == nullptr) + throw std::exception("Não pode abrir o arquivo."); + + try { + doSomethingWithTheFile(fh); + doSomethingElseWithIt(fh); + } + catch (...) { + fclose(fh); // Certifique-se de fechar o arquivo se ocorrer um erro. + throw; // Em seguida, re-lance a exceção. + } + + fclose(fh); // Feche o arquivo + // Tudo ocorreu com sucesso! +} + +// Compare isso com o uso de C++ classe fluxo de arquivo (fstream) fstream usa +// seu destruidor para fechar o arquivo. Lembre-se de cima que destruidores são +// automaticamente chamado sempre que um objeto cai fora do âmbito. +void doSomethingWithAFile(const std::string& filename) +{ + // ifstream é curto para o fluxo de arquivo de entrada + std::ifstream fh(filename); // Abra o arquivo + + // faça alguma coisa com o arquivo + doSomethingWithTheFile(fh); + doSomethingElseWithIt(fh); + +} // O arquivo é automaticamente fechado aqui pelo destructor + +// Isto tem _grandes_ vantagens: +// 1. Não importa o que aconteça, +// o recurso (neste caso, o identificador de ficheiro) irá ser limpo. +// Depois de escrever o destruidor corretamente, +// É _impossível_ esquecer de fechar e vazar o recurso +// 2. Nota-se que o código é muito mais limpo. +// As alças destructor fecham o arquivo por trás das cenas +// sem que você precise se preocupar com isso. +// 3. O código é seguro de exceção. +// Uma exceção pode ser jogado em qualquer lugar na função e a limpeza +// irá ainda ocorrer. + +// Todos códigos C++ usam RAII extensivamente para todos os recursos. +// Outros exemplos incluem +// - Memória usa unique_ptr e shared_ptr +// - Contentores - a lista da biblioteca ligada padrão, +// vetor (i.e. array de autodimensionamento), mapas hash, e assim por diante +// tudo é automaticamente destruído quando eles saem de escopo +// - Mutex usa lock_guard e unique_lock +``` +Leitura Adicional: + +Uma referência atualizada da linguagem pode ser encontrada em + + +Uma fonte adicional pode ser encontrada em \ No newline at end of file -- cgit v1.2.3 From 4fc9c89f64e64c3dce19eec7adecd4efb009c162 Mon Sep 17 00:00:00 2001 From: TheDmitry Date: Tue, 13 Jan 2015 19:19:24 +0300 Subject: Fix small mistackes. --- ru-ru/brainfuck-ru.html.markdown | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ru-ru/brainfuck-ru.html.markdown b/ru-ru/brainfuck-ru.html.markdown index f6e27ed2..500ac010 100644 --- a/ru-ru/brainfuck-ru.html.markdown +++ b/ru-ru/brainfuck-ru.html.markdown @@ -12,10 +12,10 @@ Brainfuck (пишется маленькими буквами, кроме нач маленький Тьюринг-полный язык программирования лишь с 8 командами. ``` -Любой символ игнорируется кроме "><+-.,[]" (исключая кавычки). +Любой символ, кроме "><+-.,[]", игнорируется, за исключением кавычек. Brainfuck представлен массивом из 30000 ячеек, инициализированных нулями, -и указателем, указывающего на текущую ячейку. +и указателем с позицией в текущей ячейке. Всего восемь команд: + : Увеличивает значение на единицу в текущей ячейке. @@ -29,22 +29,22 @@ Brainfuck представлен массивом из 30000 ячеек, ини ] : Если значение в текущей ячейке равно нулю, то перейти к следующей инструкции. В противном случае, вернуться назад к соответствующей [ . -[ и ] образуют цикл while. Очевидно, они должны быть сбалансированы. +[ и ] образуют цикл while. Естественно, они должны быть сбалансированы. -Давайте рассмотрим некоторые базовые brainfuck программы. +Давайте рассмотрим некоторые базовые brainfuck-программы. ++++++ [ > ++++++++++ < - ] > +++++ . -Эта программа выводит букву 'A'. Сначала, программа увеличивает значение -ячейки №1 до 6. Ячейка #1 будет использоваться циклом. Затем, программа входит +Эта программа выводит букву 'A'. Сначала программа увеличивает значение +ячейки №1 до 6. Ячейка №1 будет использоваться циклом. Затем программа входит в цикл ([) и переходит к ячейке №2. Ячейка №2 увеличивается до 10, переходим назад к ячейке №1 и уменьшаем ячейку №1. Этот цикл проходит 6 раз (ячейка №1 уменьшается до нуля, и с этого места пропускает инструкции до соответствующей ] и идет дальше). -В этот момент, мы в ячейке №1, которая имеет значение 0, значение ячейки №2 -пока 60. Мы переходим на ячейку №2, увеличиваем 5 раз, до значения 65, и затем -выводим значение ячейки №2. Код 65 является символом 'A' в кодировке ASCII, +В этот момент мы находимся в ячейке №1, которая имеет значение 0, значение +ячейки №2 пока 60. Мы переходим на ячейку №2, увеличиваем 5 раз, до значения 65, +и затем выводим значение ячейки №2. Код 65 является символом 'A' в кодировке ASCII, так что 'A' выводится на терминал. @@ -53,11 +53,11 @@ Brainfuck представлен массивом из 30000 ячеек, ини Данная программа считывает символ из пользовательского ввода и копирует символ в ячейку №1. Затем мы начинаем цикл. Переходим к ячейке №2, увеличиваем значение ячейки №2, идем назад к ячейке №1 и уменьшаем значение ячейки №1. Это продолжается -до тех пор пока, ячейка №1 не равна 0, а ячейка №2 сохраняет старое значение -ячейки №1. Мы завершаем цикл на ячейке №1, поэтому переходим в ячейку №2, и +до тех пор, пока ячейка №1 не равна 0, а ячейка №2 сохраняет старое значение +ячейки №1. Мы завершаем цикл на ячейке №1, поэтому переходим в ячейку №2 и затем выводим символ ASCII. -Также, имейте в виду, что пробелы здесь исключительно для читабельности. Вы можете +Также имейте в виду, что пробелы здесь исключительно для читабельности. Вы можете легко написать и так: ,[>+<-]>. @@ -71,13 +71,13 @@ Brainfuck представлен массивом из 30000 ячеек, ини Суть в том, что программа сначала читает два ввода. Затем начинается внешний цикл, сохраняя ячейку №1. Затем программа перемещается в ячейку №2, и начинается внутренний цикл с сохранением ячейки №2, увеличивая ячейку №3. Однако появляется -проблема: В конце внутреннего цикла, ячейка №2 равна нулю. В этом случае, +проблема: В конце внутреннего цикла ячейка №2 равна нулю. В этом случае, внутренний цикл не будет работать уже в следующий раз. Чтобы решить эту проблему, мы также увеличим ячейку №4, а затем копируем ячейку №4 в ячейку №2. Итак, ячейка №3 - результат. ``` Это и есть brainfuck. Не так уж сложно, правда? Забавы ради, вы можете написать -свою собственную brainfuck программу или интерпретатор на другом языке. +свою собственную brainfuck-программу или интерпретатор на другом языке. Интерпретатор достаточно легко реализовать, но если вы мазохист, попробуйте -написать brainfuck интерпретатор... на языке brainfuck. +написать brainfuck-интерпретатор... на языке brainfuck. -- cgit v1.2.3 From dff86ae3cb5618609f8238cca20c2493b5ffc240 Mon Sep 17 00:00:00 2001 From: Adam Bard Date: Tue, 13 Jan 2015 20:09:14 +0000 Subject: Update common-lisp-pt.html.markdown --- pt-br/common-lisp-pt.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/pt-br/common-lisp-pt.html.markdown b/pt-br/common-lisp-pt.html.markdown index ce654846..03a7c15c 100644 --- a/pt-br/common-lisp-pt.html.markdown +++ b/pt-br/common-lisp-pt.html.markdown @@ -5,6 +5,7 @@ contributors: - ["Paul Nathan", "https://github.com/pnathan"] translators: - ["Édipo Luis Féderle", "https://github.com/edipofederle"] +lang: pt-br --- ANSI Common Lisp é uma linguagem de uso geral, multi-paradigma, designada -- cgit v1.2.3 From ecc5d89841ec2417c8d68f0c84347760cf69c140 Mon Sep 17 00:00:00 2001 From: P1start Date: Thu, 15 Jan 2015 15:14:19 +1300 Subject: [rust/en] Update the Rust tutorial This adjusts the English Rust tutorial for changes to the language and generally tweaks a few other things. Fixes #860. --- rust.html.markdown | 169 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 102 insertions(+), 67 deletions(-) diff --git a/rust.html.markdown b/rust.html.markdown index 3717a7d9..dcb54733 100644 --- a/rust.html.markdown +++ b/rust.html.markdown @@ -7,9 +7,13 @@ filename: learnrust.rs Rust is an in-development programming language developed by Mozilla Research. It is relatively unique among systems languages in that it can assert memory -safety *at compile time*. Rust’s first alpha release occurred in January -2012, and development moves so quickly that at the moment the use of stable -releases is discouraged, and instead one should use nightly builds. +safety *at compile time* without resorting to garbage collection. Rust’s first +release, 0.1, occurred in January 2012, and development moves so quickly that at +the moment the use of stable releases is discouraged, and instead one should use +nightly builds. On January 9 2015, Rust 1.0 Alpha was released, and the rate of +changes to the Rust compiler that break existing code has dropped significantly +since. However, a complete guarantee of backward compatibility will not exist +until the final 1.0 release. Although Rust is a relatively low-level language, Rust has some functional concepts that are generally found in higher-level languages. This makes @@ -24,7 +28,8 @@ Rust not only fast, but also easy and efficient to code in. /////////////// // Functions -fn add2(x: int, y: int) -> int { +// `i32` is the type for 32-bit signed integers +fn add2(x: i32, y: i32) -> i32 { // Implicit return (no semicolon) x + y } @@ -34,71 +39,90 @@ fn main() { // Numbers // // Immutable bindings - let x: int = 1; + let x: i32 = 1; // Integer/float suffixes - let y: int = 13i; + let y: i32 = 13i32; let f: f64 = 1.3f64; // Type inference - let implicit_x = 1i; - let implicit_f = 1.3f64; + // Most of the time, the Rust compiler can infer what type a variable is, so + // you don’t have to write an explicit type annotation. + // Throughout this tutorial, types are explicitly annotated in many places, + // but only for demonstrative purposes. Type inference can handle this for + // you most of the time. + let implicit_x = 1; + let implicit_f = 1.3; - // Maths - let sum = x + y + 13i; + // Arithmetic + let sum = x + y + 13; // Mutable variable let mut mutable = 1; + mutable = 4; mutable += 2; // Strings // - + // String literals - let x: &'static str = "hello world!"; + let x: &str = "hello world!"; // Printing println!("{} {}", f, x); // 1.3 hello world - // A `String` - a heap-allocated string + // A `String` – a heap-allocated string let s: String = "hello world".to_string(); - // A string slice - an immutable view into another string - // This is basically an immutable pointer to a string - it doesn’t - // actually contain the characters of a string, just a pointer to + // A string slice – an immutable view into another string + // This is basically an immutable pointer to a string – it doesn’t + // actually contain the contents of a string, just a pointer to // something that does (in this case, `s`) - let s_slice: &str = s.as_slice(); + let s_slice: &str = &*s; println!("{} {}", s, s_slice); // hello world hello world // Vectors/arrays // // A fixed-size array - let four_ints: [int, ..4] = [1, 2, 3, 4]; + let four_ints: [i32; 4] = [1, 2, 3, 4]; - // A dynamically-sized vector - let mut vector: Vec = vec![1, 2, 3, 4]; + // A dynamic array (vector) + let mut vector: Vec = vec![1, 2, 3, 4]; vector.push(5); - // A slice - an immutable view into a vector or array + // A slice – an immutable view into a vector or array // This is much like a string slice, but for vectors - let slice: &[int] = vector.as_slice(); + let slice: &[i32] = &*vector; + + // Use `{:?}` to print something debug-style + println!("{:?} {:?}", vector, slice); // [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] + + // Tuples // - println!("{} {}", vector, slice); // [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] + // A tuple is a fixed-size set of values of possibly different types + let x: (i32, &str, f64) = (1, "hello", 3.4); + + // Destructuring `let` + let (a, b, c) = x; + println!("{} {} {}", a, b, c); // 1 hello 3.4 + + // Indexing + println!("{}", x.1); // hello ////////////// // 2. Types // ////////////// - + // Struct struct Point { - x: int, - y: int, + x: i32, + y: i32, } let origin: Point = Point { x: 0, y: 0 }; - // Tuple struct - struct Point2(int, int); + // A struct with unnamed fields, called a ‘tuple struct’ + struct Point2(i32, i32); let origin2 = Point2(0, 0); @@ -110,16 +134,16 @@ fn main() { Down, } - let up = Up; + let up = Direction::Up; // Enum with fields - enum OptionalInt { - AnInt(int), + enum OptionalI32 { + AnI32(i32), Nothing, } - let two: OptionalInt = AnInt(2); - let nothing: OptionalInt = Nothing; + let two: OptionalI32 = OptionalI32::AnI32(2); + let nothing = OptionalI32::Nothing; // Generics // @@ -140,10 +164,10 @@ fn main() { } } - let a_foo = Foo { bar: 1i }; + let a_foo = Foo { bar: 1 }; println!("{}", a_foo.get_bar()); // 1 - // Traits (interfaces) // + // Traits (known as interfaces or typeclasses in other languages) // trait Frobnicate { fn frobnicate(self) -> Option; @@ -155,30 +179,31 @@ fn main() { } } - println!("{}", a_foo.frobnicate()); // Some(1) + let another_foo = Foo { bar: 1 }; + println!("{:?}", another_foo.frobnicate()); // Some(1) ///////////////////////// // 3. Pattern matching // ///////////////////////// - - let foo = AnInt(1); + + let foo = OptionalI32::AnI32(1); match foo { - AnInt(n) => println!("it’s an int: {}", n), - Nothing => println!("it’s nothing!"), + OptionalI32::AnI32(n) => println!("it’s an i32: {}", n), + OptionalI32::Nothing => println!("it’s nothing!"), } // Advanced pattern matching - struct FooBar { x: int, y: OptionalInt } - let bar = FooBar { x: 15, y: AnInt(32) }; + struct FooBar { x: i32, y: OptionalI32 } + let bar = FooBar { x: 15, y: OptionalI32::AnI32(32) }; match bar { - FooBar { x: 0, y: AnInt(0) } => + FooBar { x: 0, y: OptionalI32::AnI32(0) } => println!("The numbers are zero!"), - FooBar { x: n, y: AnInt(m) } if n == m => + FooBar { x: n, y: OptionalI32::AnI32(m) } if n == m => println!("The numbers are the same"), - FooBar { x: n, y: AnInt(m) } => + FooBar { x: n, y: OptionalI32::AnI32(m) } => println!("Different numbers: {} {}", n, m), - FooBar { x: _, y: Nothing } => + FooBar { x: _, y: OptionalI32::Nothing } => println!("The second number is Nothing!"), } @@ -187,19 +212,20 @@ fn main() { ///////////////////// // `for` loops/iteration - let array = [1i, 2, 3]; + let array = [1, 2, 3]; for i in array.iter() { println!("{}", i); } - for i in range(0u, 10) { + // Ranges + for i in 0u32..10 { print!("{} ", i); } println!(""); // prints `0 1 2 3 4 5 6 7 8 9 ` // `if` - if 1i == 1 { + if 1 == 1 { println!("Maths is working!"); } else { println!("Oh no..."); @@ -213,7 +239,7 @@ fn main() { }; // `while` loop - while 1i == 1 { + while 1 == 1 { println!("The universe is operating normally."); } @@ -225,40 +251,49 @@ fn main() { ///////////////////////////////// // 5. Memory safety & pointers // ///////////////////////////////// - - // Owned pointer - only one thing can ‘own’ this pointer at a time - let mut mine: Box = box 3; + + // Owned pointer – only one thing can ‘own’ this pointer at a time + // This means that when the `Box` leaves its scope, it can be automatically deallocated safely. + let mut mine: Box = Box::new(3); *mine = 5; // dereference + // Here, `now_its_mine` takes ownership of `mine`. In other words, `mine` is moved. let mut now_its_mine = mine; *now_its_mine += 2; + println!("{}", now_its_mine); // 7 - // println!("{}", mine); // this would error + // println!("{}", mine); // this would not compile because `now_its_mine` now owns the pointer - // Reference - an immutable pointer that refers to other data - let mut var = 4i; + // Reference – an immutable pointer that refers to other data + // When a reference is taken to a value, we say that the value has been ‘borrowed’. + // While a value is borrowed immutably, it cannot be mutated or moved. + // A borrow lasts until the end of the scope it was created in. + let mut var = 4; var = 3; - let ref_var: &int = &var; + let ref_var: &i32 = &var; + println!("{}", var); // Unlike `box`, `var` can still be used println!("{}", *ref_var); - // var = 5; // this would error - // *ref_var = 6; // this would too + // var = 5; // this would not compile because `var` is borrowed + // *ref_var = 6; // this would too, because `ref_var` is an immutable reference // Mutable reference - let mut var2 = 4i; - let ref_var2: &mut int = &mut var2; + // While a value is mutably borrowed, it cannot be accessed at all. + let mut var2 = 4; + let ref_var2: &mut i32 = &mut var2; *ref_var2 += 2; + println!("{}", *ref_var2); // 6 - // var2 = 2; // this would error + // var2 = 2; // this would not compile because `var2` is borrowed } ``` ## Further reading -There’s a lot more to Rust—this is just the basics of Rust so you can -understand the most important things. To learn more about Rust, read [The Rust -Guide](http://doc.rust-lang.org/guide.html) and check out the -[/r/rust](http://reddit.com/r/rust) subreddit. The folks on the #rust channel -on irc.mozilla.org are also always keen to help newcomers. +There’s a lot more to Rust—this is just the basics of Rust so you can understand +the most important things. To learn more about Rust, read [The Rust Programming +Language](http://doc.rust-lang.org/book/index.html) and check out the +[/r/rust](http://reddit.com/r/rust) subreddit. The folks on the #rust channel on +irc.mozilla.org are also always keen to help newcomers. You can also try out features of Rust with an online compiler at the official [Rust playpen](http://play.rust-lang.org) or on the main -- cgit v1.2.3 From 9f765b9c7b0b207b51b914161313fdb7ecadaa5c Mon Sep 17 00:00:00 2001 From: Suzane Sant Ana Date: Sat, 17 Jan 2015 09:17:39 -0200 Subject: removing a piece in english in pt-br translation --- pt-br/c++-pt.html.markdown | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pt-br/c++-pt.html.markdown b/pt-br/c++-pt.html.markdown index 243627cb..61625ebe 100644 --- a/pt-br/c++-pt.html.markdown +++ b/pt-br/c++-pt.html.markdown @@ -9,8 +9,7 @@ translators: lang: pt-br --- -C++ é uma linguagem de programação de sistemas que, -C++ is a systems programming language that, +C++ é uma linguagem de programação de sistemas que, [de acordo com seu inventor Bjarne Stroustrup](http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2014/Keynote), foi concebida para @@ -588,4 +587,4 @@ Leitura Adicional: Uma referência atualizada da linguagem pode ser encontrada em -Uma fonte adicional pode ser encontrada em \ No newline at end of file +Uma fonte adicional pode ser encontrada em -- cgit v1.2.3 From 3fa59915d0e30b5b0f08bea5e1a62b73f4250ebb Mon Sep 17 00:00:00 2001 From: yelite Date: Sun, 18 Jan 2015 16:06:48 +0800 Subject: Update swift.html.markdown --- swift.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swift.html.markdown b/swift.html.markdown index 0d1d2df4..2fbbe544 100644 --- a/swift.html.markdown +++ b/swift.html.markdown @@ -481,7 +481,7 @@ extension Int { } println(7.customProperty) // "This is 7" -println(14.multiplyBy(2)) // 42 +println(14.multiplyBy(3)) // 42 // Generics: Similar to Java and C#. Use the `where` keyword to specify the // requirements of the generics. -- cgit v1.2.3 From 40c38c125b94430b518d7e402d595694149b7c53 Mon Sep 17 00:00:00 2001 From: Geoff Liu Date: Sun, 18 Jan 2015 13:07:31 -0700 Subject: [Java/cn] Fix inc/dec operator explanation --- zh-cn/java-cn.html.markdown | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/zh-cn/java-cn.html.markdown b/zh-cn/java-cn.html.markdown index f7d319e6..f08d3507 100644 --- a/zh-cn/java-cn.html.markdown +++ b/zh-cn/java-cn.html.markdown @@ -124,7 +124,7 @@ public class LearnJava { // HashMaps /////////////////////////////////////// - // 操作符 + // 操作符 /////////////////////////////////////// System.out.println("\n->Operators"); @@ -161,10 +161,13 @@ public class LearnJava { // 自增 int i = 0; System.out.println("\n->Inc/Dec-rementation"); - System.out.println(i++); //i = 1 后自增 - System.out.println(++i); //i = 2 前自增 - System.out.println(i--); //i = 1 后自减 - System.out.println(--i); //i = 0 前自减 + // ++ 和 -- 操作符使变量加或减1。放在变量前面或者后面的区别是整个表达 + // 式的返回值。操作符在前面时,先加减,后取值。操作符在后面时,先取值 + // 后加减。 + System.out.println(i++); // 后自增 i = 1, 输出0 + System.out.println(++i); // 前自增 i = 2, 输出2 + System.out.println(i--); // 后自减 i = 1, 输出2 + System.out.println(--i); // 前自减 i = 0, 输出0 /////////////////////////////////////// // 控制结构 @@ -192,7 +195,7 @@ public class LearnJava { } System.out.println("fooWhile Value: " + fooWhile); - // Do While循环 + // Do While循环 int fooDoWhile = 0; do { -- cgit v1.2.3 From 8d43943b678846f1fb81c925e8232f92f46baa02 Mon Sep 17 00:00:00 2001 From: TheDmitry Date: Mon, 19 Jan 2015 17:40:07 +0300 Subject: [swift/ru] Translating Swift guide into Russian --- ru-ru/swift-ru.html.markdown | 535 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 535 insertions(+) create mode 100644 ru-ru/swift-ru.html.markdown diff --git a/ru-ru/swift-ru.html.markdown b/ru-ru/swift-ru.html.markdown new file mode 100644 index 00000000..d78365a5 --- /dev/null +++ b/ru-ru/swift-ru.html.markdown @@ -0,0 +1,535 @@ +--- +language: swift +contributors: + - ["Grant Timmerman", "http://github.com/grant"] + - ["Christopher Bess", "http://github.com/cbess"] +filename: learnswift.swift +translators: + - ["Dmitry Bessonov", "https://github.com/TheDmitry"] +lang: ru-ru +--- + +Swift - это язык программирования, созданный компанией Apple, для разработки +приложений iOS и OS X. Разработанный, чтобы сосуществовать с Objective-C и +быть более устойчивым к ошибочному коду, Swift был представлен в 2014 году на +конференции разработчиков Apple, WWDC. Приложения на Swift собираются +с помощью LLVM компилятора, включенного в Xcode 6+. + +Официальная книга по [языку программирования Swift](https://itunes.apple.com/us/book/swift-programming-language/id881256329) от Apple доступна в iBooks. + +Смотрите еще [начальное руководство](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html) Apple, которое содержит полное учебное пособие по Swift. + +```swift +// импорт модуля +import UIKit + +// +// MARK: Основы +// + +// Xcode поддерживает заметные маркеры, чтобы давать примечания свою коду +// и вносить их в список обозревателя (Jump Bar) +// MARK: Метка раздела +// TODO: Сделайте что-нибудь вскоре +// FIXME: Исправьте этот код + +println("Привет, мир") + +// переменные (var), значение которых можно изменить после инициализации +// константы (let), значение которых нельзя изменить после инициализации + +var myVariable = 42 +let øπΩ = "значение" // именование переменной символами unicode +let π = 3.1415926 +let convenience = "Ключевое слово" // контекстное имя переменной +let weak = "Ключевое слово"; let override = "еще ключевое слово" // операторы + // могут быть отделены точкой с запятой +let `class` = "Ключевое слово" // одинарные кавычки позволяют использовать + // ключевые слова в именовании переменных +let explicitDouble: Double = 70 +let intValue = 0007 // 7 +let largeIntValue = 77_000 // 77000 +let label = "некоторый текст " + String(myVariable) // Приведение типа +let piText = "Pi = \(π), Pi 2 = \(π * 2)" // Вставка переменных в строку + +// Сборка особых значений +// используя ключ -D сборки конфигурации +#if false + println("Не печатается") + let buildValue = 3 +#else + let buildValue = 7 +#endif +println("Значение сборки: \(buildValue)") // Значение сборки: 7 + +/* + Optional - это особенность языка Swift, которая допускает вам сохранять + `некоторое` или `никакое` значения. + + Язык Swift требует, чтобы каждое свойство имело значение, поэтому даже nil + должен явно сохранен как Optional значение. + + Optional является перечислением. +*/ +var someOptionalString: String? = "optional" // Может быть nil +// как и выше, только ? это постфиксный оператор (синтаксический сахар) +var someOptionalString2: Optional = "optional" + +if someOptionalString != nil { + // я не nil + if someOptionalString!.hasPrefix("opt") { + println("содержит префикс") + } + + let empty = someOptionalString?.isEmpty +} +someOptionalString = nil + +// неявная развертка переменной Optional +var unwrappedString: String! = "Ожидаемое значение." +// как и выше, только ! постфиксный оператор (с еще одним синтаксическим сахаром) +var unwrappedString2: ImplicitlyUnwrappedOptional = "Ожидаемое значение." + +if let someOptionalStringConstant = someOptionalString { + // имеется некоторое значение, не nil + if !someOptionalStringConstant.hasPrefix("ok") { + // нет такого префикса + } +} + +// Swift поддерживает сохранение значение любого типа +// AnyObject == id +// В отличие от `id` в Objective-C, AnyObject работает с любым значением (Class, +// Int, struct и т.д.) +var anyObjectVar: AnyObject = 7 +anyObjectVar = "Изменять значение на строку не является хорошей практикой, но возможно." + +/* + Комментируйте здесь + + /* + Вложенные комментарии тоже поддерживаются + */ +*/ + +// +// MARK: Коллекции +// + +/* + Массив (Array) и словарь (Dictionary) являются структурами (struct). Так + `let` и `var` также означают, что они изменяются (var) или не изменяются (let) + при объявлении типов. +*/ + +// Массив +var shoppingList = ["сом", "вода", "лимоны"] +shoppingList[1] = "бутылка воды" +let emptyArray = [String]() // let == неизменный +let emptyArray2 = Array() // как и выше +var emptyMutableArray = [String]() // var == изменяемый + + +// Словарь +var occupations = [ + "Malcolm": "Капитан", + "kaylee": "Техник" +] +occupations["Jayne"] = "Связи с общественностью" +let emptyDictionary = [String: Float]() // let == неизменный +let emptyDictionary2 = Dictionary() // как и выше +var emptyMutableDictionary = [String: Float]() // var == изменяемый + + +// +// MARK: Поток управления +// + +// цикл for для массива +let myArray = [1, 1, 2, 3, 5] +for value in myArray { + if value == 1 { + println("Один!") + } else { + println("Не один!") + } +} + +// цикл for для словаря +var dict = ["один": 1, "два": 2] +for (key, value) in dict { + println("\(key): \(value)") +} + +// цикл for для диапазона чисел +for i in -1...shoppingList.count { + println(i) +} +shoppingList[1...2] = ["бифштекс", "орехи пекан"] +// используйте ..< для исключения последнего числа + +// цикл while +var i = 1 +while i < 1000 { + i *= 2 +} + +// цикл do-while +do { + println("привет") +} while 1 == 2 + +// Переключатель +// Очень мощный оператор, представляйте себе операторы `if` с синтаксическим +// сахаром +// Они поддерживают строки, объекты и примитивы (Int, Double, etc) +let vegetable = "красный перец" +switch vegetable { +case "сельдерей": + let vegetableComment = "Добавьте немного изюма и make ants on a log." +case "огурец", "жеруха": + let vegetableComment = "Было бы неплохо сделать бутерброд с чаем." +case let localScopeValue where localScopeValue.hasSuffix("перец"): + let vegetableComment = "Это острый \(localScopeValue)?" +default: // обязательный (чтобы преодолеть все возможные вхождения) + let vegetableComment = "Все вкусы хороши для супа." +} + + +// +// MARK: Функции +// + +// Функции являются типом первого класса, т.е. они могут быть вложены в функциях +// и могут передаваться между собой + +// Функция с документированным заголовком Swift (формат reStructedText) + +/** + Операция приветствия + + - Жирная метка в документировании + - Еще одна жирная метка в документации + + :param: name - это имя + :param: day - это день + :returns: Строка, содержащая значения name и day. +*/ +func greet(name: String, day: String) -> String { + return "Привет \(name), сегодня \(day)." +} +greet("Боб", "вторник") + +// как и выше, кроме обращения параметров функции +func greet2(#requiredName: String, externalParamName localParamName: String) -> String { + return "Привет \(requiredName), сегодня \(localParamName)" +} +greet2(requiredName:"Иван", externalParamName: "воскресенье") + +// Функция, которая возвращает множество элементов в кортеже +func getGasPrices() -> (Double, Double, Double) { + return (3.59, 3.69, 3.79) +} +let pricesTuple = getGasPrices() +let price = pricesTuple.2 // 3.79 +// Пропускайте значения кортежей с помощью подчеркивания _ +let (_, price1, _) = pricesTuple // price1 == 3.69 +println(price1 == pricesTuple.1) // вывод: true +println("Цена газа: \(price)") + +// Переменное число аргументов +func setup(numbers: Int...) { + // это массив + let number = numbers[0] + let argCount = numbers.count +} + +// Передача и возврат функций +func makeIncrementer() -> (Int -> Int) { + func addOne(number: Int) -> Int { + return 1 + number + } + return addOne +} +var increment = makeIncrementer() +increment(7) + +// передача по ссылке +func swapTwoInts(inout a: Int, inout b: Int) { + let tempA = a + a = b + b = tempA +} +var someIntA = 7 +var someIntB = 3 +swapTwoInts(&someIntA, &someIntB) +println(someIntB) // 7 + + +// +// MARK: Замыкания +// +var numbers = [1, 2, 6] + +// Функции - это частный случай замыканий ({}) + +// Пример замыкания. +// `->` отделяет аргументы и возвращаемый тип +// `in` отделяет заголовок замыкания от тела замыкания +numbers.map({ + (number: Int) -> Int in + let result = 3 * number + return result +}) + +// Когда тип известен, как и выше, мы можем сделать так +numbers = numbers.map({ number in 3 * number }) +// Или даже так +//numbers = numbers.map({ $0 * 3 }) + +print(numbers) // [3, 6, 18] + +// Упрощение замыкания +numbers = sorted(numbers) { $0 > $1 } + +print(numbers) // [18, 6, 3] + +// Суперсокращение, поскольку оператор < выполняет логический вывод типов + +numbers = sorted(numbers, < ) + +print(numbers) // [3, 6, 18] + +// +// MARK: Структуры +// + +// Структуры и классы имеют очень похожие характеристики +struct NamesTable { + let names = [String]() + + // Пользовательский индекс + subscript(index: Int) -> String { + return names[index] + } +} + +// У структур автогенерируемый (неявно) инициализатор +let namesTable = NamesTable(names: ["Me", "Them"]) +let name = namesTable[1] +println("Name is \(name)") // Name is Them + +// +// MARK: Классы +// + +// Классы, структуры и их члены имеют трехуровневый контроль доступа +// Уровни: internal (по умолчанию), public, private + +public class Shape { + public func getArea() -> Int { + return 0; + } +} + +// Все методы и свойства класса являются открытыми (public). +// Если вам необходимо содержать только данные +// в структурированном объекте, вы должны использовать `struct` + +internal class Rect: Shape { + var sideLength: Int = 1 + + // Пользовательский сеттер и геттер + private var perimeter: Int { + get { + return 4 * sideLength + } + set { + // `newValue` - неявная переменная, доступная в сеттере + sideLength = newValue / 4 + } + } + + // Ленивая загрузка свойства + // свойство subShape остается равным nil (неинициализированным), + // пока не вызовется геттер + lazy var subShape = Rect(sideLength: 4) + + // Если вам не нужны пользовательские геттеры и сеттеры, + // но все же хотите запустить код перед и после вызовов геттера или сеттера + // свойств, вы можете использовать `willSet` и `didSet` + var identifier: String = "defaultID" { + // аргумент у `willSet` будет именем переменной для нового значения + willSet(someIdentifier) { + print(someIdentifier) + } + } + + init(sideLength: Int) { + self.sideLength = sideLength + // всегда вызывается super.init последним, когда init с параметрами + super.init() + } + + func shrink() { + if sideLength > 0 { + --sideLength + } + } + + override func getArea() -> Int { + return sideLength * sideLength + } +} + +// Простой класс `Square` наследует `Rect` +class Square: Rect { + convenience init() { + self.init(sideLength: 5) + } +} + +var mySquare = Square() +print(mySquare.getArea()) // 25 +mySquare.shrink() +print(mySquare.sideLength) // 4 + +// преобразование объектов +let aShape = mySquare as Shape + +// сравнение объектов, но не как операция ==, которая проверяет эквивалентность +if mySquare === mySquare { + println("Ага, это mySquare") +} + + +// +// MARK: Перечисления +// + +// Перечисления могут быть определенного или своего типа. +// Они могут содержать методы подобно классам. + +enum Suit { + case Spades, Hearts, Diamonds, Clubs + func getIcon() -> String { + switch self { + case .Spades: return "♤" + case .Hearts: return "♡" + case .Diamonds: return "♢" + case .Clubs: return "♧" + } + } +} + +// Значения перечислений допускают жесткий синтаксис, нет необходимости +// указывать тип перечисления, когда переменная объявляется явно +var suitValue: Suit = .Hearts + +// Нецелочисленные перечисления требуют прямого указания значений +enum BookName: String { + case John = "John" + case Luke = "Luke" +} +println("Имя: \(BookName.John.rawValue)") + + +// +// MARK: Протоколы +// + +// `protocol` может потребовать, чтобы у соответствующих типов +// были определенные свойства экземпляра, методы экземпляра, тип методов, +// операторы и индексы. + +protocol ShapeGenerator { + var enabled: Bool { get set } + func buildShape() -> Shape +} + +// Протоколы, объявленные с @objc, допускают необязательные функции, +// которые позволяют вам проверять на соответствие +@objc protocol TransformShape { + optional func reshaped() + optional func canReshape() -> Bool +} + +class MyShape: Rect { + var delegate: TransformShape? + + func grow() { + sideLength += 2 + + if let allow = self.delegate?.canReshape?() { + // проверка делегата на выполнение метода + self.delegate?.reshaped?() + } + } +} + + +// +// MARK: Прочее +// + +// `extension`s: Добавляет расширенный функционал к существующему типу + +// Класс Square теперь "соответствует" протоколу `Printable` +extension Square: Printable { + var description: String { + return "Площадь: \(self.getArea()) - ID: \(self.identifier)" + } +} + +println("Объект Square: \(mySquare)") + +// Вы также можете расширить встроенные типы +extension Int { + var customProperty: String { + return "Это \(self)" + } + + func multiplyBy(num: Int) -> Int { + return num * self + } +} + +println(7.customProperty) // "Это 7" +println(14.multiplyBy(3)) // 42 + +// Обобщения: Подобно языкам Java и C#. Используйте ключевое слово `where`, +// чтобы определить условия обобщений. + +func findIndex(array: [T], valueToFind: T) -> Int? { + for (index, value) in enumerate(array) { + if value == valueToFind { + return index + } + } + return nil +} +let foundAtIndex = findIndex([1, 2, 3, 4], 3) +println(foundAtIndex == 2) // вывод: true + +// Операторы: +// Пользовательские операторы могут начинаться с символов: +// / = - + * % < > ! & | ^ . ~ +// или +// Unicode- знаков математики, символов, стрелок, декорации и линий/кубов, +// нарисованных символов. +prefix operator !!! {} + +// Префиксный оператор, который утраивает длину стороны, когда используется +prefix func !!! (inout shape: Square) -> Square { + shape.sideLength *= 3 + return shape +} + +// текущее значение +println(mySquare.sideLength) // 4 + +// Используя пользовательский оператор !!!, изменится длина стороны +// путем увеличения размера в 3 раза +!!!mySquare +println(mySquare.sideLength) // 12 +``` -- cgit v1.2.3 From 4e130fce1c202c31cd0c7b94706da2cab7747aa1 Mon Sep 17 00:00:00 2001 From: TheDmitry Date: Mon, 19 Jan 2015 17:54:12 +0300 Subject: Update filename in the doc header. --- ru-ru/swift-ru.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ru-ru/swift-ru.html.markdown b/ru-ru/swift-ru.html.markdown index d78365a5..f788ad4c 100644 --- a/ru-ru/swift-ru.html.markdown +++ b/ru-ru/swift-ru.html.markdown @@ -3,7 +3,7 @@ language: swift contributors: - ["Grant Timmerman", "http://github.com/grant"] - ["Christopher Bess", "http://github.com/cbess"] -filename: learnswift.swift +filename: learnswift-ru.swift translators: - ["Dmitry Bessonov", "https://github.com/TheDmitry"] lang: ru-ru -- cgit v1.2.3 From ea9acc1b346fffcc820a79b585a5251cc74e857f Mon Sep 17 00:00:00 2001 From: Johnathan Maudlin Date: Mon, 19 Jan 2015 22:10:37 -0500 Subject: Update contributors --- tmux.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmux.html.markdown b/tmux.html.markdown index 9eb96303..2ccb067a 100644 --- a/tmux.html.markdown +++ b/tmux.html.markdown @@ -2,7 +2,7 @@ category: tool tool: tmux contributors: - - ["wzsk", "https://github.com/wzsk"] + - ["mdln", "https://github.com/mdln"] filename: LearnTmux.txt --- -- cgit v1.2.3 From 209dc039ecc5ee280e5239afe5e2a77a851f795f Mon Sep 17 00:00:00 2001 From: searoso Date: Tue, 20 Jan 2015 21:34:18 +0300 Subject: Update r.html.markdown Added logical operators that were missing. --- r.html.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/r.html.markdown b/r.html.markdown index c555d748..13fa2654 100644 --- a/r.html.markdown +++ b/r.html.markdown @@ -229,6 +229,13 @@ FALSE != FALSE # FALSE FALSE != TRUE # TRUE # Missing data (NA) is logical, too class(NA) # "logical" +# Use for | and & for logic operations. +# OR +TRUE | FALSE # TRUE +# AND +TRUE & FALSE # FALSE +# You can test if x is TRUE +isTRUE(TRUE) # TRUE # Here we get a logical vector with many elements: c('Z', 'o', 'r', 'r', 'o') == "Zorro" # FALSE FALSE FALSE FALSE FALSE c('Z', 'o', 'r', 'r', 'o') == "Z" # TRUE FALSE FALSE FALSE FALSE -- cgit v1.2.3 From 7a55b4a9b1badebd4b9342304c902fde049dd172 Mon Sep 17 00:00:00 2001 From: Keito Uchiyama Date: Tue, 20 Jan 2015 14:52:31 -0800 Subject: Explain Optional Chaining Without going into too much detail, mention optional chaining so it's not confusing that there is a question mark suffix (it's not currently mentioned anywhere on the page). --- swift.html.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/swift.html.markdown b/swift.html.markdown index 2fbbe544..c6d2a8af 100644 --- a/swift.html.markdown +++ b/swift.html.markdown @@ -445,7 +445,10 @@ class MyShape: Rect { func grow() { sideLength += 2 - + + // Place a question mark after an optional property, method, or + // subscript to gracefully ignore a nil value and return nil + // instead of throwing a runtime error ("optional chaining"). if let allow = self.delegate?.canReshape?() { // test for delegate then for method self.delegate?.reshaped?() -- cgit v1.2.3 From 0d01004725423b29e196acf74a626bd3585934cc Mon Sep 17 00:00:00 2001 From: hirohope Date: Tue, 20 Jan 2015 23:16:35 -0300 Subject: haml-es --- es-es/haml-es.html.markdown | 159 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 es-es/haml-es.html.markdown diff --git a/es-es/haml-es.html.markdown b/es-es/haml-es.html.markdown new file mode 100644 index 00000000..be90b8f3 --- /dev/null +++ b/es-es/haml-es.html.markdown @@ -0,0 +1,159 @@ +--- +language: haml +filename: learnhaml-es.haml +contributors: + - ["Simon Neveu", "https://github.com/sneveu"] +translators: + - ["Camilo Garrido", "http://www.twitter.com/hirohope"] +lang: es-es +--- + +Haml es un lenguage de marcas principalmente usado con Ruby, que de forma simple y limpia describe el HTML de cualquier documento web sin el uso de código en linea. Es una alternativa popular respecto a usar el lenguage de plantilla de Rails (.erb) y te permite embeber código Ruby en tus anotaciones. + +Apunta a reducir la repetición en tus anotaciones cerrando los tags por ti, basándose en la estructura de identación de tu código. El resultado es una anotación bien estructurada, que no se repite, lógica y fácil de leer. + +También puedes usar Haml en un proyecto independiente de Ruby, instalando la gema Haml en tu máquina y usando la línea de comandos para convertirlo en html. + +$ haml archivo_entrada.haml archivo_salida.html + + +```haml +/ ------------------------------------------- +/ Identación +/ ------------------------------------------- + +/ + Por la importancia que la identación tiene en cómo tu código es traducido, + la identación debe ser consistente a través de todo el documento. Cualquier + diferencia en la identación lanzará un error. Es una práctica común usar dos + espacios, pero realmente depende de tí, mientras sea consistente. + + +/ ------------------------------------------- +/ Comentarios +/ ------------------------------------------- + +/ Así es como un comentario se ve en Haml. + +/ + Para escribir un comentario multilínea, identa tu código a comentar de tal forma + que sea envuelto por por una barra. + + +-# Este es un comentario silencioso, significa que no será traducido al código en absoluto + + +/ ------------------------------------------- +/ Elementos Html +/ ------------------------------------------- + +/ Para escribir tus tags, usa el signo de porcentaje seguido por el nombre del tag +%body + %header + %nav + +/ Nota que no hay tags de cierre. El código anterior se traduciría como + +
+ +
+ + +/ El tag div es un elemento por defecto, por lo que pueden ser escritos simplemente así +.foo + +/ Para añadir contenido a un tag, añade el texto directamente después de la declaración +%h1 Headline copy + +/ Para escribir contenido multilínea, anídalo. +%p + Esto es mucho contenido que podríamos dividirlo en dos + líneas separadas. + +/ + Puedes escapar html usando el signo ampersand y el signo igual ( &= ). + Esto convierte carácteres sensibles en html a su equivalente codificado en html. + Por ejemplo + +%p + &= "Sí & si" + +/ se traduciría en 'Sí & si' + +/ Puedes desescapar html usando un signo de exclamación e igual ( != ) +%p + != "Así es como se escribe un tag párrafo

" + +/ se traduciría como 'Así es como se escribe un tag párrafo

' + +/ Clases CSS puedes ser añadidas a tus tags, ya sea encadenando .nombres-de-clases al tag +%div.foo.bar + +/ o como parte de un hash Ruby +%div{:class => 'foo bar'} + +/ Atributos para cualquier tag pueden ser añadidos en el hash +%a{:href => '#', :class => 'bar', :title => 'Bar'} + +/ Para atributos booleanos asigna el valor verdadero 'true' +%input{:selected => true} + +/ Para escribir atributos de datos, usa la llave :dato con su valor como otro hash +%div{:data => {:attribute => 'foo'}} + + +/ ------------------------------------------- +/ Insertando Ruby +/ ------------------------------------------- + +/ + Para producir un valor Ruby como contenido de un tag, usa un signo igual + seguido por código Ruby + +%h1= libro.nombre + +%p + = libro.autor + = libro.editor + + +/ Para correr un poco de código Ruby sin traducirlo en html, usa un guión +- libros = ['libro 1', 'libro 2', 'libro 3'] + +/ Esto te permite hacer todo tipo de cosas asombrosas, como bloques de Ruby +- libros.shuffle.each_with_index do |libro, indice| + %h1= libro + + if libro do + %p Esto es un libro + +/ + Nuevamente, no hay necesidad de añadir los tags de cerrado en el código, ni siquiera para Ruby + La identación se encargará de ello por tí. + + +/ ------------------------------------------- +/ Ruby en linea / Interpolación de Ruby +/ ------------------------------------------- + +/ Incluye una variable Ruby en una línea de texto plano usando #{} +%p Tu juego con puntaje más alto es #{mejor_juego} + + +/ ------------------------------------------- +/ Filtros +/ ------------------------------------------- + +/ + Usa un signo dos puntos para definir filtros Haml, un ejemplo de filtro que + puedes usar es :javascript, el cual puede ser usado para escribir javascript en línea. + +:javascript + console.log('Este es un