Merge remote-tracking branch 'upstream/master'

pull latest
This commit is contained in:
kaernyk 2014-09-09 21:05:13 -04:00
commit a4e381d756
31 changed files with 1584 additions and 279 deletions

View File

@ -8,6 +8,7 @@ contributors:
- ["Denis Arh", "https://github.com/darh"] - ["Denis Arh", "https://github.com/darh"]
- ["akirahirose", "https://twitter.com/akirahirose"] - ["akirahirose", "https://twitter.com/akirahirose"]
- ["Anton Strömkvist", "http://lutic.org/"] - ["Anton Strömkvist", "http://lutic.org/"]
- ["Rahil Momin", "https://github.com/iamrahil"]
filename: LearnBash.sh filename: LearnBash.sh
--- ---
@ -140,6 +141,12 @@ do
echo "$VARIABLE" echo "$VARIABLE"
done done
# Or write it the "traditional for loop" way:
for ((a=1; a <= 3; a++))
do
echo $a
done
# They can also be used to act on files.. # They can also be used to act on files..
# This will run the command 'cat' on file1 and file2 # This will run the command 'cat' on file1 and file2
for VARIABLE in file1 file2 for VARIABLE in file1 file2

View File

@ -4,6 +4,7 @@ filename: learnc.c
contributors: contributors:
- ["Adam Bard", "http://adambard.com/"] - ["Adam Bard", "http://adambard.com/"]
- ["Árpád Goretity", "http://twitter.com/H2CO3_iOS"] - ["Árpád Goretity", "http://twitter.com/H2CO3_iOS"]
- ["Jakub Trzebiatowski", "http://cbs.stgn.pl"]
--- ---
@ -175,6 +176,9 @@ int main() {
i2 * i1; // => 2 i2 * i1; // => 2
i1 / i2; // => 0 (0.5, but truncated towards 0) i1 / i2; // => 0 (0.5, but truncated towards 0)
// You need to cast at least one integer to float to get a floating-point result
(float)i1 / i2 // => 0.5f
i1 / (double)i2 // => 0.5 // Same with double
f1 / f2; // => 0.5, plus or minus epsilon f1 / f2; // => 0.5, plus or minus epsilon
// Floating-point numbers and calculations are not exact // Floating-point numbers and calculations are not exact
@ -194,9 +198,11 @@ int main() {
2 >= 2; // => 1 2 >= 2; // => 1
// C is not Python - comparisons don't chain. // C is not Python - comparisons don't chain.
// WRONG: // Warning: The line below will compile, but it means `(0 < a) < 2`.
//int between_0_and_2 = 0 < a < 2; // This expression is always true, because (0 < a) could be either 1 or 0.
// Correct: // In this case it's 1, because (0 < 1).
int between_0_and_2 = 0 < a < 2;
// Instead use:
int between_0_and_2 = 0 < a && a < 2; int between_0_and_2 = 0 < a && a < 2;
// Logic works on ints // Logic works on ints
@ -573,7 +579,7 @@ typedef void (*my_fnp_type)(char *);
'\''; // single quote '\''; // single quote
'\"'; // double quote '\"'; // double quote
'\xhh'; // hexadecimal number. Example: '\xb' = vertical tab character '\xhh'; // hexadecimal number. Example: '\xb' = vertical tab character
'\ooo'; // octal number. Example: '\013' = vertical tab character '\0oo'; // octal number. Example: '\013' = vertical tab character
//print formatting: //print formatting:
"%d"; // integer "%d"; // integer

View File

@ -11,7 +11,7 @@ As one of the succeeders of JavaScript, CoffeeScript tries its best to output re
See also [the CoffeeScript website](http://coffeescript.org/), which has a complete tutorial on CoffeeScript. See also [the CoffeeScript website](http://coffeescript.org/), which has a complete tutorial on CoffeeScript.
``` coffeescript ```coffeescript
# CoffeeScript is a hipster language. # CoffeeScript is a hipster language.
# It goes with the trends of many modern languages. # It goes with the trends of many modern languages.
# So comments are like Ruby and Python, they use number symbols. # So comments are like Ruby and Python, they use number symbols.

View File

@ -17,7 +17,7 @@ Another popular and recent book is
```scheme ```common_lisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 0. Syntax ;;; 0. Syntax

237
compojure.html.markdown Normal file
View File

@ -0,0 +1,237 @@
---
category: tool
tool: compojure
contributors:
- ["Adam Bard", "http://adambard.com/"]
filename: learncompojure.clj
---
## Getting Started with Compojure
Compojure is a DSL for *quickly* creating *performant* web applications
in Clojure with minimal effort:
```clojure
(ns myapp.core
(:require [compojure.core :refer :all]
[org.httpkit.server :refer [run-server]])) ; httpkit is a server
(defroutes myapp
(GET "/" [] "Hello World"))
(defn -main []
(run-server myapp {:port 5000}))
```
**Step 1:** Create a project with [Leiningen](http://leiningen.org/):
```
lein new myapp
```
**Step 2:** Put the above code in `src/myapp/core.clj`
**Step 3:** Add some dependencies to `project.clj`:
```
[compojure "1.1.8"]
[http-kit "2.1.16"]
```
**Step 4:** Run:
```
lein run -m myapp.core
```
View at: <http://localhost:5000/>
Compojure apps will run on any ring-compatible server, but we recommend
[http-kit](http://http-kit.org/) for its performance and
[massive concurrency](http://http-kit.org/600k-concurrent-connection-http-kit.html).
### Routes
In compojure, each route is an HTTP method paired with a URL-matching pattern,
an argument list, and a body.
```clojure
(defroutes myapp
(GET "/" [] "Show something")
(POST "/" [] "Create something")
(PUT "/" [] "Replace something")
(PATCH "/" [] "Modify Something")
(DELETE "/" [] "Annihilate something")
(OPTIONS "/" [] "Appease something")
(HEAD "/" [] "Preview something"))
```
Compojure route definitions are just functions which
[accept request maps and return response maps](https://github.com/mmcgrana/ring/blob/master/SPEC):
```clojure
(myapp {:uri "/" :request-method :post})
; => {:status 200
; :headers {"Content-Type" "text/html; charset=utf-8}
; :body "Create Something"}
```
The body may be a function, which must accept the request as a parameter:
```clojure
(defroutes myapp
(GET "/" [] (fn [req] "Do something with req")))
```
Or, you can just use the request directly:
```clojure
(defroutes myapp
(GET "/" req "Do something with req"))
```
Route patterns may include named parameters:
```clojure
(defroutes myapp
(GET "/hello/:name" [name] (str "Hello " name)))
```
You can adjust what each parameter matches by supplying a regex:
```clojure
(defroutes myapp
(GET ["/file/:name.:ext" :name #".*", :ext #".*"] [name ext]
(str "File: " name ext))
```
Handlers may utilize query parameters:
```clojure
(defroutes myapp
(GET "/posts" []
(fn [req]
(let [title (get (:params req) "title")
author (get (:params req) "title")]
" Do something with title and author"))))
```
Or, for POST and PUT requests, form parameters
```clojure
(defroutes myapp
(POST "/posts" []
(fn [req]
(let [title (get (:params req) "title")
author (get (:params req) "title")]
"Do something with title and author"))))
```
### Return values
The return value of a route block determines at least the response body
passed on to the HTTP client, or at least the next middleware in the
ring stack. Most commonly, this is a string, as in the above examples.
But, you may also return a [response map](https://github.com/mmcgrana/ring/blob/master/SPEC):
```clojure
(defroutes myapp
(GET "/" []
{:status 200 :body "Hello World"})
(GET "/is-403" []
{:status 403 :body ""})
(GET "/is-json" []
{:status 200 :headers {"Content-Type" "application/json"} :body "{}"}))
```
### Static Files
To serve up static files, use `compojure.route.resources`.
Resources will be served from your project's `resources/` folder.
```clojure
(require '[compojure.route :as route])
(defroutes myapp
(GET "/")
(route/resources "/")) ; Serve static resources at the root path
(myapp {:uri "/js/script.js" :request-method :get})
; => Contents of resources/public/js/script.js
```
### Views / Templates
To use templating with Compojure, you'll need a template library. Here are a few:
#### [Stencil](https://github.com/davidsantiago/stencil)
[Stencil](https://github.com/davidsantiago/stencil) is a [Mustache](http://mustache.github.com/) template library:
```clojure
(require '[stencil.core :refer [render-string]])
(defroutes myapp
(GET "/hello/:name" [name]
(render-string "Hello {{name}}" {:name name})))
```
You can easily read in templates from your resources directory. Here's a helper function
```clojure
(require 'clojure.java.io)
(defn read-template [filename]
(slurp (clojure.java.io/resource filename)))
(defroutes myapp
(GET "/hello/:name" [name]
(render-string (read-template "templates/hello.html") {:name name})))
```
#### [Selmer](https://github.com/yogthos/Selmer)
[Selmer](https://github.com/yogthos/Selmer) is a Django and Jinja2-inspired templating language:
```clojure
(require '[selmer.parser :refer [render-file]])
(defroutes myapp
(GET "/hello/:name" [name]
(render-file "templates/hello.html" {:name name})))
```
#### [Hiccup](https://github.com/weavejester/hiccup)
[Hiccup](https://github.com/weavejester/hiccup) is a library for representing HTML as Clojure code
```clojure
(require '[hiccup.core :as hiccup])
(defroutes myapp
(GET "/hello/:name" [name]
(hiccup/html
[:html
[:body
[:h1 {:class "title"}
(str "Hello " name)]]])))
```
#### [Markdown](https://github.com/yogthos/markdown-clj)
[Markdown-clj](https://github.com/yogthos/markdown-clj) is a Markdown implementation.
```clojure
(require '[markdown.core :refer [md-to-html-string]])
(defroutes myapp
(GET "/hello/:name" [name]
(md-to-html-string "## Hello, world")))
```
Further reading:
* [Official Compojure Documentation](https://github.com/weavejester/compojure/wiki)
* [Clojure for the Brave and True](http://www.braveclojure.com/)

View File

@ -14,7 +14,7 @@ fácilmente a HTML (y, actualmente, otros formatos también).
¡Denme todo la retroalimentación que quieran! / ¡Sientanse en la libertad de hacer forks o pull requests! ¡Denme todo la retroalimentación que quieran! / ¡Sientanse en la libertad de hacer forks o pull requests!
``` ```markdown
<!-- Markdown está basado en HTML, así que cualquier archivo HTML es Markdown <!-- Markdown está basado en HTML, así que cualquier archivo HTML es Markdown
válido, eso significa que podemos usar elementos HTML en Markdown como, por válido, eso significa que podemos usar elementos HTML en Markdown como, por
ejemplo, el comentario y no serán afectados por un parseador Markdown. Aún ejemplo, el comentario y no serán afectados por un parseador Markdown. Aún

View File

@ -0,0 +1,525 @@
---
language: javascript
contributors:
- ['Adam Brenecki', 'http://adam.brenecki.id.au']
- ['Ariel Krakowski', 'http://www.learneroo.com']
filename: javascript-fr.js
translators:
- ['@nbrugneaux', 'https://nicolasbrugneaux.me']
lang: fr-fr
---
JavaScript a été créé par Brendan Eich, travaillant alors a Netscape, en 1995.
Le langage avait à l'origine pour but d'être un langage de scripting simple
pour les sites web, complétant le Java (à ne pas confondre avec JavaScript)
pour des applications web complexes. Mais son intégration très proche et
simple des pages web, ainsi que le support natif des navigateurs a rendu
le JavaScript incontournable aujourd'hui tant bien dans le front-end que
dans le back-end.
En effet, le JavaScript n'est plus uniquement limité aux navigateurs, grâce à
Node.JS, un projet qui offre un environnement indépendant dans lequel un
interpréteur Javascript, basé sur le célèbre moteur V8 de Google Chrome,
peut être utilisé directement côté serveur pour exécuter des programmes écrits
en JavaScript.
```js
// Les commentaires sont comme en C. Les commentaires mono-ligne commencent par 2 slashs,
/* et les commentaires sur plusieurs lignes commencent avec slash-étoile
et finissent avec étoile-slash */
// Toutes les expressions peuvent finir par ;
doStuff();
// ... mais n'en n'ont pas forcément besoin, les point-virgules sont ajoutés
// lors de linterprétation aux sauts de ligne, sauf exceptions
doStuff()
// Parce que ces cas peuvent produire des effets inattendus, nous utiliserons
// des point-virgules dans ce guide.
///////////////////////////////////
// 1. Nombres, Chaines de caractères et Opérateurs
// JavaScript a un seul type de nombre (qui est un 64-bit IEEE 754 double (décimaux))
// Comme avec le Lua, ne paniquez pas à cause du manque d'int (entiers) : les
// doubles ont un mantisse de 52 bits, ce qui est assez pour stocker des int jusqu'à
// 9 x 10¹⁵ exactement.
3; // = 3
1.5; // = 1.5
// L'arithmétique de base fonctionne comme vous vous y attendriez
1 + 1; // = 2
8 - 1; // = 7
10 * 2; // = 20
35 / 5; // = 7
// Ainsi que les divisions non-entières
5 / 2; // = 2.5
// Les opérations bits à bits fonctionnent aussi, quand vous effectuez une opération
// bits à bits, votre nombre décimal est converti en entier *jusqu'à* 32 bits.
1 << 2; // = 4
// Comme en mathématiques, la priorité est donnée aux parenthèses.
(1 + 3) * 2; // = 8
// Il existe 3 valeurs spéciales pour les nombres:
Infinity; // le résultat de 1/0 par exemple
-Infinity; // le résultat de -1/0 par exemple
NaN; // le résultat de 0/0 par exemple
// Il existe également le type booléen.
true; // vrai
false; // faux
// Les chaines de caractères (strings) sont créees avec " ou ' indifféremment, la seule
// raison de choisir l'un ou l'autre est la cohérence dans votre code.
"abc";
'Hello, world';
// La négation utilise le symbole !
!true; // = false
!false; // = true
// L'égalité est === ou ==
// === compare la valeur exacte 2 === '2' // = false
// == convertit la valeur pour comparer 2 === '2' // = true
// En général, il vaut mieux utiliser === pour ne pas faire d'erreur.
1 === 1; // = true
2 === 1; // = false
// L'inégalité est !== ou !=, basé sur le même principe qu'avant.
1 !== 1; // = false
2 !== 1; // = true
// Plus de comparaisons :
1 < 10; // = true
1 > 10; // = false
2 <= 2; // = true
2 >= 2; // = true
// Les chaines de caractères se concatènent avec +
'Hello ' + 'world!'; // = 'Hello world!'
// et peuvent être comparées alphabétiquement avec < et >
'a' < 'b'; // = true
// Vous pouvez accéder les caractères dans une string avec charAt
'This is a string'.charAt(0); // = 'T'
// ... ou utiliser substring pour avoir un plus gros morceau
'Hello world'.substring(0, 5); // = 'Hello'
// la longueur, length, est une propriété, donc n'utilisez pas de ()
'Hello'.length; // = 5
// Il y a également null et undefined
null; // utilisé pour une non-valeur
undefined; // utilisé pour une valeur actuellement non présente (cependant,
// undefined est aussi une valeur valide)
// false, null, undefined, NaN, 0 and '' sont 'presque-faux' (falsy), tout le reste
// est 'presque-vrai' (truthy)
// Notez que 0 est falsy mais '0' est truthy, alors même que 0 == '0' (mais 0 !== '0')
///////////////////////////////////
// 2. Variables, Tableaux et Objets
// Les variables sont déclarées avec le mot clé var. Le typage en JavaScript est
// dynamique, donc pas besoin de spécifier le type. L'assignement utilise un seul =.
var someVar = 5;
// si vous oubliez le mot clé var, vous n'aurez pas d'erreur (sauf en mode strict)
someOtherVar = 10;
// ... mais la variable aura une portée globale (plus communément trouvé en tant
// que "global scope" en anglais), et non pas une portée limitée à la fonction
// dans laquelle vous l'aviez définie.
// Les variables déclarées et non assignées sont undefined par défaut
var someThirdVar;
var someThirdVar = undefined;
// ... sont deux déclarations identiques.
// Il y a des raccourcis pour les opérations mathématiques:
someVar += 5; // équivalent pour someVar = someVar + 5;
someVar *= 10; // de même, someVar = someVar * 100;
someVar++; // = someVar += 1;
someVar--; // = someVar -= 1;
// Les tableaux (Arrays) sont des listes ordonnées de valeurs, de tous types.
var myArray = ['Hello', 45, true];
// Leurs membres peuvent être accédés en utilisant les crochets
// Les indices commencent à 0.
myArray[1]; // = 45
// Les tableaux sont modifiables, ainsi que leurs longueurs
myArray.push( 'World' );
myArray.length; // = 4
// Ajout/Modification à un index spécifique
myArray[3] = 'Hello';
// Les objets JavaScript sont appelés 'dictionnaires' ou 'maps' dans certains autres
// langages : ils sont une liste non-ordonnée de paires clé-valeur.
var myObj = {key1: 'Hello', key2: 'World'};
// Les clés sont des strings, mais les ' ou " sont optionels si elles sont des
// noms valides en JavaScript. Les valeurs peuvent être de n'importe quel type.
var myObj = {myKey: 'myValue', 'my other key': 4};
// Les attributs d'objets peuvent être accédés avec les crochets
myObj['my other key']; // = 4
// .. ou avec un point si la clé est un identifiant valide.
myObj.myKey; // = 'myValue'
// Les objets sont eux aussi modifiables.
myObj.myThirdKey = true;
// Si vous essayez d'accéder à une valeur non-définie, vous obtiendrez undefined
myObj.myFourthKey; // = undefined
///////////////////////////////////
// 3. Logique et structures de contrôle
// Les si (if) fonctionnent comme vous vous y attendez.
var count = 1;
if (count === 3) {
// seulement quand count est 3
}
else if (count === 4) {
// uniquement quand count est 4
}
else {
// le reste du temps, si ni 3, ni 4.
}
// De même pour while.
while (true) {
// Une boucle infinie !
}
// Les boucles do-while sont pareilles, mais sont exécutées au moins une fois.
var input
do {
input = getInput();
} while (!isValid(input))
// La boucle for est la même qu'en C ou en Java:
// initialisation; condition pour continuer; itération
for (var i = 0; i < 5; i++){
// sera exécutée 5 fois
}
// && est le "et" logique, || est le "ou" logique
if (house.size === 'big' && house.colour === 'blue'){
house.contains = 'bear';
}
if (colour === 'red' || colour === 'blue'){
// colour est soit 'red' soit 'blue'
}
// Les raccourcis && et || sont pratiques pour instancier des valeurs par defaut.
var name = otherName || 'default';
// Ceci est l'équivalent de
var name = otherName;
if (!name){
name = 'default';
}
// Le switch vérifie les égalités avec ===
// utilisez un "break" à la fin de chaque cas
// ou les cas suivants seront eux aussi exécutés
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. Fonctions, Scope (Environnement) et Closures
// Les fonctions sont déclarées avec le mot clé function
function myFunction(thing){
return thing.toUpperCase();
}
myFunction('foo'); // = 'FOO'
// Les fonctions JavaScript sont des objets de première classe, donc peuvent
// être réassignées à d'autres variables et passées en tant que paramètres pour
// d'autres fonctions
function myFunction(){
// ce code s'exécutera dans 5 secondes
}
setTimeout(myFunction, 5000);
// Note: setTimeout ne fait pas parti du langage, mais les navigateurs ainsi
// que Node.js le rendent disponible
// Les fonctions n'ont pas nécessairement besoin d'un nom, elles peuvent être
// anonymes
setTimeout(function(){
// ce code s'exécutera dans 5 secondes
}, 5000);
// Le Javascript crée uniquement un scope, une portée d'action limitée, pour
// les fonctions, et pas dans les autres blocs.
if (true){
var i = 5;
}
i; // = 5 - et non undefined comme vous pourriez vous y attendre
// Cela a mené à un style commun de fonctions anonymes immédiatement exécutée;
// ou "immediately-executing anonymous functions"
(function(){
var temporary = 5;
// Nous pouvons accéder au scope global en assignant à l'objet global,
// qui dans les navigateurs est "window". Il est différent dans Node.js,
// le scope global sera en fait local au module dans lequel vous
// vous trouvez. http://nodejs.org/api/globals.html
window.permanent = 10;
})();
// Cela permet de ne pas avoir de fuites de variables qui polluent
// lenvironnement global.
temporary; // raises ReferenceError
permanent; // = 10
// Une des fonctionnalités les plus puissantes de Javascript est le système de
// closures. Si une fonction est définie dans une autre fonction, alors la
// fonction interne aura accès aux variables de la fonction parente, même si
// celle-ci a déjà finie son exécution.
function sayHelloInFiveSeconds(name){
var prompt = 'Hello, ' + name + '!';
// Fonction interne
function inner(){
alert(prompt);
}
setTimeout(inner, 5000);
// setTimeout is asynchrone, donc la fonction sayHelloInFiveSeconds quittera
// immédiatement, et setTimeout appelera inner après.
}
sayHelloInFiveSeconds('Adam'); // ouvre un popup avec 'Hello, Adam!' dans 5sec
///////////////////////////////////
// 5. Encore plus à propos des Objets; Constructeurs and Prototypes
// Les objets peuvent contenir des fonctions.
var myObj = {
myFunc: function(){
return 'Hello world!';
}
};
myObj.myFunc(); // = 'Hello world!'
// Lorsqu'une fonction attachée à un objet est appelée, elle peut accéder à
// l'objet avec le mot clé this.
myObj = {
myString: 'Hello world!',
myFunc: function(){
return this.myString;
}
};
myObj.myFunc(); // = 'Hello world!'
// La valeur de "this" change de par l'endroit où la fonction est appelée, et
// non de l'endroit où elle est définie. Donc elle ne fonctionnera pas si elle
// est appelée hors du contexte l'objet.
var myFunc = myObj.myFunc;
myFunc(); // = undefined
// A l'inverse, une fonction peut être attachée à un objet et y gagner l'accès
// au travers de "this"
var myOtherFunc = function(){
return this.myString.toUpperCase();
}
myObj.myOtherFunc = myOtherFunc;
myObj.myOtherFunc(); // = 'HELLO WORLD!'
// Le contexte correspond à la valeur de "this".
// Nous pouvons aussi spécifier un contexte, forcer la valeur de "this,
// pour une fonction quand elle est appelée grâce à "call" ou "apply".
var anotherFunc = function(s){
return this.myString + s;
}
anotherFunc.call(myObj, ' And Hello Moon!'); // = 'Hello World! And Hello Moon!'
// 'apply' est presque identique, mais prend un tableau comme liste darguments.
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.apply(Math, [42, 6, 27]); // = 6
// Mais, "call" and "apply" fonctionnenent uniquement au moment de l'appel de la
// fonction. Pour lier le contexte de façon permanente, nous pouvons utiliser
// "bind" pour garder une référence à la fonction avec ce "this".
var boundFunc = anotherFunc.bind(myObj);
boundFunc(' And Hello Saturn!'); // = 'Hello World! And Hello Saturn!'
// "bind" peut aussi être utilisé pour créer une application partielle de la
// fonction (curry)
var product = function(a, b){ return a * b; }
var doubler = product.bind(this, 2);
doubler(8); // = 16
// Lorsque vous appelez une fonction avec le mot clé "new", un nouvel objet est
// crée et mis à disposition de la fonction via "this". Ces fonctions sont
// communément appelées constructeurs.
var MyConstructor = function(){
this.myNumber = 5;
}
myNewObj = new MyConstructor(); // = {myNumber: 5}
myNewObj.myNumber; // = 5
// Chaque objet en Javascript a un "prototype". Quand vous essayez d'accéder à
// une propriété que l'objet n'a pas, l'interpréteur va regarder son prototype.
// Quelques implémentations de JS vous laissent accéder au prototype avec la
// propriété "magique" __proto__. Ceci peut être utile, mais n'est pas standard
// et ne fonctionne pas dans certains des navigateurs actuels.
var myObj = {
myString: 'Hello world!'
};
var myPrototype = {
meaningOfLife: 42,
myFunc: function(){
return this.myString.toLowerCase()
}
};
myObj.__proto__ = myPrototype;
myObj.meaningOfLife; // = 42
myObj.myFunc(); // = 'hello world!'
myPrototype.__proto__ = {
myBoolean: true
};
myObj.myBoolean; // = true
// Pour obtenir le prototype il existe également Object.getPrototypeOf
Object.getPrototypeOf( myObj ) // = {meaningOfLife: 42, myFunc: function}
// Il n'y a pas de copie ici. Chacun des objets stocke une référence à son
// prototype. Cela veut dire que l'on peut le modifier et cela se répercutera
// partout.
myPrototype.meaningOfLife = 43;
myObj.meaningOfLife; // = 43
// L'inverse n'est cependant pas vrai. Changer la propriété d'un objet ne change
// pas la chaine prototypale.
myObj.meaningOfLife = 42;
myPrototype.meaningOfLife; // = 43
// Comme précédemment dit, __proto__ n'est pas standard et ne devrait pas être
// utilisé. Il y a deux autres moyen de créer un nouvel objet avec un prototype
// donné.
// Le premier est Object.create, mais c'est assez récent et risque de ne pas
// fonctionner dans tous les navigateurs.
var myObj = Object.create(myPrototype);
myObj.meaningOfLife; // = 43
// Le deuxième moyen, qui marche partout, fonctionne avec les constructeurs.
// Les constructeurs ont un propriété appelée prototype. Ce n'est *pas* le
// prototype du constructeur de la fonction elle-même, c'est le prototype que
// les nouveaux objets crées grâce à ce constructeur avec "new" auront.
MyConstructor.prototype = {
myNumber: 5,
getMyNumber: function(){
return this.myNumber;
}
};
var myNewObj2 = new MyConstructor();
myNewObj2.getMyNumber(); // = 5
myNewObj2.myNumber = 6
myNewObj2.getMyNumber(); // = 6
// Les types pré-définis tels que les strings ou nombres ont aussi des
// constructeurs
var myNumber = 12;
var myNumberObj = new Number(12);
myNumber == myNumberObj; // = true
// ... mais ils ne sont pas exactement équivalent.
typeof myNumber; // = 'number'
typeof myNumberObj; // = 'object'
myNumber === myNumberObj; // = false
if (0){
// 0 est falsy, le code ne fonctionnera pas.
}
if (Number(0)){
// Parce que Number(0) est truthy, le code fonctionnera
}
// Cependant, vous pouvez ajouter des fonctionnalités aux types de bases grâce à
// cette particularité.
String.prototype.firstCharacter = function(){
return this.charAt(0);
}
'abc'.firstCharacter(); // = 'a'
// C'est très souvent utilisé pour le "polyfilling", qui implémente des nouvelles
// fonctionnalités de JavaScript dans de plus anciens environnements, tels que
// les vieux navigateurs.
//Par exemple, Object.create est assez récent, mais peut être implémenté grâce à
// ce polyfill
if (Object.create === undefined){ // pour ne pas reécrire si la fonction existe déjà
Object.create = function(proto){
// on crée un constructeur temporaire avec le bon prototype
var Constructor = function(){};
Constructor.prototype = proto;
// puis on utilise "new" pour créer un object avec ce même prototype
return new Constructor();
}
}
```
## Pour aller plus loin (en anglais)
The [Mozilla Developer
Network](https://developer.mozilla.org/fr-FR/docs/Web/JavaScript) expose une
excellente documentation pour le Javascript dans les navigateurs. Et contient
également un wiki pour s'entraider.
MDN's [A re-introduction to
JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript)
recouvre les principaux sujets vus ici. Le guide est délibérément uniquement
à propos du JavaScript, et ne parle pas des navigateurs; pour cela, dirigez vous
plutôt ici :
[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) quelques challenges.
[JavaScript Garden](http://bonsaiden.github.io/JavaScript-Garden/) is an in-depth
un guide pour vous éviter les faux-amis dans le JavaScript.
[JavaScript: The Definitive Guide](http://www.amazon.com/gp/product/0596805527/) un classique. A lire.
En addition aux contributeurs de cet article, du contenu provient du
"Python tutorial" de Louie Dinh, et de [JS
Tutorial](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript)
sur le réseau Mozilla.

View File

@ -14,7 +14,7 @@ lang: fr-fr
L'Objective-C est un langage de programmation orienté objet réflexif principalement utilisé par Apple pour les systèmes d'exploitations Mac OS X et iOS et leurs frameworks respectifs, Cocoa et Cocoa Touch. L'Objective-C est un langage de programmation orienté objet réflexif principalement utilisé par Apple pour les systèmes d'exploitations Mac OS X et iOS et leurs frameworks respectifs, Cocoa et Cocoa Touch.
```cpp ```objective_c
// Les commentaires sur une seule ligne commencent par // // Les commentaires sur une seule ligne commencent par //
/* /*

View File

@ -12,7 +12,7 @@ contributors:
- ["Alexej Friesen", "https://github.com/heyalexej"] - ["Alexej Friesen", "https://github.com/heyalexej"]
--- ---
Go was created out of the need to get work done. It's not the latest trend Go was created out of the need to get work done. It's not the latest trend
in computer science, but it is the newest fastest way to solve real-world in computer science, but it is the newest fastest way to solve real-world
problems. problems.
@ -26,7 +26,7 @@ Go comes with a great standard library and an enthusiastic community.
```go ```go
// Single line comment // Single line comment
/* Multi- /* Multi-
line comment */ line comment */
// A package clause starts every source file. // A package clause starts every source file.
// Main is a special name declaring an executable rather than a library. // Main is a special name declaring an executable rather than a library.
@ -41,8 +41,8 @@ import (
"strconv" // String conversions. "strconv" // String conversions.
) )
// A function definition. Main is special. It is the entry point for the // A function definition. Main is special. It is the entry point for the
// executable program. Love it or hate it, Go uses brace brackets. // executable program. Love it or hate it, Go uses brace brackets.
func main() { func main() {
// Println outputs a line to stdout. // Println outputs a line to stdout.
// Qualify it with the package name, fmt. // Qualify it with the package name, fmt.
@ -77,7 +77,7 @@ func learnTypes() {
s2 := `A "raw" string literal s2 := `A "raw" string literal
can include line breaks.` // Same string type. can include line breaks.` // Same string type.
// Non-ASCII literal. Go source is UTF-8. // Non-ASCII literal. Go source is UTF-8.
g := 'Σ' // rune type, an alias for int32, holds a unicode code point. g := 'Σ' // rune type, an alias for int32, holds a unicode code point.
f := 3.14195 // float64, an IEEE-754 64-bit floating point number. f := 3.14195 // float64, an IEEE-754 64-bit floating point number.
@ -92,11 +92,12 @@ can include line breaks.` // Same string type.
// Arrays have size fixed at compile time. // Arrays have size fixed at compile time.
var a4 [4]int // An array of 4 ints, initialized to all 0. var a4 [4]int // An array of 4 ints, initialized to all 0.
a3 := [...]int{3, 1, 5} // An array of 3 ints, initialized as shown. a3 := [...]int{3, 1, 5} // An array initialized with a fixed size of three
// elements, with values 3, 1, and 5.
// Slices have dynamic size. Arrays and slices each have advantages // Slices have dynamic size. Arrays and slices each have advantages
// but use cases for slices are much more common. // but use cases for slices are much more common.
s3 := []int{4, 5, 9} // Compare to a3. No ellipsis here. s3 := []int{4, 5, 9} // Compare to a3. No ellipsis here.
s4 := make([]int, 4) // Allocates slice of 4 ints, initialized to all 0. s4 := make([]int, 4) // Allocates slice of 4 ints, initialized to all 0.
var d2 [][]float64 // Declaration only, nothing allocated here. var d2 [][]float64 // Declaration only, nothing allocated here.
bs := []byte("a slice") // Type conversion syntax. bs := []byte("a slice") // Type conversion syntax.
@ -116,7 +117,7 @@ can include line breaks.` // Same string type.
fmt.Println(s) // Updated slice is now [1 2 3 4 5 6 7 8 9] fmt.Println(s) // Updated slice is now [1 2 3 4 5 6 7 8 9]
p, q := learnMemory() // Declares p, q to be type pointer to int. p, q := learnMemory() // Declares p, q to be type pointer to int.
fmt.Println(*p, *q) // * follows a pointer. This prints two ints. fmt.Println(*p, *q) // * follows a pointer. This prints two ints.
// Maps are a dynamically growable associative array type, like the // Maps are a dynamically growable associative array type, like the
// hash or dictionary types of some other languages. // hash or dictionary types of some other languages.
@ -142,7 +143,7 @@ func learnNamedReturns(x, y int) (z int) {
return // z is implicit here, because we named it earlier. return // z is implicit here, because we named it earlier.
} }
// Go is fully garbage collected. It has pointers but no pointer arithmetic. // Go is fully garbage collected. It has pointers but no pointer arithmetic.
// You can make a mistake with a nil pointer, but not by incrementing a pointer. // You can make a mistake with a nil pointer, but not by incrementing a pointer.
func learnMemory() (p, q *int) { func learnMemory() (p, q *int) {
// Named return values p and q have type pointer to int. // Named return values p and q have type pointer to int.
@ -220,7 +221,7 @@ func learnFlowControl() {
func(a, b int) int { func(a, b int) int {
return (a + b) * 2 return (a + b) * 2
}(10, 2)) // Called with args 10 and 2 }(10, 2)) // Called with args 10 and 2
// => Add + double two numbers: 24 // => Add + double two numbers: 24
// When you need it, you'll love it. // When you need it, you'll love it.
goto love goto love
@ -267,7 +268,7 @@ type pair struct {
x, y int x, y int
} }
// Define a method on type pair. Pair now implements Stringer. // Define a method on type pair. Pair now implements Stringer.
func (p pair) String() string { // p is called the "receiver" func (p pair) String() string { // p is called the "receiver"
// Sprintf is another public function in package fmt. // Sprintf is another public function in package fmt.
// Dot syntax references fields of p. // Dot syntax references fields of p.
@ -275,13 +276,13 @@ func (p pair) String() string { // p is called the "receiver"
} }
func learnInterfaces() { func learnInterfaces() {
// Brace syntax is a "struct literal." It evaluates to an initialized // Brace syntax is a "struct literal". It evaluates to an initialized
// struct. The := syntax declares and initializes p to this struct. // struct. The := syntax declares and initializes p to this struct.
p := pair{3, 4} p := pair{3, 4}
fmt.Println(p.String()) // Call String method of p, of type pair. fmt.Println(p.String()) // Call String method of p, of type pair.
var i Stringer // Declare i of interface type Stringer. var i Stringer // Declare i of interface type Stringer.
i = p // Valid because pair implements Stringer i = p // Valid because pair implements Stringer
// Call String method of i, of type Stringer. Output same as above. // Call String method of i, of type Stringer. Output same as above.
fmt.Println(i.String()) fmt.Println(i.String())
// Functions in the fmt package call the String method to ask an object // Functions in the fmt package call the String method to ask an object
@ -319,7 +320,7 @@ func learnErrorHandling() {
// prints 'strconv.ParseInt: parsing "non-int": invalid syntax' // prints 'strconv.ParseInt: parsing "non-int": invalid syntax'
fmt.Println(err) fmt.Println(err)
} }
// We'll revisit interfaces a little later. Meanwhile, // We'll revisit interfaces a little later. Meanwhile,
learnConcurrency() learnConcurrency()
} }
@ -330,12 +331,12 @@ func inc(i int, c chan int) {
// We'll use inc to increment some numbers concurrently. // We'll use inc to increment some numbers concurrently.
func learnConcurrency() { func learnConcurrency() {
// Same make function used earlier to make a slice. Make allocates and // Same make function used earlier to make a slice. Make allocates and
// initializes slices, maps, and channels. // initializes slices, maps, and channels.
c := make(chan int) c := make(chan int)
// Start three concurrent goroutines. Numbers will be incremented // Start three concurrent goroutines. Numbers will be incremented
// concurrently, perhaps in parallel if the machine is capable and // concurrently, perhaps in parallel if the machine is capable and
// properly configured. All three send to the same channel. // properly configured. All three send to the same channel.
go inc(0, c) // go is a statement that starts a new goroutine. go inc(0, c) // go is a statement that starts a new goroutine.
go inc(10, c) go inc(10, c)
go inc(-805, c) go inc(-805, c)
@ -348,7 +349,7 @@ func learnConcurrency() {
go func() { c <- 84 }() // Start a new goroutine just to send a value. go func() { c <- 84 }() // Start a new goroutine just to send a value.
go func() { cs <- "wordy" }() // Again, for cs this time. go func() { cs <- "wordy" }() // Again, for cs this time.
// Select has syntax like a switch statement but each case involves // Select has syntax like a switch statement but each case involves
// a channel operation. It selects a case at random out of the cases // a channel operation. It selects a case at random out of the cases
// that are ready to communicate. // that are ready to communicate.
select { select {
case i := <-c: // The value received can be assigned to a variable, case i := <-c: // The value received can be assigned to a variable,
@ -358,7 +359,7 @@ func learnConcurrency() {
case <-ccs: // Empty channel, not ready for communication. case <-ccs: // Empty channel, not ready for communication.
fmt.Println("didn't happen.") fmt.Println("didn't happen.")
} }
// At this point a value was taken from either c or cs. One of the two // At this point a value was taken from either c or cs. One of the two
// goroutines started above has completed, the other will remain blocked. // goroutines started above has completed, the other will remain blocked.
learnWebProgramming() // Go does it. You want to do it too. learnWebProgramming() // Go does it. You want to do it too.
@ -397,15 +398,15 @@ func requestServer() {
The root of all things Go is the [official Go web site](http://golang.org/). The root of all things Go is the [official Go web site](http://golang.org/).
There you can follow the tutorial, play interactively, and read lots. There you can follow the tutorial, play interactively, and read lots.
The language definition itself is highly recommended. It's easy to read The language definition itself is highly recommended. It's easy to read
and amazingly short (as language definitions go these days.) and amazingly short (as language definitions go these days.)
You can play around with the code on [Go playground](https://play.golang.org/p/tnWMjr16Mm). Try to change it and run it from your browser! Note that you can use [https://play.golang.org](https://play.golang.org) as a [REPL](https://en.wikipedia.org/wiki/Read-eval-print_loop) to test things and code in your browser, without even installing Go. You can play around with the code on [Go playground](https://play.golang.org/p/tnWMjr16Mm). Try to change it and run it from your browser! Note that you can use [https://play.golang.org](https://play.golang.org) as a [REPL](https://en.wikipedia.org/wiki/Read-eval-print_loop) to test things and code in your browser, without even installing Go.
On the reading list for students of Go is the [source code to the standard On the reading list for students of Go is the [source code to the standard
library](http://golang.org/src/pkg/). Comprehensively documented, it library](http://golang.org/src/pkg/). Comprehensively documented, it
demonstrates the best of readable and understandable Go, Go style, and Go demonstrates the best of readable and understandable Go, Go style, and Go
idioms. Or you can click on a function name in [the idioms. Or you can click on a function name in [the
documentation](http://golang.org/pkg/) and the source code comes up! documentation](http://golang.org/pkg/) and the source code comes up!
Another great resource to learn Go is [Go by example](https://gobyexample.com/). Another great resource to learn Go is [Go by example](https://gobyexample.com/).

View File

@ -14,7 +14,7 @@ R は統計計算用の言語です。
データの取得やクリーニング、統計処理やグラフ作成をするために便利な、たくさんのライブラリがあります。また、LaTeX文書からRコマンドを呼び出すこともできます データの取得やクリーニング、統計処理やグラフ作成をするために便利な、たくさんのライブラリがあります。また、LaTeX文書からRコマンドを呼び出すこともできます
```python ```r
# コメント行は、#で開始します # コメント行は、#で開始します

View File

@ -10,7 +10,7 @@ Markdown was created by John Gruber in 2004. It's meant to be an easy to read an
Give me as much feedback as you want! / Feel free to fork and pull request! Give me as much feedback as you want! / Feel free to fork and pull request!
``` ```markdown
<!-- Markdown is a superset of HTML, so any HTML file is valid Markdown, that <!-- Markdown is a superset of HTML, so any HTML file is valid Markdown, that
means we can use HTML elements in Markdown, such as the comment element, and means we can use HTML elements in Markdown, such as the comment element, and
they won't be affected by a markdown parser. However, if you create an HTML they won't be affected by a markdown parser. However, if you create an HTML

View File

@ -85,7 +85,7 @@ load myFile.mat y % no parentheses, and spaces instead of commas
% Logicals can be applied to matrices: % Logicals can be applied to matrices:
A > 5 A > 5
% for each element, if condition is true, that element is 1 in returned matrix % for each element, if condition is true, that element is 1 in returned matrix
A[ A > 5 ] A( A > 5 )
% returns a vector containing the elements in A for which condition is true % returns a vector containing the elements in A for which condition is true
% Strings % Strings

View File

@ -12,7 +12,7 @@ filename: LearnObjectiveC.m
Objective-C is the main programming language used by Apple for the OS X and iOS operating systems and their respective frameworks, Cocoa and Cocoa Touch. Objective-C is the main programming language used by Apple for the OS X and iOS operating systems and their respective frameworks, Cocoa and Cocoa Touch.
It is a general-purpose, object-oriented programming language that adds Smalltalk-style messaging to the C programming language. It is a general-purpose, object-oriented programming language that adds Smalltalk-style messaging to the C programming language.
```cpp ```objective_c
// Single-line comments start with // // Single-line comments start with //
/* /*

View File

@ -14,7 +14,7 @@ escrever sintaxe que converte facilmente em HTML (hoje, suporta outros formatos
Dê-me feedback tanto quanto você quiser! / Sinta-se livre para a garfar (fork) e Dê-me feedback tanto quanto você quiser! / Sinta-se livre para a garfar (fork) e
puxar o projeto (pull request) puxar o projeto (pull request)
``` ```markdown
<!-- Markdown é um superconjunto do HTML, de modo que qualquer arvquivo HTML é <!-- Markdown é um superconjunto do HTML, de modo que qualquer arvquivo HTML é
um arquivo Markdown válido, isso significa que nós podemos usar elementos HTML um arquivo Markdown válido, isso significa que nós podemos usar elementos HTML
em Markdown, como o elemento de comentário, e eles não serão afetados pelo analisador em Markdown, como o elemento de comentário, e eles não serão afetados pelo analisador

View File

@ -8,7 +8,7 @@ filename: learnr.r
R is a statistical computing language. It has lots of libraries for uploading and cleaning data sets, running statistical procedures, and making graphs. You can also run `R` commands within a LaTeX document. R is a statistical computing language. It has lots of libraries for uploading and cleaning data sets, running statistical procedures, and making graphs. You can also run `R` commands within a LaTeX document.
```python ```r
# Comments start with number symbols. # Comments start with number symbols.

View File

@ -13,11 +13,11 @@ lang: ru-ru
--- ---
Go - это язык общего назначения, целью которого является удобство, простота, Go - это язык общего назначения, целью которого является удобство, простота,
конкуррентность. Это не тренд в компьютерных науках, а новейший и быстрый конкурентность. Это не тренд в компьютерных науках, а новейший и быстрый
способ решать насущные проблемы. способ решать насущные проблемы.
Концепции Go схожи с другими императивными статически типизированными языками. Концепции Go схожи с другими императивными статически типизированными языками.
Быстро компилируется и быстро исполняется, имеет легкие в понимании конструкции Быстро компилируется и быстро исполняется, имеет лёгкие в понимании конструкции
для создания масштабируемых и многопоточных программ. для создания масштабируемых и многопоточных программ.
Может похвастаться отличной стандартной библиотекой и большим комьюнити, полным Может похвастаться отличной стандартной библиотекой и большим комьюнити, полным
@ -57,7 +57,7 @@ func main() {
func beyondHello() { func beyondHello() {
var x int // Переменные должны быть объявлены до их использования. var x int // Переменные должны быть объявлены до их использования.
x = 3 // Присвоение значения переменной. x = 3 // Присвоение значения переменной.
// Краткое определение := позволяет объявить перменную с автоматической // Краткое определение := позволяет объявить переменную с автоматической
// подстановкой типа из значения. // подстановкой типа из значения.
y := 4 y := 4
sum, prod := learnMultiple(x, y) // Функция возвращает два значения. sum, prod := learnMultiple(x, y) // Функция возвращает два значения.
@ -70,7 +70,7 @@ func learnMultiple(x, y int) (sum, prod int) {
return x + y, x * y // Возврат двух значений. return x + y, x * y // Возврат двух значений.
} }
// Некотрые встроенные типы и литералы. // Некоторые встроенные типы и литералы.
func learnTypes() { func learnTypes() {
// Краткое определение переменной говорит само за себя. // Краткое определение переменной говорит само за себя.
s := "Learn Go!" // Тип string. s := "Learn Go!" // Тип string.
@ -97,7 +97,7 @@ func learnTypes() {
// Слайсы (slices) имеют динамическую длину. И массивы, и слайсы имеют свои // Слайсы (slices) имеют динамическую длину. И массивы, и слайсы имеют свои
// преимущества, но слайсы используются гораздо чаще. // преимущества, но слайсы используются гораздо чаще.
s3 := []int{4, 5, 9} // Сравните с a3. Тут нет троеточия. s3 := []int{4, 5, 9} // Сравните с a3, тут нет троеточия.
s4 := make([]int, 4) // Выделение памяти для слайса из 4-х int (нули). s4 := make([]int, 4) // Выделение памяти для слайса из 4-х int (нули).
var d2 [][]float64 // Только объявление, память не выделяется. var d2 [][]float64 // Только объявление, память не выделяется.
bs := []byte("a slice") // Синтаксис приведения типов. bs := []byte("a slice") // Синтаксис приведения типов.
@ -113,7 +113,7 @@ func learnTypes() {
delete(m, "three") // Встроенная функция, удаляет элемент из map-а. delete(m, "three") // Встроенная функция, удаляет элемент из map-а.
// Неиспользуемые переменные в Go являются ошибкой. // Неиспользуемые переменные в Go являются ошибкой.
// Нижнее подчеркивание позволяет игнорировать такие переменные. // Нижнее подчёркивание позволяет игнорировать такие переменные.
_, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs _, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs
// Вывод считается использованием переменной. // Вывод считается использованием переменной.
fmt.Println(s, c, a4, s3, d2, m) fmt.Println(s, c, a4, s3, d2, m)
@ -121,16 +121,16 @@ func learnTypes() {
learnFlowControl() // Идем дальше. learnFlowControl() // Идем дальше.
} }
// У Go есть полноценный сборщик мусора. В нем есть указатели но нет арифметики // У Go есть полноценный сборщик мусора. В нем есть указатели, но нет арифметики
// указателей. Вы можете допустить ошибку с указателем на nil, но не с // указателей. Вы можете допустить ошибку с указателем на nil, но не с
// инкрементацией указателя. // инкрементацией указателя.
func learnMemory() (p, q *int) { func learnMemory() (p, q *int) {
// Именованные возвращаемые значения p и q являются указателями на int. // Именованные возвращаемые значения p и q являются указателями на int.
p = new(int) // Встроенная функция new выделяет память. p = new(int) // Встроенная функция new выделяет память.
// Выделенный int проинициализирован нулем, p больше не содержит nil. // Выделенный int проинициализирован нулём, p больше не содержит nil.
s := make([]int, 20) // Выделение единого блока памяти под 20 int-ов. s := make([]int, 20) // Выделение единого блока памяти под 20 int-ов.
s[3] = 7 // Присвоить значение одному из них. s[3] = 7 // Присвоить значение одному из них.
r := -2 // Определить еще одну локальную переменную. r := -2 // Определить ещё одну локальную переменную.
return &s[3], &r // Амперсанд(&) обозначает получение адреса переменной. return &s[3], &r // Амперсанд(&) обозначает получение адреса переменной.
} }
@ -139,7 +139,7 @@ func expensiveComputation() float64 {
} }
func learnFlowControl() { func learnFlowControl() {
// If-ы всегда требуют наличине фигурных скобок, но не круглых. // If-ы всегда требуют наличие фигурных скобок, но не круглых.
if true { if true {
fmt.Println("told ya") fmt.Println("told ya")
} }
@ -178,7 +178,7 @@ func learnFlowControl() {
} }
// Функции являются замыканиями. // Функции являются замыканиями.
xBig := func() bool { xBig := func() bool {
return x > 10000 // Ссылается на x, объявленый выше switch. return x > 10000 // Ссылается на x, объявленный выше switch.
} }
fmt.Println("xBig:", xBig()) // true (т.к. мы присвоили x = e^10). fmt.Println("xBig:", xBig()) // true (т.к. мы присвоили x = e^10).
x = 1.3e3 // Тут х == 1300 x = 1.3e3 // Тут х == 1300
@ -189,7 +189,7 @@ func learnFlowControl() {
love: love:
learnDefer() // Быстрый обзор важного ключевого слова. learnDefer() // Быстрый обзор важного ключевого слова.
learnInterfaces() // О! Интерфейсы, идем далее. learnInterfaces() // О! Интерфейсы, идём далее.
} }
func learnDefer() (ok bool) { func learnDefer() (ok bool) {
@ -214,7 +214,7 @@ type pair struct {
// Объявление метода для типа pair. Теперь pair реализует интерфейс Stringer. // Объявление метода для типа pair. Теперь pair реализует интерфейс Stringer.
func (p pair) String() string { // p в данном случае называют receiver-ом. func (p pair) String() string { // p в данном случае называют receiver-ом.
// Sprintf еще одна функция из пакета fmt. // Sprintf ещё одна функция из пакета fmt.
// Обращение к полям p через точку. // Обращение к полям p через точку.
return fmt.Sprintf("(%d, %d)", p.x, p.y) return fmt.Sprintf("(%d, %d)", p.x, p.y)
} }
@ -234,7 +234,7 @@ func learnInterfaces() {
fmt.Println(p) // Вывод такой же, что и выше. Println вызывает метод String. fmt.Println(p) // Вывод такой же, что и выше. Println вызывает метод String.
fmt.Println(i) // Вывод такой же, что и выше. fmt.Println(i) // Вывод такой же, что и выше.
learnVariadicParams("Учиться", "учиться", "и еще раз учиться!") learnVariadicParams("Учиться", "учиться", "и ещё раз учиться!")
} }
// Функции могут иметь варьируемое количество параметров. // Функции могут иметь варьируемое количество параметров.
@ -263,22 +263,22 @@ func learnErrorHandling() {
// выведет "strconv.ParseInt: parsing "non-int": invalid syntax" // выведет "strconv.ParseInt: parsing "non-int": invalid syntax"
fmt.Println(err) fmt.Println(err)
} }
// Мы еще обратимся к интерфейсам чуть позже, а пока... // Мы ещё обратимся к интерфейсам чуть позже, а пока...
learnConcurrency() learnConcurrency()
} }
// c это тип данных channel (канал), объект для конкуррентного взаимодействия. // c это тип данных channel (канал), объект для конкурентного взаимодействия.
func inc(i int, c chan int) { func inc(i int, c chan int) {
c <- i + 1 // когда channel слева, <- являтся оператором "отправки". c <- i + 1 // когда channel слева, <- являтся оператором "отправки".
} }
// Будем использовать функцию inc для конкуррентной инкрементации чисел. // Будем использовать функцию inc для конкурентной инкрементации чисел.
func learnConcurrency() { func learnConcurrency() {
// Тот же make, что и в случае со slice. Он предназначен для выделения // Тот же make, что и в случае со slice. Он предназначен для выделения
// памяти и инициализации типов slice, map и channel. // памяти и инициализации типов slice, map и channel.
c := make(chan int) c := make(chan int)
// Старт трех конкуррентных goroutine. Числа будут инкрементированы // Старт трех конкурентных goroutine. Числа будут инкрементированы
// конкуррентно и, может быть параллельно, если машина правильно // конкурентно и, может быть параллельно, если машина правильно
// сконфигурирована и позволяет это делать. Все они будут отправлены в один // сконфигурирована и позволяет это делать. Все они будут отправлены в один
// и тот же канал. // и тот же канал.
go inc(0, c) // go начинает новую горутину. go inc(0, c) // go начинает новую горутину.
@ -291,7 +291,7 @@ func learnConcurrency() {
cs := make(chan string) // другой канал, содержит строки. cs := make(chan string) // другой канал, содержит строки.
cc := make(chan chan string) // канал каналов со строками. cc := make(chan chan string) // канал каналов со строками.
go func() { c <- 84 }() // пуск новой горутины для отправки значения go func() { c <- 84 }() // пуск новой горутины для отправки значения
go func() { cs <- "wordy" }() // еще раз, теперь для cs go func() { cs <- "wordy" }() // ещё раз, теперь для cs
// Select тоже что и switch, но работает с каналами. Он случайно выбирает // Select тоже что и switch, но работает с каналами. Он случайно выбирает
// готовый для взаимодействия канал. // готовый для взаимодействия канал.
select { select {
@ -327,7 +327,7 @@ func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) {
Основа всех основ в Go это [официальный веб сайт](http://golang.org/). Основа всех основ в Go это [официальный веб сайт](http://golang.org/).
Там можно пройти туториал, поиграться с интерактивной средой Go и почитать Там можно пройти туториал, поиграться с интерактивной средой Go и почитать
объемную документацию. объёмную документацию.
Для живого ознакомления рекомендуется почитать исходные коды [стандартной Для живого ознакомления рекомендуется почитать исходные коды [стандартной
библиотеки Go](http://golang.org/src/pkg/). Отлично задокументированная, она библиотеки Go](http://golang.org/src/pkg/). Отлично задокументированная, она

View File

@ -13,7 +13,7 @@ Objective-C — компилируемый объектно-ориентиров
построенный на основе языка Си и парадигм Smalltalk. построенный на основе языка Си и парадигм Smalltalk.
В частности, объектная модель построена в стиле Smalltalk — то есть объектам посылаются сообщения. В частности, объектная модель построена в стиле Smalltalk — то есть объектам посылаются сообщения.
```cpp ```objective_c
// Однострочный комментарий // Однострочный комментарий
/* /*

View File

@ -5,25 +5,29 @@ contributors:
- ["Louie Dinh", "http://ldinh.ca"] - ["Louie Dinh", "http://ldinh.ca"]
translators: translators:
- ["Yury Timofeev", "http://twitter.com/gagar1n"] - ["Yury Timofeev", "http://twitter.com/gagar1n"]
- ["Andre Polykanine", "https://github.com/Oire"]
filename: learnpython-ru.py filename: learnpython-ru.py
--- ---
Язык Python был создан Гвидо ван Россумом в начале 90-х. Сейчас это один из самых популярных Язык Python был создан Гвидо ван Россумом в начале 90-х. Сейчас это один из
языков. Я люблю его за его понятный и доходчивый синтаксис - это почти что исполняемый псевдокод. самых популярных языков. Я люблю его за понятный и доходчивый синтаксис — это
почти что исполняемый псевдокод.
С благодарностью жду ваших отзывов: [@louiedinh](http://twitter.com/louiedinh) или louiedinh [at] [google's email service] С благодарностью жду ваших отзывов: [@louiedinh](http://twitter.com/louiedinh)
или louiedinh [at] [почтовый сервис Google]
Замечание: Эта статья относится к Python 2.7, но должно работать и в Python 2.x. Скоро будет версия и для Python 3! Замечание: Эта статья относится к Python 2.7, но должно работать и в Python 2.x.
Скоро будет версия и для Python 3!
```python ```python
# Однострочные комментарии начинаются с hash-символа. # Однострочные комментарии начинаются с символа решётки.
""" Многострочный текст может быть """ Многострочный текст может быть
записан, используя 3 знака " и обычно используется записан, используя 3 знака " и обычно используется
в качестве комментария в качестве комментария
""" """
#################################################### ####################################################
## 1. Примитивные типы данных и операторов ## 1. Примитивные типы данных и операторы
#################################################### ####################################################
# У вас есть числа # У вас есть числа
@ -36,17 +40,31 @@ filename: learnpython-ru.py
35 / 5 #=> 7 35 / 5 #=> 7
# А вот деление немного сложнее. В этом случае происходит деление # А вот деление немного сложнее. В этом случае происходит деление
# целых чисел и результат автоматически округляется в меньшую сторону. # целых чисел, и результат автоматически округляется в меньшую сторону.
5 / 2 #=> 2 5 / 2 #=> 2
# Чтобы научиться делить, сначала нужно немного узнать о дробных числах. # Чтобы научиться делить, сначала нужно немного узнать о числах
2.0 # Это дробное число # с плавающей запятой.
2.0 # Это число с плавающей запятой
11.0 / 4.0 #=> 2.75 Вооот... Так гораздо лучше 11.0 / 4.0 #=> 2.75 Вооот... Так гораздо лучше
# Результат целочисленного деления округляется в меньшую сторону
# как для положительных, так и для отрицательных чисел.
5 // 3 # => 1
5.0 // 3.0 # => 1.0 # работает и для чисел с плавающей запятой
-5 // 3 # => -2
-5.0 // 3.0 # => -2.0
# Остаток от деления
7 % 3 # => 1
# Возведение в степень
2 ** 4 # => 16
# Приоритет операций указывается скобками # Приоритет операций указывается скобками
(1 + 3) * 2 #=> 8 (1 + 3) * 2 #=> 8
# Логические значения являются примитивами # Логические (булевы) значения являются примитивами
True True
False False
@ -54,15 +72,15 @@ False
not True #=> False not True #=> False
not False #=> True not False #=> True
# Равенство это == # Равенство это ==
1 == 1 #=> True 1 == 1 #=> True
2 == 1 #=> False 2 == 1 #=> False
# Неравенство это != # Неравенство это !=
1 != 1 #=> False 1 != 1 #=> False
2 != 1 #=> True 2 != 1 #=> True
# Еще немного сравнений # Ещё немного сравнений
1 < 10 #=> True 1 < 10 #=> True
1 > 10 #=> False 1 > 10 #=> False
2 <= 2 #=> True 2 <= 2 #=> True
@ -85,9 +103,10 @@ not False #=> True
# Символ % используется для форматирования строк, например: # Символ % используется для форматирования строк, например:
"%s могут быть %s" % ("строки", "интерполированы") "%s могут быть %s" % ("строки", "интерполированы")
# Новый метод форматирования строк - использование метода format. # Новый способ форматирования строк — использование метода format.
# Это предпочитаемый способ. # Это предпочитаемый способ.
"{0} могут быть {1}".format("строки", "форматированы") "{0} могут быть {1}".format("строки", "форматированы")
# Если вы не хотите считать, можете использовать ключевые слова. # Если вы не хотите считать, можете использовать ключевые слова.
"{name} хочет есть {food}".format(name="Боб", food="лазанью") "{name} хочет есть {food}".format(name="Боб", food="лазанью")
@ -95,7 +114,7 @@ not False #=> True
None #=> None None #=> None
# Не используйте оператор равенства '=='' для сравнения # Не используйте оператор равенства '=='' для сравнения
# объектов с None. Используйте для этого 'is' # объектов с None. Используйте для этого «is»
"etc" is None #=> False "etc" is None #=> False
None is None #=> True None is None #=> True
@ -113,17 +132,18 @@ None is None #=> True
## 2. Переменные и коллекции ## 2. Переменные и коллекции
#################################################### ####################################################
# Печатать довольно просто # У Python есть функция Print, доступная в версиях 2.7 и 3,
print "Я Python. Приятно познакомиться!" print("Я Python. Приятно познакомиться!")
# ...и старый оператор print, доступный в версиях 2.x, но удалённый в версии 3.
print "И я тоже Python!"
# Необязательно объявлять переменные перед их инициализацией. # Необязательно объявлять переменные перед их инициализацией.
some_var = 5 # По соглашению используется нижний_регистр_с_подчеркиваниями some_var = 5 # По соглашению используется нижний_регистр_с_подчёркиваниями
some_var #=> 5 some_var #=> 5
# При попытке доступа к неинициализированной переменной, # При попытке доступа к неинициализированной переменной
# выбрасывается исключение. # выбрасывается исключение.
# См. раздел "Поток управления" для информации об исключениях. # См. раздел «Поток управления» для информации об исключениях.
some_other_var # Выбрасывает ошибку именования some_other_var # Выбрасывает ошибку именования
# if может быть использован как выражение # if может быть использован как выражение
@ -149,24 +169,30 @@ li[0] #=> 1
# Обратимся к последнему элементу # Обратимся к последнему элементу
li[-1] #=> 3 li[-1] #=> 3
# Попытка выйти за границы массива приведет к IndexError # Попытка выйти за границы массива приведёт к ошибке индекса
li[4] # Выдает IndexError li[4] # Выдаёт IndexError
# Можно обращаться к диапазону, используя "кусочный синтаксис" (slice syntax) # Можно обращаться к диапазону, используя "кусочный синтаксис" (slice syntax)
# (Для тех, кто любит математику, это называется замкнуто/открытый интервал.) # (Для тех, кто любит математику, это называется замкнуто-открытый интервал).
li[1:3] #=> [2, 4] li[1:3] #=> [2, 4]
# Опускаем начало # Опускаем начало
li[2:] #=> [4, 3] li[2:] #=> [4, 3]
# Опускаем конец # Опускаем конец
li[:3] #=> [1, 2, 4] li[:3] #=> [1, 2, 4]
# Выбираем каждый второй элемент
li[::2] # =>[1, 4]
# Переворачиваем список
li[::-1] # => [3, 4, 2, 1]
# Используйте сочетания всего вышеназванного для выделения более сложных кусков
# li[начало:конец:шаг]
# Удаляем произвольные элементы из списка оператором del # Удаляем произвольные элементы из списка оператором del
del li[2] # [1, 2, 3] del li[2] # [1, 2, 3]
# Вы можете складывать списки # Вы можете складывать списки
li + other_li #=> [1, 2, 3, 4, 5, 6] - Замечание: li и other_li остаются нетронутыми li + other_li #=> [1, 2, 3, 4, 5, 6] — Замечание: li и other_li не изменяются
# Конкатенировать списки можно методом extend # Объединять списки можно методом extend
li.extend(other_li) # Теперь li содержит [1, 2, 3, 4, 5, 6] li.extend(other_li) # Теперь li содержит [1, 2, 3, 4, 5, 6]
# Проверить элемент на вхождение в список можно оператором in # Проверить элемент на вхождение в список можно оператором in
@ -176,12 +202,12 @@ li.extend(other_li) # Теперь li содержит [1, 2, 3, 4, 5, 6]
len(li) #=> 6 len(li) #=> 6
# Кортежи - это такие списки, только неизменяемые # Кортежи это такие списки, только неизменяемые
tup = (1, 2, 3) tup = (1, 2, 3)
tup[0] #=> 1 tup[0] #=> 1
tup[0] = 3 # Выдает TypeError tup[0] = 3 # Выдаёт TypeError
# Все то же самое можно делать и с кортежами # Всё то же самое можно делать и с кортежами
len(tup) #=> 3 len(tup) #=> 3
tup + (4, 5, 6) #=> (1, 2, 3, 4, 5, 6) tup + (4, 5, 6) #=> (1, 2, 3, 4, 5, 6)
tup[:2] #=> (1, 2) tup[:2] #=> (1, 2)
@ -203,33 +229,33 @@ filled_dict = {"one": 1, "two": 2, "three": 3}
# Значения ищутся по ключу с помощью оператора [] # Значения ищутся по ключу с помощью оператора []
filled_dict["one"] #=> 1 filled_dict["one"] #=> 1
# Можно получить все ключи в виде списка # Можно получить все ключи в виде списка с помощью метода keys
filled_dict.keys() #=> ["three", "two", "one"] filled_dict.keys() #=> ["three", "two", "one"]
# Замечание - сохранение порядка ключей в словаре не гарантируется # Замечание: сохранение порядка ключей в словаре не гарантируется
# Ваши результаты могут не совпадать с этими. # Ваши результаты могут не совпадать с этими.
# Можно получить и все значения в виде списка # Можно получить и все значения в виде списка, используйте метод values
filled_dict.values() #=> [3, 2, 1] filled_dict.values() #=> [3, 2, 1]
# То же самое замечание насчет порядка ключей справедливо и здесь # То же самое замечание насчёт порядка ключей справедливо и здесь
# При помощи оператора in можно проверять ключи на вхождение в словарь # При помощи оператора in можно проверять ключи на вхождение в словарь
"one" in filled_dict #=> True "one" in filled_dict #=> True
1 in filled_dict #=> False 1 in filled_dict #=> False
# Попытка получить значение по несуществующему ключу выбросит KeyError # Попытка получить значение по несуществующему ключу выбросит ошибку ключа
filled_dict["four"] # KeyError filled_dict["four"] # KeyError
# Чтобы избежать этого, используйте метод get # Чтобы избежать этого, используйте метод get
filled_dict.get("one") #=> 1 filled_dict.get("one") #=> 1
filled_dict.get("four") #=> None filled_dict.get("four") #=> None
# Метод get также принимает аргумент default, значение которого будет # Метод get также принимает аргумент по умолчанию, значение которого будет
# возвращено при отсутствии указанного ключа # возвращено при отсутствии указанного ключа
filled_dict.get("one", 4) #=> 1 filled_dict.get("one", 4) #=> 1
filled_dict.get("four", 4) #=> 4 filled_dict.get("four", 4) #=> 4
# Метод setdefault - это безопасный способ добавить новую пару ключ-значение в словарь # Метод setdefault вставляет пару ключ-значение, только если такого ключа нет
filled_dict.setdefault("five", 5) #filled_dict["five"] возвращает 5 filled_dict.setdefault("five", 5) #filled_dict["five"] возвращает 5
filled_dict.setdefault("five", 6) #filled_dict["five"] по прежнему возвращает 5 filled_dict.setdefault("five", 6) #filled_dict["five"] по-прежнему возвращает 5
# Множества содержат... ну, в общем, множества # Множества содержат... ну, в общем, множества
@ -237,8 +263,8 @@ empty_set = set()
# Инициализация множества набором значений # Инициализация множества набором значений
some_set = set([1,2,2,3,4]) # some_set теперь равно set([1, 2, 3, 4]) some_set = set([1,2,2,3,4]) # some_set теперь равно set([1, 2, 3, 4])
# Начиная с Python 2.7, вы можете использовать {} чтобы обьявить множество # Начиная с Python 2.7, вы можете использовать {}, чтобы объявить множество
filled_set = {1, 2, 2, 3, 4} # => {1 2 3 4} filled_set = {1, 2, 2, 3, 4} # => {1, 2, 3, 4}
# Добавление новых элементов в множество # Добавление новых элементов в множество
filled_set.add(5) # filled_set равно {1, 2, 3, 4, 5} filled_set.add(5) # filled_set равно {1, 2, 3, 4, 5}
@ -262,33 +288,33 @@ filled_set | other_set #=> {1, 2, 3, 4, 5, 6}
## 3. Поток управления ## 3. Поток управления
#################################################### ####################################################
# Для начала заведем переменную # Для начала заведём переменную
some_var = 5 some_var = 5
# Так выглядит выражение if. Отступы в python очень важны! # Так выглядит выражение if. Отступы в python очень важны!
# результат: "some_var меньше, чем 10" # результат: «some_var меньше, чем 10»
if some_var > 10: if some_var > 10:
print "some_var намного больше, чем 10." print("some_var намного больше, чем 10.")
elif some_var < 10: # Выражение elif необязательно. elif some_var < 10: # Выражение elif необязательно.
print "some_var меньше, чем 10." print("some_var меньше, чем 10.")
else: # Это тоже необязательно. else: # Это тоже необязательно.
print "some_var равно 10." print("some_var равно 10.")
""" """
Циклы For проходят по спискам Циклы For проходят по спискам
Результат: Результат:
собака это млекопитающее собака это млекопитающее
кошка это млекопитающее кошка это млекопитающее
мышь это млекопитающее мышь это млекопитающее
""" """
for animal in ["собака", "кошка", "мышь"]: for animal in ["собака", "кошка", "мышь"]:
# Можете использовать оператор % для интерполяции форматированных строк # Можете использовать оператор % для интерполяции форматированных строк
print "%s это млекопитающее" % animal print("%s — это млекопитающее" % animal)
""" """
`range(number)` возвращает список чисел «range(число)» возвращает список чисел
от нуля до заданного числа от нуля до заданного числа
Результат: Результат:
0 0
@ -297,7 +323,7 @@ for animal in ["собака", "кошка", "мышь"]:
3 3
""" """
for i in range(4): for i in range(4):
print i print(i)
""" """
Циклы while продолжаются до тех пор, пока указанное условие не станет ложным. Циклы while продолжаются до тех пор, пока указанное условие не станет ложным.
@ -309,19 +335,24 @@ for i in range(4):
""" """
x = 0 x = 0
while x < 4: while x < 4:
print x print(x)
x += 1 # То же самое, что x = x + 1 x += 1 # Краткая запись для x = x + 1
# Обрабывайте исключения блоками try/except # Обрабатывайте исключения блоками try/except
# Работает в Python 2.6 и выше: # Работает в Python 2.6 и выше:
try: try:
# Для выбора ошибки используется raise # Чтобы выбросить ошибку, используется raise
raise IndexError("Это IndexError") raise IndexError("Это ошибка индекса")
except IndexError as e: except IndexError as e:
# pass это просто отсутствие оператора. Обычно здесь происходит # pass это просто отсутствие оператора. Обычно здесь происходит
# восстановление от ошибки. # восстановление после ошибки.
pass pass
except (TypeError, NameError):
pass # Несколько исключений можно обработать вместе, если нужно.
else: # Необязательное выражение. Должно следовать за последним блоком except
print("Всё хорошо!") # Выполнится, только если не было никаких исключений
#################################################### ####################################################
@ -330,23 +361,23 @@ except IndexError as e:
# Используйте def для создания новых функций # Используйте def для создания новых функций
def add(x, y): def add(x, y):
print "x равен %s, а y равен %s" % (x, y) print("x равен %s, а y равен %s" % (x, y))
return x + y # Возвращайте результат выражением return return x + y # Возвращайте результат выражением return
# Вызов функции с аргументами # Вызов функции с аргументами
add(5, 6) #=> prints out "x равен 5, а y равен 6" и возвращает 11 add(5, 6) #=> выводит «x равен 5, а y равен 6» и возвращает 11
# Другой способ вызова функции с аргументами # Другой способ вызова функции — вызов с именованными аргументами
add(y=6, x=5) # Именованные аргументы можно указывать в любом порядке. add(y=6, x=5) # Именованные аргументы можно указывать в любом порядке.
# Вы можете определить функцию, принимающую неизвестное количество аргументов # Вы можете определить функцию, принимающую изменяемое число аргументов
def varargs(*args): def varargs(*args):
return args return args
varargs(1, 2, 3) #=> (1,2,3) varargs(1, 2, 3) #=> (1,2,3)
# А также можете определить функцию, принимающую изменяющееся количество # А также можете определить функцию, принимающую изменяемое число
# именованных аргументов # именованных аргументов
def keyword_args(**kwargs): def keyword_args(**kwargs):
return kwargs return kwargs
@ -356,8 +387,8 @@ keyword_args(big="foot", loch="ness") #=> {"big": "foot", "loch": "ness"}
# Если хотите, можете использовать оба способа одновременно # Если хотите, можете использовать оба способа одновременно
def all_the_args(*args, **kwargs): def all_the_args(*args, **kwargs):
print args print(args)
print kwargs print(kwargs)
""" """
all_the_args(1, 2, a=3, b=4) выводит: all_the_args(1, 2, a=3, b=4) выводит:
(1, 2) (1, 2)
@ -368,11 +399,28 @@ all_the_args(1, 2, a=3, b=4) выводит:
# Используйте символ * для передачи кортежей и ** для передачи словарей # Используйте символ * для передачи кортежей и ** для передачи словарей
args = (1, 2, 3, 4) args = (1, 2, 3, 4)
kwargs = {"a": 3, "b": 4} kwargs = {"a": 3, "b": 4}
all_the_args(*args) # эквивалент foo(1, 2, 3, 4) all_the_args(*args) # эквивалентно foo(1, 2, 3, 4)
all_the_args(**kwargs) # эквивалент foo(a=3, b=4) all_the_args(**kwargs) # эквивалентно foo(a=3, b=4)
all_the_args(*args, **kwargs) # эквивалент foo(1, 2, 3, 4, a=3, b=4) all_the_args(*args, **kwargs) # эквивалентно foo(1, 2, 3, 4, a=3, b=4)
# Python имеет функции первого класса # Область определения функций
x = 5
def setX(num):
# Локальная переменная x — это не то же самое, что глобальная переменная x
x = num # => 43
print (x) # => 43
def setGlobalX(num):
global x
print (x) # => 5
x = num # Глобальная переменная x теперь равна 6
print (x) # => 6
setX(43)
setGlobalX(6)
# В Python есть функции первого класса
def create_adder(x): def create_adder(x):
def adder(y): def adder(y):
return x + y return x + y
@ -388,7 +436,7 @@ add_10(3) #=> 13
map(add_10, [1,2,3]) #=> [11, 12, 13] map(add_10, [1,2,3]) #=> [11, 12, 13]
filter(lambda x: x > 5, [3, 4, 5, 6, 7]) #=> [6, 7] filter(lambda x: x > 5, [3, 4, 5, 6, 7]) #=> [6, 7]
# Мы можем использовать списки для удобного отображения и фильтрации # Для удобного отображения и фильтрации можно использовать списочные включения
[add_10(i) for i in [1, 2, 3]] #=> [11, 12, 13] [add_10(i) for i in [1, 2, 3]] #=> [11, 12, 13]
[x for x in [3, 4, 5, 6, 7] if x > 5] #=> [6, 7] [x for x in [3, 4, 5, 6, 7] if x > 5] #=> [6, 7]
@ -402,7 +450,11 @@ class Human(object):
# Атрибут класса. Он разделяется всеми экземплярами этого класса # Атрибут класса. Он разделяется всеми экземплярами этого класса
species = "H. sapiens" species = "H. sapiens"
# Обычный конструктор # Обычный конструктор, вызывается при инициализации экземпляра класса
# Обратите внимание, что двойное подчёркивание в начале и в конце имени
# означает объекты и атрибуты, которые используются Python, но находятся
# в пространствах имён, управляемых пользователем.
# Не придумывайте им имена самостоятельно.
def __init__(self, name): def __init__(self, name):
# Присваивание значения аргумента атрибуту класса name # Присваивание значения аргумента атрибуту класса name
self.name = name self.name = name
@ -423,17 +475,17 @@ class Human(object):
return "*grunt*" return "*grunt*"
# Инстанцирование класса # Инициализация экземпляра класса
i = Human(name="Иван") i = Human(name="Иван")
print i.say("привет") # "Иван: привет" print(i.say("привет")) # Выводит: «Иван: привет»
j = Human("Петр") j = Human("Пётр")
print j.say("Привет") # "Петр: привет" print(j.say("Привет")) # Выводит: «Пётр: привет»
# Вызов метода класса # Вызов метода класса
i.get_species() #=> "H. sapiens" i.get_species() #=> "H. sapiens"
# Присвоение разделяемому атрибуту # Изменение разделяемого атрибута
Human.species = "H. neanderthalensis" Human.species = "H. neanderthalensis"
i.get_species() #=> "H. neanderthalensis" i.get_species() #=> "H. neanderthalensis"
j.get_species() #=> "H. neanderthalensis" j.get_species() #=> "H. neanderthalensis"
@ -448,12 +500,12 @@ Human.grunt() #=> "*grunt*"
# Вы можете импортировать модули # Вы можете импортировать модули
import math import math
print math.sqrt(16) #=> 4 print(math.sqrt(16)) #=> 4
# Вы можете импортировать отдельные функции модуля # Вы можете импортировать отдельные функции модуля
from math import ceil, floor from math import ceil, floor
print ceil(3.7) #=> 4.0 print(ceil(3.7)) #=> 4.0
print floor(3.7) #=> 3.0 print(floor(3.7)) #=> 3.0
# Можете импортировать все функции модуля. # Можете импортировать все функции модуля.
# (Хотя это и не рекомендуется) # (Хотя это и не рекомендуется)
@ -463,7 +515,7 @@ from math import *
import math as m import math as m
math.sqrt(16) == m.sqrt(16) #=> True math.sqrt(16) == m.sqrt(16) #=> True
# Модули в Python это обычные файлы с кодом python. Вы # Модули в Python — это обычные Python-файлы. Вы
# можете писать свои модули и импортировать их. Название # можете писать свои модули и импортировать их. Название
# модуля совпадает с названием файла. # модуля совпадает с названием файла.
@ -472,18 +524,72 @@ math.sqrt(16) == m.sqrt(16) #=> True
import math import math
dir(math) dir(math)
####################################################
## 7. Дополнительно
####################################################
# Генераторы помогут выполнить ленивые вычисления
def double_numbers(iterable):
for i in iterable:
yield i + i
# Генератор создаёт значения на лету.
# Он не возвращает все значения разом, а создаёт каждое из них при каждой
# итерации. Это значит, что значения больше 15 в double_numbers
# обработаны не будут.
# Обратите внимание: xrange — это генератор, который делает то же, что и range.
# Создание списка чисел от 1 до 900000000 требует много места и времени.
# xrange создаёт объект генератора, а не список сразу, как это делает range.
# Если нам нужно имя переменной, совпадающее с ключевым словом Python,
# мы используем подчёркивание в конце
xrange_ = xrange(1, 900000000)
# Будет удваивать все числа, пока результат не будет >= 30
for i in double_numbers(xrange_):
print(i)
if i >= 30:
break
# Декораторы
# В этом примере beg оборачивает say
# Метод beg вызовет say. Если say_please равно True,
# он изменит возвращаемое сообщение
from functools import wraps
def beg(target_function):
@wraps(target_function)
def wrapper(*args, **kwargs):
msg, say_please = target_function(*args, **kwargs)
if say_please:
return "{} {}".format(msg, " Пожалуйста! У меня нет денег :(")
return msg
return wrapper
@beg
def say(say_please=False):
msg = "Вы не купите мне пива?"
return msg, say_please
print(say()) # Вы не купите мне пива?
print(say(say_please=True)) # Вы не купите мне пива? Пожалуйста! У меня нет денег :(
``` ```
## Хотите еще? ## Хотите ещё?
### Бесплатные онлайн-материалы ### Бесплатные онлайн-материалы
* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/) * [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)
* [Dive Into Python](http://www.diveintopython.net/) * [Dive Into Python](http://www.diveintopython.net/)
* [The Official Docs](http://docs.python.org/2.6/) * [Официальная документация](http://docs.python.org/2.6/)
* [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/) * [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/)
* [Python Module of the Week](http://pymotw.com/2/) * [Python Module of the Week](http://pymotw.com/2/)
* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182)
### Платные ### Платные

View File

@ -9,6 +9,7 @@ contributors:
- ["Nick LaMuro", "https://github.com/NickLaMuro"] - ["Nick LaMuro", "https://github.com/NickLaMuro"]
- ["Marcos Brizeno", "http://www.about.me/marcosbrizeno"] - ["Marcos Brizeno", "http://www.about.me/marcosbrizeno"]
- ["Ariel Krakowski", "http://www.learneroo.com"] - ["Ariel Krakowski", "http://www.learneroo.com"]
- ["Dzianis Dashkevich", "https://github.com/dskecse"]
--- ---
@ -35,7 +36,7 @@ You shouldn't either
8 - 1 #=> 7 8 - 1 #=> 7
10 * 2 #=> 20 10 * 2 #=> 20
35 / 5 #=> 7 35 / 5 #=> 7
2 ** 5 #=> 32 2**5 #=> 32
# Arithmetic is just syntactic sugar # Arithmetic is just syntactic sugar
# for calling a method on an object # for calling a method on an object
@ -78,14 +79,17 @@ false.class #=> FalseClass
'I am a string'.class #=> String 'I am a string'.class #=> String
"I am a string too".class #=> String "I am a string too".class #=> String
placeholder = "use string interpolation" placeholder = 'use string interpolation'
"I can #{placeholder} when using double quoted strings" "I can #{placeholder} when using double quoted strings"
#=> "I can use string interpolation when using double quoted strings" #=> "I can use string interpolation when using double quoted strings"
# Prefer single quoted strings to double quoted ones where possible
# Double quoted strings perform additional inner calculations
# Combine strings, but not with numbers # Combine strings, but not with numbers
"hello " + "world" #=> "hello world" 'hello ' + 'world' #=> "hello world"
"hello " + 3 #=> TypeError: can't convert Fixnum into String 'hello ' + 3 #=> TypeError: can't convert Fixnum into String
"hello " + 3.to_s #=> "hello 3" 'hello ' + 3.to_s #=> "hello 3"
# print to the output # print to the output
puts "I'm printing!" puts "I'm printing!"
@ -130,7 +134,7 @@ array = [1, 2, 3, 4, 5] #=> [1, 2, 3, 4, 5]
# Arrays can contain different types of items # Arrays can contain different types of items
[1, "hello", false] #=> [1, "hello", false] [1, 'hello', false] #=> [1, "hello", false]
# Arrays can be indexed # Arrays can be indexed
# From the front # From the front
@ -157,7 +161,7 @@ array << 6 #=> [1, 2, 3, 4, 5, 6]
# Hashes are Ruby's primary dictionary with keys/value pairs. # Hashes are Ruby's primary dictionary with keys/value pairs.
# Hashes are denoted with curly braces: # Hashes are denoted with curly braces:
hash = {'color' => 'green', 'number' => 5} hash = { 'color' => 'green', 'number' => 5 }
hash.keys #=> ['color', 'number'] hash.keys #=> ['color', 'number']
@ -170,7 +174,7 @@ hash['nothing here'] #=> nil
# Since Ruby 1.9, there's a special syntax when using symbols as keys: # Since Ruby 1.9, there's a special syntax when using symbols as keys:
new_hash = { defcon: 3, action: true} new_hash = { defcon: 3, action: true }
new_hash.keys #=> [:defcon, :action] new_hash.keys #=> [:defcon, :action]
@ -180,11 +184,11 @@ new_hash.keys #=> [:defcon, :action]
# Control structures # Control structures
if true if true
"if statement" 'if statement'
elsif false elsif false
"else if, optional" 'else if, optional'
else else
"else, also optional" 'else, also optional'
end end
for counter in 1..5 for counter in 1..5
@ -216,7 +220,7 @@ end
#=> iteration 5 #=> iteration 5
# You can also surround blocks in curly brackets: # You can also surround blocks in curly brackets:
(1..5).each {|counter| puts "iteration #{counter}"} (1..5).each { |counter| puts "iteration #{counter}" }
# The contents of data structures can also be iterated using each. # The contents of data structures can also be iterated using each.
array.each do |element| array.each do |element|
@ -241,32 +245,30 @@ grade = 'B'
case grade case grade
when 'A' when 'A'
puts "Way to go kiddo" puts 'Way to go kiddo'
when 'B' when 'B'
puts "Better luck next time" puts 'Better luck next time'
when 'C' when 'C'
puts "You can do better" puts 'You can do better'
when 'D' when 'D'
puts "Scraping through" puts 'Scraping through'
when 'F' when 'F'
puts "You failed!" puts 'You failed!'
else else
puts "Alternative grading system, eh?" puts 'Alternative grading system, eh?'
end end
#=> "Better luck next time" #=> "Better luck next time"
# cases can also use ranges # cases can also use ranges
grade = 82 grade = 82
case grade case grade
when 90..100 when 90..100
puts "Hooray!" puts 'Hooray!'
when 80...90 when 80...90
puts "OK job" puts 'OK job'
else else
puts "You failed!" puts 'You failed!'
end end
#=> "OK job" #=> "OK job"
@ -284,23 +286,23 @@ double 3 #=> 6
double double 3 #=> 12 double double 3 #=> 12
def sum(x,y) def sum(x, y)
x + y x + y
end end
# Method arguments are separated by a comma # Method arguments are separated by a comma
sum 3, 4 #=> 7 sum 3, 4 #=> 7
sum sum(3,4), 5 #=> 12 sum sum(3, 4), 5 #=> 12
# yield # yield
# All methods have an implicit, optional block parameter # All methods have an implicit, optional block parameter
# it can be called with the 'yield' keyword # it can be called with the 'yield' keyword
def surround def surround
puts "{" puts '{'
yield yield
puts "}" puts '}'
end end
surround { puts 'hello world' } surround { puts 'hello world' }
@ -313,23 +315,23 @@ surround { puts 'hello world' }
# You can pass a block to a function # You can pass a block to a function
# "&" marks a reference to a passed block # "&" marks a reference to a passed block
def guests(&block) def guests(&block)
block.call "some_argument" block.call 'some_argument'
end end
# You can pass a list of arguments, which will be converted into an array # You can pass a list of arguments, which will be converted into an array
# That's what splat operator ("*") is for # That's what splat operator ("*") is for
def guests(*array) def guests(*array)
array.each { |guest| puts "#{guest}" } array.each { |guest| puts guest }
end end
# Define a class with the class keyword # Define a class with the class keyword
class Human class Human
# A class variable. It is shared by all instances of this class. # A class variable. It is shared by all instances of this class.
@@species = "H. sapiens" @@species = 'H. sapiens'
# Basic initializer # Basic initializer
def initialize(name, age=0) def initialize(name, age = 0)
# Assign the argument to the "name" instance variable for the instance # Assign the argument to the "name" instance variable for the instance
@name = name @name = name
# If no age given, we will fall back to the default in the arguments list. # If no age given, we will fall back to the default in the arguments list.
@ -356,20 +358,19 @@ class Human
# A class method uses self to distinguish from instance methods. # A class method uses self to distinguish from instance methods.
# It can only be called on the class, not an instance. # It can only be called on the class, not an instance.
def self.say(msg) def self.say(msg)
puts "#{msg}" puts msg
end end
def species def species
@@species @@species
end end
end end
# Instantiate a class # Instantiate a class
jim = Human.new("Jim Halpert") jim = Human.new('Jim Halpert')
dwight = Human.new("Dwight K. Schrute") dwight = Human.new('Dwight K. Schrute')
# Let's call a couple of methods # Let's call a couple of methods
jim.species #=> "H. sapiens" jim.species #=> "H. sapiens"
@ -380,7 +381,7 @@ dwight.species #=> "H. sapiens"
dwight.name #=> "Dwight K. Schrute" dwight.name #=> "Dwight K. Schrute"
# Call the class method # Call the class method
Human.say("Hi") #=> "Hi" Human.say('Hi') #=> "Hi"
# Variable's scopes are defined by the way we name them. # Variable's scopes are defined by the way we name them.
# Variables that start with $ have global scope # Variables that start with $ have global scope
@ -399,7 +400,7 @@ defined? @@var #=> "class variable"
Var = "I'm a constant" Var = "I'm a constant"
defined? Var #=> "constant" defined? Var #=> "constant"
# Class also is object in ruby. So class can have instance variables. # Class is also an object in ruby. So class can have instance variables.
# Class variable is shared among the class and all of its descendants. # Class variable is shared among the class and all of its descendants.
# base class # base class
@ -415,7 +416,7 @@ class Human
end end
end end
# derived class # derived class
class Worker < Human class Worker < Human
end end
@ -451,8 +452,8 @@ module ModuleExample
end end
end end
# Including modules binds the methods to the object instance # Including modules binds their methods to the class instances
# Extending modules binds the methods to the class instance # Extending modules binds their methods to the class itself
class Person class Person
include ModuleExample include ModuleExample
@ -467,7 +468,7 @@ Person.new.foo # => 'foo'
Book.foo # => 'foo' Book.foo # => 'foo'
Book.new.foo # => NoMethodError: undefined method `foo' Book.new.foo # => NoMethodError: undefined method `foo'
# Callbacks when including and extending a module are executed # Callbacks are executed when including and extending a module
module ConcernExample module ConcernExample
def self.included(base) def self.included(base)
@ -504,5 +505,4 @@ Something.new.qux # => 'qux'
- [Official Documentation](http://www.ruby-doc.org/core-2.1.1/) - [Official Documentation](http://www.ruby-doc.org/core-2.1.1/)
- [Ruby from other languages](https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/) - [Ruby from other languages](https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/)
- [Programming Ruby](http://www.amazon.com/Programming-Ruby-1-9-2-0-Programmers/dp/1937785491/) - An older [free addition](http://ruby-doc.com/docs/ProgrammingRuby/) is available online. - [Programming Ruby](http://www.amazon.com/Programming-Ruby-1-9-2-0-Programmers/dp/1937785491/) - An older [free addition](http://ruby-doc.com/docs/ProgrammingRuby/) is available online.
- [Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide) - A community-driven Ruby coding style guide.

View File

@ -9,7 +9,7 @@ filename: learn.scala
Scala - the scalable language Scala - the scalable language
```cpp ```scala
/* /*
Set yourself up: Set yourself up:

View File

@ -2,30 +2,51 @@
language: swift language: swift
contributors: contributors:
- ["Grant Timmerman", "http://github.com/grant"] - ["Grant Timmerman", "http://github.com/grant"]
- ["Christopher Bess", "http://github.com/cbess"]
filename: learnswift.swift 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 beta.
The official [Swift Programming Language](https://itunes.apple.com/us/book/swift-programming-language/id881256329) book from Apple is now available via iBooks.
See also Apple's [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html), which has a complete tutorial on Swift. See also Apple's [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html), which has a complete tutorial on Swift.
```js ```swift
// //
// Basics // MARK: Basics
// //
// 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
println("Hello, world") println("Hello, world")
var myVariable = 42 var myVariable = 42
let øπΩ = "value" // unicode variable names
let myConstant = 3.1415926 let myConstant = 3.1415926
let convenience = "keyword" // contextual variable name
let weak = "keyword"; let override = "another keyword" // statements can be separated by a semi-colon
let `class` = "keyword" // backticks allow keywords to be used as variable names
let explicitDouble: Double = 70 let explicitDouble: Double = 70
let label = "some text " + String(myVariable) // Casting let intValue = 0007 // 7
let piText = "Pi = \(myConstant)" // String interpolation let largeIntValue = 77_000 // 77000
var optionalString: String? = "optional" // Can be nil let label = "some text " + String(myVariable) // Casting
let piText = "Pi = \(myConstant), Pi 2 = \(myConstant * 2)" // String interpolation
var optionalString: String? = "optional" // Can be nil
optionalString = nil optionalString = nil
/*
Comment here
/*
Nested comments are also supported
*/
*/
// //
// Arrays and Dictionaries // MARK: Collections
// //
// Array // Array
@ -35,97 +56,108 @@ let emptyArray = [String]()
// Dictionary // Dictionary
var occupations = [ var occupations = [
"Malcolm": "Captain", "Malcolm": "Captain",
"kaylee": "Mechanic" "kaylee": "Mechanic"
] ]
occupations["Jayne"] = "Public Relations" occupations["Jayne"] = "Public Relations"
let emptyDictionary = [String: Float]() let emptyDictionary = [String: Float]()
// //
// Control Flow // MARK: Control Flow
// //
// for loop (array) // for loop (array)
let myArray = [1, 1, 2, 3, 5] let myArray = [1, 1, 2, 3, 5]
for value in myArray { for value in myArray {
if value == 1 { if value == 1 {
println("One!") println("One!")
} else { } else {
println("Not one!") println("Not one!")
} }
} }
// for loop (dictionary) // for loop (dictionary)
var dict = ["one": 1, "two": 2]
for (key, value) in dict { for (key, value) in dict {
println("\(key): \(value)") println("\(key): \(value)")
} }
// for loop (range) // for loop (range)
for i in -1...1 { // [-1, 0, 1] for i in -1...1 { // [-1, 0, 1]
println(i) println(i)
} }
// use ..< to exclude the last number // use ..< to exclude the last number
// while loop // while loop
var i = 1 var i = 1
while i < 1000 { while i < 1000 {
i *= 2 i *= 2
} }
// do-while loop // do-while loop
do { do {
println("hello") println("hello")
} while 1 == 2 } while 1 == 2
// Switch // Switch
let vegetable = "red pepper" let vegetable = "red pepper"
switch vegetable { switch vegetable {
case "celery": case "celery":
let vegetableComment = "Add some raisins and make ants on a log." let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress": case "cucumber", "watercress":
let vegetableComment = "That would make a good tea sandwich." let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"): case let x where x.hasSuffix("pepper"):
let vegetableComment = "Is it a spicy \(x)?" let vegetableComment = "Is it a spicy \(x)?"
default: // required (in order to cover all possible input) default: // required (in order to cover all possible input)
let vegetableComment = "Everything tastes good in soup." let vegetableComment = "Everything tastes good in soup."
} }
// //
// Functions // MARK: Functions
// //
// Functions are a first-class type, meaning they can be nested // Functions are a first-class type, meaning they can be nested
// in functions and can be passed around // in functions and can be passed around
// Function // Function with Swift header docs (format as reStructedText)
/**
A greet operation
- 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.
*/
func greet(name: String, day: String) -> String { func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)." return "Hello \(name), today is \(day)."
} }
greet("Bob", "Tuesday") greet("Bob", "Tuesday")
// Function that returns multiple items in a tuple // Function that returns multiple items in a tuple
func getGasPrices() -> (Double, Double, Double) { func getGasPrices() -> (Double, Double, Double) {
return (3.59, 3.69, 3.79) return (3.59, 3.69, 3.79)
} }
// Args // Variadic Args
func setup(numbers: Int...) {} func setup(numbers: Int...) {}
// Passing and returning functions // Passing and returning functions
func makeIncrementer() -> (Int -> Int) { func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int { func addOne(number: Int) -> Int {
return 1 + number return 1 + number
} }
return addOne return addOne
} }
var increment = makeIncrementer() var increment = makeIncrementer()
increment(7) increment(7)
// //
// Closures // MARK: Closures
// //
var numbers = [1, 2, 6] var numbers = [1, 2, 6]
@ -135,93 +167,243 @@ var numbers = [1, 2, 6]
// `->` separates the arguments and return type // `->` separates the arguments and return type
// `in` separates the closure header from the closure body // `in` separates the closure header from the closure body
numbers.map({ numbers.map({
(number: Int) -> Int in (number: Int) -> Int in
let result = 3 * number let result = 3 * number
return result return result
}) })
// When the type is known, like above, we can do this // When the type is known, like above, we can do this
numbers = numbers.map({ number in 3 * number }) numbers = numbers.map({ number in 3 * number })
//Or even this // Or even this
//numbers = numbers.map({ $0 * 3 }) //numbers = numbers.map({ $0 * 3 })
print(numbers) // [3, 6, 18] print(numbers) // [3, 6, 18]
// Trailing closure
numbers = sorted(numbers) { $0 > $1 }
print(numbers) // [18, 6, 3]
// Super shorthand, since the < operator infers the types
numbers = sorted(numbers, < )
print(numbers) // [3, 6, 18]
// //
// Classes // MARK: Structures
// //
// Structures and classes have very similar capabilites
struct NamesTable {
let names: [String]
// Custom subscript
subscript(index: Int) -> String {
return names[index]
}
}
// 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
//
// MARK: Classes
//
// Classes, structures and its members have three levels of access control
// They are: internal (default), public, private
public class Shape {
public func getArea() -> Int {
return 0;
}
}
// All methods and properties of a class are public. // All methods and properties of a class are public.
// If you just need to store data in a // If you just need to store data in a
// structured object, you should use a `struct` // structured object, you should use a `struct`
// A simple class `Square` extends `Shape` internal class Rect: Shape {
class Square: Shape { var sideLength: Int = 1
var sideLength: Int = 1
// Custom getter and setter property // Custom getter and setter property
var perimeter: Int { private var perimeter: Int {
get { get {
return 4 * sideLength return 4 * sideLength
}
set {
// `newValue` is an implicit variable available to setters
sideLength = newValue / 4
}
} }
set {
sideLength = newValue / 4 // Lazily load a property
// subShape remains nil (uninitialized) until getter called
lazy var subShape = Rect(sideLength: 4)
// If you don't need a custom getter and setter,
// but still want to run code before and after getting or setting
// a property, you can use `willSet` and `didSet`
var identifier: String = "defaultID" {
// the `willSet` arg will be the variable name for the new value
willSet(someIdentifier) {
print(someIdentifier)
}
} }
}
init(sideLength: Int) { init(sideLength: Int) {
super.init() super.init()
self.sideLength = sideLength self.sideLength = sideLength
}
func shrink() {
if sideLength > 0 {
--sideLength
} }
}
override func getArea() -> Int { func shrink() {
return sideLength * sideLength if sideLength > 0 {
} --sideLength
}
}
override func getArea() -> Int {
return sideLength * sideLength
}
} }
var mySquare = new Square(sideLength: 5)
// A simple class `Square` extends `Rect`
class Square: Rect {
convenience init() {
self.init(sideLength: 5)
}
}
var mySquare = Square()
print(mySquare.getArea()) // 25 print(mySquare.getArea()) // 25
mySquare.shrink() mySquare.shrink()
print(mySquare.sideLength) // 4 print(mySquare.sideLength) // 4
// If you don't need a custom getter and setter, // compare instances, not the same as == which compares objects (equal to)
// but still want to run code before and after getting or setting if mySquare === mySquare {
// a property, you can use `willSet` and `didSet` println("Yep, it's mySquare")
}
// //
// Enums // MARK: Enums
// //
// Enums can optionally be of a specific type or on their own. // Enums can optionally be of a specific type or on their own.
// They can contain methods like classes. // They can contain methods like classes.
enum Suit { enum Suit {
case Spades, Hearts, Diamonds, Clubs case Spades, Hearts, Diamonds, Clubs
func getIcon() -> String { func getIcon() -> String {
switch self { switch self {
case .Spades: return "♤" case .Spades: return "♤"
case .Hearts: return "♡" case .Hearts: return "♡"
case .Diamonds: return "♢" case .Diamonds: return "♢"
case .Clubs: return "♧" case .Clubs: return "♧"
}
} }
}
} }
// //
// Other // MARK: Protocols
// //
// `protocol`: Similar to Java interfaces. // `protocol`s can require that conforming types have specific
// `extension`s: Add extra functionality to an already created type // instance properties, instance methods, type methods,
// operators, and subscripts.
protocol ShapeGenerator {
var enabled: Bool { get set }
func buildShape() -> Shape
}
/*
// Protocols declared with @objc allow optional functions,
// which allow you to check for conformance
@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
self.delegate?.reshaped?()
}
}
}
*/
//
// MARK: Other
//
// `extension`s: Add extra functionality to an already existing type
// Square now "conforms" to the `Printable` protocol
extension Square: Printable {
var description: String {
return "Area: \(self.getArea()) - ID: \(self.identifier)"
}
}
println("Square: \(mySquare)")
// You can also extend built-in types
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 to Java. Use the `where` keyword to specify the // Generics: Similar to Java. Use the `where` keyword to specify the
// requirements of the generics. // requirements of the generics.
func findIndex<T: Equatable>(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
// Operators:
// Custom operators can start with the characters:
// / = - + * % < > ! & | ^ . ~
// or
// Unicode math, symbol, arrow, dingbat, and line/box drawing characters.
prefix operator !!! {}
// A prefix operator that triples the side length when used
prefix func !!! (inout shape: Square) -> Square {
shape.sideLength *= 3
return shape
}
// current value
println(mySquare.sideLength) // 4
// change side length using custom !!! operator, increases size by 3
!!!mySquare
println(mySquare.sideLength) // 12
``` ```

View File

@ -14,7 +14,7 @@ kendi çatıları olan Cocoa ve Cocoa Touch için kullanılan bir programlama di
Genel açamlı, object-oriented bir yapıya sahip programlama dilidir. C Genel açamlı, object-oriented bir yapıya sahip programlama dilidir. C
programlama diline Smalltalk stilinde mesajlaşma ekler. programlama diline Smalltalk stilinde mesajlaşma ekler.
```cpp ```objective_c
// Tek satır yorum // işaretleri ile başlar // Tek satır yorum // işaretleri ile başlar
/* /*

View File

@ -13,7 +13,7 @@ This article will focus only on TypeScript extra syntax, as oposed to [JavaScrip
To test TypeScript's compiler, head to the [Playground] (http://www.typescriptlang.org/Playground) where you will be able to type code, have auto completion and directly see the emitted JavaScript. To test TypeScript's compiler, head to the [Playground] (http://www.typescriptlang.org/Playground) where you will be able to type code, have auto completion and directly see the emitted JavaScript.
```ts ```js
//There are 3 basic types in TypeScript //There are 3 basic types in TypeScript
var isDone: boolean = false; var isDone: boolean = false;
var lines: number = 42; var lines: number = 42;

View File

@ -12,7 +12,7 @@ filename: LearnObjectiveC-vi.m
Objective-C là ngôn ngữ lập trình chính được sử dụng bởi Apple cho các hệ điều hành OS X, iOS và các framework tương ứng của họ, Cocoa và Cocoa Touch. Objective-C là ngôn ngữ lập trình chính được sử dụng bởi Apple cho các hệ điều hành OS X, iOS và các framework tương ứng của họ, Cocoa và Cocoa Touch.
Nó là một ngôn ngữ lập trình mục đích tổng quát, hướng đối tượng có bổ sung thêm kiểu truyền thông điệp giống Smalltalk vào ngôn ngữ lập trình C. Nó là một ngôn ngữ lập trình mục đích tổng quát, hướng đối tượng có bổ sung thêm kiểu truyền thông điệp giống Smalltalk vào ngôn ngữ lập trình C.
```cpp ```objective_c
// Chú thích dòng đơn bắt đầu với // // Chú thích dòng đơn bắt đầu với //
/* /*

View File

@ -17,7 +17,7 @@ ANSI Common Lisp 是一个广泛通用于各个工业领域的、支持多种范
另外还有一本热门的近期出版的 另外还有一本热门的近期出版的
[Land of Lisp](http://landoflisp.com/). [Land of Lisp](http://landoflisp.com/).
```scheme ```common-lisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 0. 语法 ;;; 0. 语法
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -9,6 +9,7 @@ contributors:
- ["Amr Tamimi", "https://amrtamimi.com"] - ["Amr Tamimi", "https://amrtamimi.com"]
translators: translators:
- ["Jakukyo Friel", "http://weakish.github.io"] - ["Jakukyo Friel", "http://weakish.github.io"]
filename: lua-cn.lua
--- ---
```lua ```lua

View File

@ -0,0 +1,240 @@
---
language: Markdown
contributors:
- ["Dan Turkel", "http://danturkel.com/"]
translators:
- ["Fangzhou Chen","https://github.com/FZSS"]
filename: learnmarkdown-cn.md
lang: zh-cn
---
Markdown 由 John Gruber 于 2004年创立. 它旨在成为一门容易读写的语法结构,并可以便利地转换成 HTML以及其他很多格式。
欢迎您多多反馈以及分支和请求合并。
```markdown
<!-- Markdown 是 HTML 的父集,所以任何 HTML 文件都是有效的 Markdown。
这意味着我们可以在 Markdown 里使用任何 HTML 元素,比如注释元素,
且不会被 Markdown 解析器所影响。不过如果你在 Markdown 文件内创建了 HTML 元素,
你将无法在 HTML 元素的内容中使用 Markdown 语法。-->
<!-- 在不同的解析器中Markdown 的实现方法有所不同。
此教程会指出当某功能是否通用及是否只对某一解析器有效。 -->
<!-- 标头 -->
<!-- 通过在文本前加上不同数量的hash(#), 你可以创建相对应的 <h1>
<h6> HTML元素。-->
# 这是一个 <h1>
## 这是一个 <h2>
### 这是一个 <h3>
#### 这是一个 <h4>
##### 这是一个 <h5>
###### 这是一个 <h6>
<!-- 对于 <h1> 和 <h2> 元素Markdown 额外提供了两种添加方式。 -->
这是一个 h1
=============
这是一个 h2
-------------
<!-- 简易文本样式 -->
<!-- 文本的斜体,粗体,和删除线在 Markdown 中可以轻易地被实现。-->
*此文本为斜体。*
_此文本也是。_
**此文本为粗体。**
__此文本也是__
***此文本是斜体加粗体。***
**_或者这样。_**
*__这个也是__*
<!-- 在 Github 采用的 Markdown 中 -->
~~此文本为删除线效果。~~
<!-- 单个段落由一句或多句邻近的句子组成,这些句子由一个或多个空格分隔。-->
这是第一段落. 这句话在同一个段落里,好玩么?
现在我是第二段落。
这句话也在第二段落!
这句话在第三段落!
<!-- 如果你插入一个 HTML中的<br />标签,你可以在段末加入两个以上的空格,
然后另起一段。-->
此段落结尾有两个空格(选中以显示)。
上文有一个 <br />
<!-- 段落引用可由 > 字符轻松实现。-->
> 这是一个段落引用. 你可以
> 手动断开你的句子,然后在每句句子前面添加 “>” 字符。或者让你的句子变得很长,以至于他们自动得断开。
> 只要你的文字以“>” 字符开头,两种方式无异。
> 你也对文本进行
>> 多层引用
> 这多机智啊!
<!-- 序列 -->
<!-- 无序序列可由星号,加号或者减号来建立 -->
* 项目
* 项目
* 另一个项目
或者
+ 项目
+ 项目
+ 另一个项目
或者
- 项目
- 项目
- 最后一个项目
<!-- 有序序列可由数字加点来实现 -->
1. 项目一
2. 项目二
3. 项目三
<!-- 即使你的标签数字有误Markdown 依旧会呈现出正确的序号,
不过这并不是一个好主意-->
1. 项目一
1. 项目二
1. 项目三
<!-- (此段与前例一模一样) -->
<!-- 你也可以使用子序列 -->
1. 项目一
2. 项目二
3. 项目三
* 子项目
* 子项目
4. 项目四
<!-- 代码段落 -->
<!-- 代码段落HTML中 <code>标签可以由缩进四格spaces
或者一个标签页tab实现-->
This is code
So is this
<!-- 在你的代码中你仍然使用tab可以进行缩进操作 -->
my_array.each do |item|
puts item
end
<!-- 内联代码可由反引号 ` 实现 -->
John 甚至不知道 `go_to()` 方程是干嘛的!
<!-- 在Github的 Markdown中对于代码你可以使用特殊的语法 -->
\`\`\`ruby <!-- 插入时记得移除反斜线, 仅留```ruby -->
def foobar
puts "Hello world!"
end
\`\`\` <!-- 这里也是,移除反斜线,仅留 ``` -->
<!-- 以上代码不需要缩进,而且 Github 会根据```后表明的语言来进行语法高亮 -->
<!-- 水平线 <hr /> -->
<!-- 水平线可由三个或以上的星号或者减号创建,可带可不带空格。 -->
***
---
- - -
****************
<!-- 链接 -->
<!-- Markdown 最棒的地方就是简易的链接制作。链接文字放在中括号[]内,
在随后的括弧()内加入url。-->
[点我点我!](http://test.com/)
<!-- 你也可以为链接加入一个标题:在括弧内使用引号 -->
[点我点我!](http://test.com/ "连接到Test.com")
<!-- 相对路径也可以有 -->
[去 music](/music/).
<!-- Markdown同样支持引用样式的链接 -->
[点此链接][link1]以获取更多信息!
[看一看这个链接][foobar] 如果你愿意的话.
[link1]: http://test.com/ "Cool!"
[foobar]: http://foobar.biz/ "Alright!"
<!-- 链接的标题可以处于单引号中,括弧中或是被忽略。引用名可以在文档的任意何处,
并且可以随意命名,只要名称不重复。-->
<!-- “隐含式命名” 的功能可以让链接文字作为引用名 -->
[This][] is a link.
[this]: http://thisisalink.com/
<!-- 但这并不常用 -->
<!-- 图像 -->
<!-- 图像与链接相似,只需在前添加一个感叹号 -->
![这是我图像的悬停文本(alt text)](http://imgur.com/myimage.jpg "可选命名")
<!-- 引用样式也同样起作用 -->
![这是我的悬停文本.][myimage]
[myimage]: relative/urls/cool/image.jpg "在此输入标题"
<!-- 杂项 -->
<!-- 自动链接 -->
<http://testwebsite.com/>
[http://testwebsite.com/](http://testwebsite.com/) 等同
<!-- 电子邮件的自动链接 -->
<foo@bar.com>
<!-- 转义字符 -->
我希望 *将这段文字置于星号之间* 但是我不希望它被
斜体化, 所以我就: \*这段置文字于星号之间\*。
<!-- 表格 -->
<!-- 表格只被 Github 的 Markdown 支持,并且有一点笨重,但如果你真的要用的话: -->
| 第一列 | 第二列 | 第三列 |
| :---------- | :------: | ----------: |
| 左对齐 | 居个中 | 右对齐 |
| 某某某 | 某某某 | 某某某 |
<!-- 或者, 同样的 -->
第一列 | 第二列 | 第三列
:-- | :-: | --:
这太丑了 | 药不能 | 停
<!-- 结束! -->
```
更多信息, 请于[此处](http://daringfireball.net/projects/Markdown/syntax)参见 John Gruber 关于语法的官方帖子,及于[此处](https://github.com/adam-p/Markdown-here/wiki/Markdown-Cheatsheet) 参见 Adam Pritchard 的摘要笔记。

View File

@ -13,7 +13,7 @@ lang: zh-cn
R 是一门统计语言。它有很多数据分析和挖掘程序包。可以用来统计、分析和制图。 R 是一门统计语言。它有很多数据分析和挖掘程序包。可以用来统计、分析和制图。
你也可以在 LaTeX 文档中运行 `R` 命令。 你也可以在 LaTeX 文档中运行 `R` 命令。
```python ```r
# 评论以 # 开始 # 评论以 # 开始
# R 语言原生不支持 多行注释 # R 语言原生不支持 多行注释

View File

@ -11,7 +11,7 @@ lang: zh-cn
Scala - 一门可拓展性的语言 Scala - 一门可拓展性的语言
```cpp ```scala
/* /*
自行设置: 自行设置:

View File

@ -12,7 +12,7 @@ Swift 是Apple 开发的用于iOS 和OS X 开发的编程语言。Swift 于2014
参阅Apple's [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html) ——一个完整的Swift 教程 参阅Apple's [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/index.html) ——一个完整的Swift 教程
```js ```swift
// //
// 基础 // 基础
// //