Merge remote-tracking branch 'upstream/master'

This commit is contained in:
John J. Camilleri
2013-09-27 10:18:26 +02:00
12 changed files with 1206 additions and 48 deletions

View File

@@ -84,7 +84,7 @@ To run the tests:
The majority of patches won't need to touch any Ruby code at all. The [master language list](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml) is just a configuration file.
We try to only add languages once they have a some usage on GitHub, so please note in-the-wild usage examples in your pull request.
We try to only add languages once they have some usage on GitHub, so please note in-the-wild usage examples in your pull request.
Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.

View File

@@ -1,6 +1,6 @@
Gem::Specification.new do |s|
s.name = 'github-linguist'
s.version = '2.9.4'
s.version = '2.9.5'
s.summary = "GitHub Language detection"
s.authors = "GitHub"

View File

@@ -452,7 +452,6 @@ module Linguist
extnames.each do |extname|
if !options['extensions'].include?(extname)
options['extensions'] << extname
else
end
end
end
@@ -461,7 +460,6 @@ module Linguist
fns.each do |filename|
if !options['filenames'].include?(filename)
options['filenames'] << filename
else
end
end
end

View File

@@ -242,6 +242,7 @@ Clojure:
primary_extension: .clj
extensions:
- .cljs
- .cljx
filenames:
- riemann.config
@@ -282,6 +283,7 @@ Common Lisp:
- .asd
- .lsp
- .ny
- .podsl
Coq:
type: programming
@@ -338,14 +340,6 @@ Dart:
type: programming
primary_extension: .dart
Delphi:
type: programming
color: "#b0ce4e"
primary_extension: .pas
extensions:
- .dfm
- .lpr
DCPU-16 ASM:
type: programming
lexer: dasm16
@@ -635,7 +629,6 @@ Haxe:
INI:
type: data
extensions:
- .cfg
- .ini
- .prefs
- .properties
@@ -714,6 +707,13 @@ Kotlin:
- .ktm
- .kts
LFE:
type: programming
primary_extension: .lfe
color: "#004200"
lexer: Common Lisp
group: Erlang
LLVM:
primary_extension: .ll
@@ -1011,6 +1011,15 @@ Parrot Assembly:
- pasm
primary_extension: .pasm
Pascal:
type: programming
lexer: Delphi
color: "#b0ce4e"
primary_extension: .pas
extensions:
- .dfm
- .lpr
Perl:
type: programming
ace_mode: perl
@@ -1101,6 +1110,8 @@ R:
color: "#198ce7"
lexer: S
primary_extension: .r
filenames:
- .Rprofile
RHTML:
type: markup
@@ -1258,6 +1269,11 @@ Smalltalk:
Smarty:
primary_extension: .tpl
Squirrel:
type: programming
lexer: C++
primary_extension: .nut
Standard ML:
type: programming
color: "#dc566d"
@@ -1334,7 +1350,6 @@ Twig:
TypeScript:
type: programming
color: "#31859c"
lexer: Text only
aliases:
- ts
primary_extension: .ts
@@ -1439,6 +1454,7 @@ XML:
- .wxi
- .wxl
- .wxs
- .x3d
- .xaml
- .xlf
- .xliff
@@ -1482,7 +1498,7 @@ Xtend:
primary_extension: .xtend
YAML:
type: markup
type: data
aliases:
- yml
primary_extension: .yml

View File

