
Clojure (クロージャーと発音)は、動的なタイピングを備えた汎用プログラミング言語であり、関数型プログラミングを奨励する、現代のLisp方言です。 言語の作成者であるリッチヒッキーは、2007年に最初に彼の作品を紹介しました。その後、言語は成熟し、2015年6月30日リリースのバージョン1.7に達しました。
言語の基本概念の1つは、既存のプラットフォームでの作業です。 Rich Hickeyは、ランタイムやガベージコレクターなどを作成しないことにしました。 -これには多くの労力が必要になります。JVM、.NET、JavaScriptなどの既製のプラットフォームを使用する方が簡単です。 現在、最も活発に開発されている2つの分野は、JVMでのClojure(それからそれほど前ではないバージョン1.7に達した人)とClojureSrcipt-JavaScriptでコンパイルしてブラウザとNode.jsで動作する言語のサブセットです。 .NETのバージョンはそれほど活発に開発されておらず、JVM実装よりも遅れています。 私はインターネットを検索し、 Go 、 PHP 、 Python 、 Perlで 、Clojureの実装がさらに死んでいるのを見つけました。
この記事では、Clojureについてお話したいと思います。PHP からClojureへの英語の一連のスクリーンキャストに基づいて、PHPと比較した例を示します。
PHPとClojureは、まったく異なる2つの言語です。 Clojureを初めて見たとき、これはある種のジャンキーJSONだと思うかもしれません。 実際、Clojureは非常に強力でエレガントな言語です。
PHPと比較して、言語の多くの側面には直接の類似点があります。 他の人は、それらを正しい角度から見ると明確になります。
無名関数、クロージャとクロージャ
用語の混乱を整理するために、少し余談から始めましょう。 PHP 5.3で匿名関数とクロージャーが登場しました。 ドキュメントをよく見ると、PHPの匿名関数がClosureクラスを使用して実装されていることがわかります。 単語「クロージャー」は、順番に「クロージャー」として翻訳され、スペルがクロージュア言語の名前に非常に似ています(中央の文字jに注意してください)。 さらに混乱しないように、匿名関数には「匿名関数」という用語を使用し、変数の字句的可視性の効果には「クロージング」という用語を使用します。 Clojureには、それぞれ匿名関数とクロージャーもあります。
名前空間
PHPとClojureには多くの共通点があります。名前空間は、ファイルの物理的な場所に対応する部分で構成されています。 違いは2つだけです。Clojureでは、区切り文字はピリオドであり、名前空間は通常大文字で表記されます。
// PHP
namespace Foo\Bar\Baz;
;; Clojure
(ns foo.bar.baz)
Clojure ,
(count foo) ;; Clojure
, count($foo) // PHP
:

! : xml- , if, for :

:

, , :

Clojure! ( , Clojure, ):

, , , - -. Clojure , .
, , , :

, , .. IDE .
PHP, . !
, :

if, switch :

, , , :

:

Clojure, , ! : Value, Symbol List ( 100% , ).
Value () — , , :
2
"Hello, World"
#"\d+"
Symbol () — , , .. - ( Value):
def
map
db
my-symbol
List () — , (value), (symbol) (list). .. : , .
(some-symbol "Some Value" ("nested list with value" and-symbol))
Clojure!
, , ( if/else), ?
Clojure, , .
, if , , if, , . , , , :

. , , . , . , , , , .
, , .
PHP:

, , +, :
(+ 3 4)
— . + Clojure , .
: 4 + 3 / 2 = ?
, , :
(/ (+ 4 3) 2) ;; 3.5
:
(+ 4 (/ 3 2)) ;; 5.5
, .
Clojure . , , .. Clojure . , .
, . , :

( PHP is):

, , :

« » — Clojure, , :

PHP, Clojure . , PHP, : Integer BitInt. , . , BigInt, M . , N .

:

Clojure ! PHP:
$x = 4 / 3; // 1.33333...
$y = $x * 3; // 3.99999....
Clojure:
(/ 4 3) ;; - 4/3 Ratio
(* 4/3 3) ;; 4
Clojure — Java . , .. - , , \n . , :

PHP, :

Clojure Character — «», , . , \n — , n.
Characters, , ..: \newline, \tab, \backspace.
unicode , , \u263a.
, : \o003 — Ctrl+C.

# : #"\d+". Java, Java-:

Nil nil ( Null PHP).
Bool true false. , PHP, nil false . , 0 "" ( ) Clojure , PHP :

Keyword
Clojure Keyword, PHP ( if, for ..). Keywords . — . - . :pi — :pi.

, ? PHP define . , define, , - , .
, PHP str_pad, . $pad_type : STR_PAD_RIGHT, STR_PAD_LEFT, STR_PAD_BOTH. 0, 1 2 . , 265, 1337 9000 — .
Clojure keywords :str-pad-right, :str-pad-left, :str-pad-both — - , , !
, :
{:first-name "Irma", :last-name "Gerd"}
.
—
Clojure, -, : «- Clojure» «- Clojure. 2».
Clojure PHP, PHP vs Clojure.
FPCONF 15 2015 , - Clojure ClojureScript.