@@ -32,6 +32,12 @@
"Ceylon": [
".ceylon"
],
"COBOL": [
".cbl",
".ccp",
".cob",
".cpy"
],
"CoffeeScript": [
".coffee"
],
@@ -44,9 +50,6 @@
"Dart": [
".dart"
],
"Delphi": [
".dpr"
],
"Diff": [
".patch"
],
@@ -77,6 +80,10 @@
"GAS": [
".s"
],
"GLSL": [
".fp",
".glsl"
],
"Gosu": [
".gs",
".gsp",
@@ -205,6 +212,9 @@
"Parrot Internal Representation": [
".pir"
],
"Pascal": [
".dpr"
],
"Perl": [
".fcgi",
".pl",
@@ -318,6 +328,9 @@
"Visual Basic": [
".cls"
],
"Volt": [
".volt"
],
"wisp": [
".wisp"
],
@@ -399,8 +412,8 @@
".gemrc"
]
},
"tokens_total": 407642,
"languages_total": 439,
"tokens_total": 411886,
"languages_total": 447,
"tokens": {
"ABAP": {
"*/**": 1,
@@ -9844,6 +9857,37 @@
"<=>": 1,
"other.name": 1
},
"COBOL": {
"program": 1,
"-": 19,
"id.": 1,
"hello.": 3,
"procedure": 1,
"division.": 1,
"display": 1,
".": 3,
"stop": 1,
"run.": 1,
"IDENTIFICATION": 2,
"DIVISION.": 4,
"PROGRAM": 2,
"ID.": 2,
"PROCEDURE": 2,
"DISPLAY": 2,
"STOP": 2,
"RUN.": 2,
"COBOL": 7,
"TEST": 2,
"RECORD.": 1,
"USAGES.": 1,
"COMP": 5,
"PIC": 5,
"S9": 4,
"(": 5,
")": 5,
"COMP.": 3,
"COMP2": 2
},
"CoffeeScript": {
"CoffeeScript": 1,
"require": 21,
@@ -12675,30 +12719,6 @@
"q": 1,
"print": 1
},
"Delphi": {
"program": 1,
"gmail": 1,
";": 6,
"uses": 1,
"Forms": 1,
"Unit2": 1,
"in": 1,
"{": 2,
"Form2": 2,
"}": 2,
"R": 1,
"*.res": 1,
"begin": 1,
"Application.Initialize": 1,
"Application.MainFormOnTaskbar": 1,
"True": 1,
"Application.CreateForm": 1,
"(": 1,
"TForm2": 1,
")": 1,
"Application.Run": 1,
"end.": 1
},
"Diff": {
"diff": 1,
"-": 5,
@@ -14147,6 +14167,491 @@
"xd": 1,
".subsections_via_symbols": 1
},
"GLSL": {
"////": 4,
"High": 1,
"quality": 2,
"(": 386,
"Some": 1,
"browsers": 1,
"may": 1,
"freeze": 1,
"or": 1,
"crash": 1,
")": 386,
"//#define": 10,
"HIGHQUALITY": 2,
"Medium": 1,
"Should": 1,
"be": 1,
"fine": 1,
"on": 3,
"all": 1,
"systems": 1,
"works": 1,
"Intel": 1,
"HD2000": 1,
"Win7": 1,
"but": 1,
"quite": 1,
"slow": 1,
"MEDIUMQUALITY": 2,
"Defaults": 1,
"REFLECTIONS": 3,
"#define": 13,
"SHADOWS": 5,
"GRASS": 3,
"SMALL_WAVES": 4,
"RAGGED_LEAVES": 5,
"DETAILED_NOISE": 3,
"LIGHT_AA": 3,
"//": 36,
"sample": 2,
"SSAA": 2,
"HEAVY_AA": 2,
"x2": 5,
"RG": 1,
"TONEMAP": 5,
"Configurations": 1,
"#ifdef": 14,
"#endif": 14,
"const": 18,
"float": 103,
"eps": 5,
"e": 4,
"-": 108,
";": 353,
"PI": 3,
"vec3": 165,
"sunDir": 5,
"skyCol": 4,
"sandCol": 2,
"treeCol": 2,
"grassCol": 2,
"leavesCol": 4,
"leavesPos": 4,
"sunCol": 5,
"#else": 5,
"exposure": 1,
"Only": 1,
"used": 1,
"when": 1,
"tonemapping": 1,
"mod289": 4,
"x": 11,
"{": 61,
"return": 47,
"floor": 8,
"*": 115,
"/": 24,
"}": 61,
"vec4": 72,
"permute": 4,
"x*34.0": 1,
"+": 108,
"*x": 3,
"taylorInvSqrt": 2,
"r": 14,
"snoise": 7,
"v": 8,
"vec2": 26,
"C": 1,
"/6.0": 1,
"/3.0": 1,
"D": 1,
"i": 38,
"dot": 30,
"C.yyy": 2,
"x0": 7,
"C.xxx": 2,
"g": 2,
"step": 2,
"x0.yzx": 1,
"x0.xyz": 1,
"l": 1,
"i1": 2,
"min": 11,
"g.xyz": 2,
"l.zxy": 2,
"i2": 2,
"max": 9,
"x1": 4,
"*C.x": 2,
"/3": 1,
"C.y": 1,
"x3": 4,
"D.yyy": 1,
"D.y": 1,
"p": 26,
"i.z": 1,
"i1.z": 1,
"i2.z": 1,
"i.y": 1,
"i1.y": 1,
"i2.y": 1,
"i.x": 1,
"i1.x": 1,
"i2.x": 1,
"n_": 2,
"/7.0": 1,
"ns": 4,
"D.wyz": 1,
"D.xzx": 1,
"j": 4,
"ns.z": 3,
"mod": 2,
"*7": 1,
"x_": 3,
"y_": 2,
"N": 1,
"*ns.x": 2,
"ns.yyyy": 2,
"y": 2,
"h": 21,
"abs": 2,
"b0": 3,
"x.xy": 1,
"y.xy": 1,
"b1": 3,
"x.zw": 1,
"y.zw": 1,
"//vec4": 3,
"s0": 2,
"lessThan": 2,
"*2.0": 4,
"s1": 2,
"sh": 1,
"a0": 1,
"b0.xzyw": 1,
"s0.xzyw*sh.xxyy": 1,
"a1": 1,
"b1.xzyw": 1,
"s1.xzyw*sh.zzww": 1,
"p0": 5,
"a0.xy": 1,
"h.x": 1,
"p1": 5,
"a0.zw": 1,
"h.y": 1,
"p2": 5,
"a1.xy": 1,
"h.z": 1,
"p3": 5,
"a1.zw": 1,
"h.w": 1,
"//Normalise": 1,
"gradients": 1,
"norm": 1,
"norm.x": 1,
"norm.y": 1,
"norm.z": 1,
"norm.w": 1,
"m": 8,
"m*m": 1,
"fbm": 2,
"final": 5,
"waterHeight": 4,
"d": 10,
"length": 7,
"p.xz": 2,
"sin": 8,
"iGlobalTime": 7,
"Island": 1,
"waves": 3,
"p*0.5": 1,
"Other": 1,
"bump": 2,
"pos": 42,
"rayDir": 43,
"s": 23,
"Fade": 1,
"out": 1,
"to": 1,
"reduce": 1,
"aliasing": 1,
"dist": 7,
"<": 23,
"sqrt": 6,
"Calculate": 1,
"normal": 7,
"from": 2,
"heightmap": 1,
"pos.x": 1,
"iGlobalTime*0.5": 1,
"pos.z": 2,
"*0.7": 1,
"*s": 4,
"normalize": 14,
"e.xyy": 1,
"e.yxy": 1,
"intersectSphere": 2,
"rpos": 5,
"rdir": 3,
"rad": 2,
"op": 5,
"b": 5,
"det": 11,
"b*b": 2,
"rad*rad": 2,
"if": 29,
"t": 44,
"rdir*t": 1,
"intersectCylinder": 1,
"rdir2": 2,
"rdir.yz": 1,
"op.yz": 3,
"rpos.yz": 2,
"rdir2*t": 2,
"pos.yz": 2,
"intersectPlane": 3,
"rayPos": 38,
"n": 18,
"sign": 1,
"rotate": 5,
"theta": 6,
"c": 6,
"cos": 4,
"p.x": 2,
"p.z": 2,
"p.y": 1,
"impulse": 2,
"k": 8,
"by": 1,
"iq": 2,
"k*x": 1,
"exp": 2,
"grass": 2,
"Optimization": 1,
"Avoid": 1,
"noise": 1,
"too": 1,
"far": 1,
"away": 1,
"pos.y": 8,
"tree": 2,
"pos.y*0.03": 2,
"mat2": 2,
"m*pos.xy": 1,
"width": 2,
"clamp": 4,
"scene": 7,
"vtree": 4,
"vgrass": 2,
".x": 4,
"eps.xyy": 1,
"eps.yxy": 1,
"eps.yyx": 1,
"plantsShadow": 2,
"Soft": 1,
"shadow": 4,
"taken": 1,
"for": 7,
"int": 7,
"rayDir*t": 2,
"res": 6,
"res.x": 3,
"k*res.x/t": 1,
"s*s*": 1,
"intersectWater": 2,
"rayPos.y": 1,
"rayDir.y": 1,
"intersectSand": 3,
"intersectTreasure": 2,
"intersectLeaf": 2,
"openAmount": 4,
"dir": 2,
"offset": 5,
"rayDir*res.w": 1,
"pos*0.8": 2,
"||": 3,
"res.w": 6,
"res2": 2,
"dir.xy": 1,
"dir.z": 1,
"rayDir*res2.w": 1,
"res2.w": 3,
"&&": 10,
"leaves": 7,
"e20": 3,
"sway": 5,
"fract": 1,
"upDownSway": 2,
"angleOffset": 3,
"Left": 1,
"right": 1,
"alpha": 3,
"Up": 1,
"down": 1,
"k*10.0": 1,
"p.xzy": 1,
".xzy": 2,
"d.xzy": 1,
"Shift": 1,
"Intersect": 11,
"individual": 1,
"leaf": 1,
"res.xyz": 1,
"sand": 2,
"resSand": 2,
"//if": 1,
"resSand.w": 4,
"plants": 6,
"resLeaves": 3,
"resLeaves.w": 10,
"e7": 3,
"light": 5,
"sunDir*0.01": 2,
"col": 32,
"n.y": 3,
"lightLeaves": 3,
"ao": 5,
"sky": 5,
"res.y": 2,
"uvFact": 2,
"uv": 12,
"n.x": 1,
"tex": 6,
"texture2D": 6,
"iChannel0": 3,
".rgb": 2,
"e8": 1,
"traceReflection": 2,
"resPlants": 2,
"resPlants.w": 6,
"resPlants.xyz": 2,
"pos.xz": 2,
"leavesPos.xz": 2,
".r": 3,
"resLeaves.xyz": 2,
"trace": 2,
"resSand.xyz": 1,
"treasure": 1,
"chest": 1,
"resTreasure": 1,
"resTreasure.w": 4,
"resTreasure.xyz": 1,
"water": 1,
"resWater": 1,
"resWater.w": 4,
"ct": 2,
"fresnel": 2,
"pow": 3,
"trans": 2,
"reflDir": 3,
"reflect": 1,
"refl": 3,
"resWater.t": 1,
"mix": 2,
"camera": 8,
"px": 4,
"rd": 1,
"iResolution.yy": 1,
"iResolution.x/iResolution.y*0.5": 1,
"rd.x": 1,
"rd.y": 1,
"void": 5,
"main": 3,
"gl_FragCoord.xy": 7,
"*0.25": 4,
"*0.5": 1,
"Optimized": 1,
"Haarm": 1,
"Peter": 1,
"Duiker": 1,
"curve": 1,
"col*exposure": 1,
"x*": 2,
".5": 1,
"gl_FragColor": 2,
"NUM_LIGHTS": 4,
"AMBIENT": 2,
"MAX_DIST": 3,
"MAX_DIST_SQUARED": 3,
"uniform": 7,
"lightColor": 3,
"[": 29,
"]": 29,
"varying": 3,
"fragmentNormal": 2,
"cameraVector": 2,
"lightVector": 4,
"initialize": 1,
"diffuse/specular": 1,
"lighting": 1,
"diffuse": 4,
"specular": 4,
"the": 1,
"fragment": 1,
"and": 2,
"direction": 1,
"cameraDir": 2,
"loop": 1,
"through": 1,
"each": 1,
"calculate": 1,
"distance": 1,
"between": 1,
"distFactor": 3,
"lightDir": 3,
"diffuseDot": 2,
"halfAngle": 2,
"specularColor": 2,
"specularDot": 2,
"sample.rgb": 1,
"sample.a": 1,
"#version": 1,
"kCoeff": 2,
"kCube": 2,
"uShift": 3,
"vShift": 3,
"chroma_red": 2,
"chroma_green": 2,
"chroma_blue": 2,
"bool": 1,
"apply_disto": 4,
"sampler2D": 1,
"input1": 4,
"adsk_input1_w": 4,
"adsk_input1_h": 3,
"adsk_input1_aspect": 1,
"adsk_input1_frameratio": 5,
"adsk_result_w": 3,
"adsk_result_h": 2,
"distortion_f": 3,
"f": 17,
"r*r": 1,
"inverse_f": 2,
"lut": 9,
"max_r": 2,
"incr": 2,
"lut_r": 5,
".z": 5,
".y": 2,
"aberrate": 4,
"chroma": 2,
"chromaticize_and_invert": 2,
"rgb_f": 5,
"px.x": 2,
"px.y": 2,
"uv.x": 11,
"uv.y": 7,
"*2": 2,
"uv.x*uv.x": 1,
"uv.y*uv.y": 1,
"else": 1,
"rgb_uvs": 12,
"rgb_f.rr": 1,
"rgb_f.gg": 1,
"rgb_f.bb": 1,
"sampled": 1,
"sampled.r": 1,
"sampled.g": 1,
".g": 1,
"sampled.b": 1,
".b": 1,
"gl_FragColor.rgba": 1,
"sampled.rgb": 1
},
"Gosu": {
"print": 4,
"(": 54,
@@ -30306,6 +30811,30 @@
"say": 1,
".end": 1
},
"Pascal": {
"program": 1,
"gmail": 1,
";": 6,
"uses": 1,
"Forms": 1,
"Unit2": 1,
"in": 1,
"{": 2,
"Form2": 2,
"}": 2,
"R": 1,
"*.res": 1,
"begin": 1,
"Application.Initialize": 1,
"Application.MainFormOnTaskbar": 1,
"True": 1,
"Application.CreateForm": 1,
"(": 1,
"TForm2": 1,
")": 1,
"Application.Run": 1,
"end.": 1
},
"Perl": {
"package": 14,
"App": 131,
@@ -38683,6 +39212,89 @@
"Boolean": 1,
"True": 1
},
"Volt": {
"module": 1,
"main": 2,
";": 53,
"import": 7,
"core.stdc.stdio": 1,
"core.stdc.stdlib": 1,
"watt.process": 1,
"watt.path": 1,
"results": 1,
"list": 1,
"cmd": 1,
"int": 8,
"(": 37,
")": 37,
"{": 12,
"auto": 6,
"cmdGroup": 2,
"new": 3,
"CmdGroup": 1,
"bool": 4,
"printOk": 2,
"true": 4,
"printImprovments": 2,
"printFailing": 2,
"printRegressions": 2,
"string": 1,
"compiler": 3,
"getEnv": 1,
"if": 7,
"is": 2,
"null": 3,
"printf": 6,
".ptr": 14,
"return": 2,
"-": 3,
"}": 12,
"///": 1,
"@todo": 1,
"Scan": 1,
"for": 4,
"files": 1,
"tests": 2,
"testList": 1,
"total": 5,
"passed": 5,
"failed": 5,
"improved": 3,
"regressed": 6,
"rets": 5,
"Result": 2,
"[": 6,
"]": 6,
"tests.length": 3,
"size_t": 3,
"i": 14,
"<": 3,
"+": 14,
".runTest": 1,
"cmdGroup.waitAll": 1,
"ret": 1,
"ret.ok": 1,
"cast": 5,
"ret.hasPassed": 4,
"&&": 2,
"ret.test.ptr": 4,
"ret.msg.ptr": 4,
"else": 3,
"fflush": 2,
"stdout": 1,
"xml": 8,
"fopen": 1,
"fprintf": 2,
"rets.length": 1,
".xmlLog": 1,
"fclose": 1,
"rate": 2,
"float": 2,
"/": 1,
"*": 1,
"f": 1,
"double": 1
},
"wisp": {
";": 199,
"#": 2,
@@ -40245,11 +40857,11 @@
"C": 58732,
"C++": 21480,
"Ceylon": 50,
"COBOL": 90,
"CoffeeScript": 2951,
"Coq": 18259,
"CSS": 43867,
"Dart": 68,
"Delphi": 30,
"Diff": 16,
"Ecl": 281,
"edn": 227,
@@ -40259,6 +40871,7 @@
"fish": 636,
"Forth": 1516,
"GAS": 133,
"GLSL": 3766,
"Gosu": 413,
"Groovy": 69,
"Groovy Server Pages": 91,
@@ -40298,6 +40911,7 @@
"OpenEdge ABL": 762,
"Parrot Assembly": 6,
"Parrot Internal Representation": 5,
"Pascal": 30,
"Perl": 17497,
"PHP": 20724,
"PogoScript": 250,
@@ -40329,6 +40943,7 @@
"VHDL": 42,
"VimL": 20,
"Visual Basic": 345,
"Volt": 388,
"wisp": 1363,
"XC": 24,
"XML": 5622,
@@ -40349,11 +40964,11 @@
"C": 24,
"C++": 20,
"Ceylon": 1,
"COBOL": 4,
"CoffeeScript": 9,
"Coq": 12,
"CSS": 2,
"Dart": 1,
"Delphi": 1,
"Diff": 1,
"Ecl": 1,
"edn": 1,
@@ -40363,6 +40978,7 @@
"fish": 3,
"Forth": 7,
"GAS": 1,
"GLSL": 3,
"Gosu": 5,
"Groovy": 2,
"Groovy Server Pages": 4,
@@ -40402,6 +41018,7 @@
"OpenEdge ABL": 5,
"Parrot Assembly": 1,
"Parrot Internal Representation": 1,
"Pascal": 1,
"Perl": 14,
"PHP": 9,
"PogoScript": 1,
@@ -40433,6 +41050,7 @@
"VHDL": 1,
"VimL": 2,
"Visual Basic": 1,
"Volt": 1,
"wisp": 1,
"XC": 1,
"XML": 3,
@@ -40442,5 +41060,5 @@
"Xtend": 2,
"YAML": 1
},
"md5": "98ddc204696b84bb42fd75ba9d22e0ca"
"md5": "04aab6477c2dc5ef1be1c9de1886c3f3"
}

111
samples/LFE/church.lfe Normal file
View File

@@ -0,0 +1,111 @@
;; Copyright (c) 2013 Duncan McGreggor <oubiwann@cogitat.io>
;;
;; Licensed under the Apache License, Version 2.0 (the "License");
;; you may not use this file except in compliance with the License.
;; You may obtain a copy of the License at
;;
;; http://www.apache.org/licenses/LICENSE-2.0
;;
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.
;; File : church.lfe
;; Author : Duncan McGreggor
;; Purpose : Demonstrating church numerals from the lambda calculus
;; The code below was used to create the section of the user guide here:
;; http://lfe.github.io/user-guide/recursion/5.html
;;
;; Here is some example usage:
;;
;; > (slurp '"church.lfe")
;; #(ok church)
;; > (zero)
;; #Fun<lfe_eval.10.53503600>
;; > (church->int1 (zero))
;; 0
;; > (church->int1 (three))
;; 3
;; > (church->int1 (five))
;; 5
;; > (church->int2 #'five/0)
;; 5
;; > (church->int2 (lambda () (get-church 25)))
;; 25
(defmodule church
(export all))
(defun zero ()
(lambda (s)
(lambda (x) x)))
(defun one ()
(lambda (s)
(lambda (x)
(funcall s x))))
(defun two ()
(lambda (s)
(lambda (x)
(funcall s
(funcall s x)))))
(defun three ()
(lambda (s)
(lambda (x)
(funcall s
(funcall s
(funcall s x))))))
(defun four ()
(lambda (s)
(lambda (x)
(funcall s
(funcall s
(funcall s
(funcall s x)))))))
(defun five ()
(get-church 5))
(defun int-successor (n)
(+ n 1))
(defun church->int1 (church-numeral)
"
Converts a called church numeral to an integer, e.g.:
> (church->int1 (five))
"
(funcall
(funcall church-numeral #'int-successor/1) 0))
(defun church->int2 (church-numeral)
"
Converts a non-called church numeral to an integer, e.g.:
> (church->int2 #'five/0)
"
(funcall
(funcall
(funcall church-numeral) #'int-successor/1) 0))
(defun church-successor (church-numeral)
(lambda (s)
(lambda (x)
(funcall s
(funcall
(funcall church-numeral s) x)))))
(defun get-church (church-numeral count limit)
(cond ((== count limit) church-numeral)
((/= count limit)
(get-church
(church-successor church-numeral)
(+ 1 count)
limit))))
(defun get-church (integer)
(get-church (zero) 0 integer))

104
samples/LFE/gps1.lfe Normal file
View File

@@ -0,0 +1,104 @@
;;; -*- Mode: LFE; -*-
;;; Code from Paradigms of Artificial Intelligence Programming
;;; Copyright (c) 1991 Peter Norvig
;;;; File gps1.lisp: First version of GPS (General Problem Solver)
;;;; Converted to LFE by Robert Virding
;; Define macros for global variable access. This is a hack and very naughty!
(defsyntax defvar
([name val] (let ((v val)) (put 'name v) v)))
(defsyntax setvar
([name val] (let ((v val)) (put 'name v) v)))
(defsyntax getvar
([name] (get 'name)))
;; Module definition.
(defmodule gps1
(export (gps 2) (gps 3) (school-ops 0))
(import (from lists (member 2) (all 2) (any 2))
;; Rename lists functions to be more CL like.
(rename lists ((all 2) every) ((any 2) some) ((filter 2) find-all))))
;; An operation.
(defrecord op
action preconds add-list del-list)
;; General Problem Solver: achieve all goals using *ops*.
(defun gps (state goals ops)
;; Set global variables
(defvar *state* state) ;The current state: a list of conditions.
(defvar *ops* ops) ;A list of available operators.
(if (every (fun achieve 1) goals) 'solved))
(defun gps (state goals)
;; Set global variables, but use existing *ops*
(defvar *state* state) ;The current state: a list of conditions.
(if (every (fun achieve 1) goals) 'solved))
;; A goal is achieved if it already holds or if there is an
;; appropriate op for it that is applicable."
(defun achieve (goal)
(orelse (member goal (getvar *state*))
(some (fun apply-op 1)
(find-all (lambda (op) (appropriate-p goal op))
(getvar *ops*)))))
;; An op is appropriate to a goal if it is in its add list.
(defun appropriate-p (goal op)
(member goal (op-add-list op)))
;; Print a message and update *state* if op is applicable.
(defun apply-op (op)
(if (every (fun achieve 1) (op-preconds op))
(progn
(: io fwrite '"executing ~p\n" (list (op-action op)))
(setvar *state* (set-difference (getvar *state*) (op-del-list op)))
(setvar *state* (union (getvar *state*) (op-add-list op)))
'true)))
;; Define the set functions to work on list, a listsets module really.
(defun set-difference
([(cons e es) s2]
(if (member e s2)
(set-difference es s2)
(cons e (set-difference es s2))))
([() s2] ()))
(defun union
([(cons e es) s2]
(if (member e s2) (union es s2) (cons e (union es s2))))
([() s2] ()))
;;; ==============================
(defun school-ops ()
(list
(make-op action 'drive-son-to-school
preconds '(son-at-home car-works)
add-list '(son-at-school)
del-list '(son-at-home))
(make-op action 'shop-installs-battery
preconds '(car-needs-battery shop-knows-problem shop-has-money)
add-list '(car-works)
del-list ())
(make-op action 'tell-shop-problem
preconds '(in-communication-with-shop)
add-list '(shop-knows-problem)
del-list ())
(make-op action 'telephone-shop
preconds '(know-phone-number)
add-list '(in-communication-with-shop)
del-list ())
(make-op action 'look-up-number
preconds '(have-phone-book)
add-list '(know-phone-number)
del-list ())
(make-op action 'give-shop-money
preconds '(have-money)
add-list '(shop-has-money)
del-list '(have-money))))

View File

@@ -0,0 +1,83 @@
;; Copyright (c) 2008-2013 Robert Virding
;;
;; Licensed under the Apache License, Version 2.0 (the "License");
;; you may not use this file except in compliance with the License.
;; You may obtain a copy of the License at
;;
;; http://www.apache.org/licenses/LICENSE-2.0
;;
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.
;; File : mnesia_demo.lfe
;; Author : Robert Virding
;; Purpose : A simple Mnesia demo file for LFE.
;; This file contains a simple demo of using LFE to access Mnesia
;; tables. It shows how to use the emp-XXXX macro (ETS match pattern)
;; together with mnesia:match_object, match specifications with
;; mnesia:select and Query List Comprehensions.
(defmodule mnesia_demo
(export (new 0) (by_place 1) (by_place_ms 1) (by_place_qlc 1)))
(defrecord person name place job)
(defun new ()
;; Start mnesia and create a table, we will get an in memory only schema.
(: mnesia start)
(: mnesia create_table 'person '(#(attributes (name place job))))
;; Initialise the table.
(let ((people '(
;; First some people in London.
#(fred london waiter)
#(bert london waiter)
#(john london painter)
#(paul london driver)
;; Now some in Paris.
#(jean paris waiter)
#(gerard paris driver)
#(claude paris painter)
#(yves paris waiter)
;; And some in Rome.
#(roberto rome waiter)
#(guiseppe rome driver)
#(paulo rome painter)
;; And some in Berlin.
#(fritz berlin painter)
#(kurt berlin driver)
#(hans berlin waiter)
#(franz berlin waiter)
)))
(: lists foreach (match-lambda
([(tuple n p j)]
(: mnesia transaction
(lambda ()
(let ((new (make-person name n place p job j)))
(: mnesia write new))))))
people)))
;; Match records by place using match_object and the emp-XXXX macro.
(defun by_place (place)
(: mnesia transaction
(lambda () (: mnesia match_object (emp-person place place)))))
;; Use match specifications to match records
(defun by_place_ms (place)
(let ((f (lambda () (: mnesia select 'person
(match-spec ([(match-person name n place p job j)]
(when (=:= p place))
(tuple n j)))))))
(: mnesia transaction f)))
;; Use Query List Comprehensions to match records
(defun by_place_qlc (place)
(let ((f (lambda ()
(let ((q (qlc (lc ((<- person (: mnesia table 'person))
(=:= (person-place person) place))
person))))
(: qlc e q)))))
(: mnesia transaction f)))

169
samples/LFE/object.lfe Normal file
View File

@@ -0,0 +1,169 @@
;; Copyright (c) 2013 Duncan McGreggor <oubiwann@cogitat.io>
;;
;; Licensed under the Apache License, Version 2.0 (the "License");
;; you may not use this file except in compliance with the License.
;; You may obtain a copy of the License at
;;
;; http://www.apache.org/licenses/LICENSE-2.0
;;
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.
;; File : object.lfe
;; Author : Duncan McGreggor
;; Purpose : Demonstrating simple OOP with closures
;; The simple object system demonstrated below shows how to do the following:
;; * create objects
;; * call methods on those objects
;; * have methods which can call other methods
;; * update the state of an instance variable
;;
;; Note, however, that his example does not demonstrate inheritance.
;;
;; To use the code below in LFE, do the following:
;;
;; $ cd examples
;; $ ../bin/lfe -pa ../ebin
;;
;; Load the file and create a fish-class instance:
;;
;; > (slurp '"object.lfe")
;; #(ok object)
;; > (set mommy-fish (fish-class '"Carp"))
;; #Fun<lfe_eval.10.91765564>
;;
;; Execute some of the basic methods:
;;
;; > (get-species mommy-fish)
;; "Carp"
;; > (move mommy-fish 17)
;; The Carp swam 17 feet!
;; ok
;; > (get-id mommy-fish)
;; "47eebe91a648f042fc3fb278df663de5"
;;
;; Now let's look at "modifying" state data (e.g., children counts):
;;
;; > (get-children mommy-fish)
;; ()
;; > (get-children-count mommy-fish)
;; 0
;; > (set (mommy-fish baby-fish-1) (reproduce mommy-fish))
;; (#Fun<lfe_eval.10.91765564> #Fun<lfe_eval.10.91765564>)
;; > (get-id mommy-fish)
;; "47eebe91a648f042fc3fb278df663de5"
;; > (get-id baby-fish-1)
;; "fdcf35983bb496650e558a82e34c9935"
;; > (get-children-count mommy-fish)
;; 1
;; > (set (mommy-fish baby-fish-2) (reproduce mommy-fish))
;; (#Fun<lfe_eval.10.91765564> #Fun<lfe_eval.10.91765564>)
;; > (get-id mommy-fish)
;; "47eebe91a648f042fc3fb278df663de5"
;; > (get-id baby-fish-2)
;; "3e64e5c20fb742dd88dac1032749c2fd"
;; > (get-children-count mommy-fish)
;; 2
;; > (get-info mommy-fish)
;; id: "47eebe91a648f042fc3fb278df663de5"
;; species: "Carp"
;; children: ["fdcf35983bb496650e558a82e34c9935",
;; "3e64e5c20fb742dd88dac1032749c2fd"]
;; ok
(defmodule object
(export all))
(defun fish-class (species)
"
This is the constructor that will be used most often, only requiring that
one pass a 'species' string.
When the children are not defined, simply use an empty list.
"
(fish-class species ()))
(defun fish-class (species children)
"
This contructor is mostly useful as a way of abstracting out the id
generation from the larger constructor. Nothing else uses fish-class/2
besides fish-class/1, so it's not strictly necessary.
When the id isn't know, generate one."
(let* (((binary (id (size 128))) (: crypto rand_bytes 16))
(formatted-id (car
(: io_lib format
'"~32.16.0b" (list id)))))
(fish-class species children formatted-id)))
(defun fish-class (species children id)
"
This is the constructor used internally, once the children and fish id are
known.
"
(let ((move-verb '"swam"))
(lambda (method-name)
(case method-name
('id
(lambda (self) id))
('species
(lambda (self) species))
('children
(lambda (self) children))
('info
(lambda (self)
(: io format
'"id: ~p~nspecies: ~p~nchildren: ~p~n"
(list (get-id self)
(get-species self)
(get-children self)))))
('move
(lambda (self distance)
(: io format
'"The ~s ~s ~p feet!~n"
(list species move-verb distance))))
('reproduce
(lambda (self)
(let* ((child (fish-class species))
(child-id (get-id child))
(children-ids (: lists append
(list children (list child-id))))
(parent-id (get-id self))
(parent (fish-class species children-ids parent-id)))
(list parent child))))
('children-count
(lambda (self)
(: erlang length children)))))))
(defun get-method (object method-name)
"
This is a generic function, used to call into the given object (class
instance).
"
(funcall object method-name))
; define object methods
(defun get-id (object)
(funcall (get-method object 'id) object))
(defun get-species (object)
(funcall (get-method object 'species) object))
(defun get-info (object)
(funcall (get-method object 'info) object))
(defun move (object distance)
(funcall (get-method object 'move) object distance))
(defun reproduce (object)
(funcall (get-method object 'reproduce) object))
(defun get-children (object)
(funcall (get-method object 'children) object))
(defun get-children-count (object)
(funcall (get-method object 'children-count) object))

View File

@@ -0,0 +1,56 @@
//example from http://www.squirrel-lang.org/#documentation
local table = {
a = "10"
subtable = {
array = [1,2,3]
},
[10 + 123] = "expression index"
}
local array=[ 1, 2, 3, { a = 10, b = "string" } ];
foreach (i,val in array)
{
::print("the type of val is"+typeof val);
}
/////////////////////////////////////////////
class Entity
{
constructor(etype,entityname)
{
name = entityname;
type = etype;
}
x = 0;
y = 0;
z = 0;
name = null;
type = null;
}
function Entity::MoveTo(newx,newy,newz)
{
x = newx;
y = newy;
z = newz;
}
class Player extends Entity {
constructor(entityname)
{
base.constructor("Player",entityname)
}
function DoDomething()
{
::print("something");
}
}
local newplayer = Player("da playar");
newplayer.MoveTo(100,200,300);

View File

@@ -191,7 +191,10 @@ class TestLanguage < Test::Unit::TestCase
def test_markup
assert_equal :markup, Language['HTML'].type
assert_equal :markup, Language['YAML'].type
end
def test_data
assert_equal :data, Language['YAML'].type
end
def test_other