mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
New interpreters from RosettaCode (#3087)
This commit is contained in:
@@ -860,6 +860,8 @@ Dart:
|
|||||||
color: "#00B4AB"
|
color: "#00B4AB"
|
||||||
extensions:
|
extensions:
|
||||||
- .dart
|
- .dart
|
||||||
|
interpreters:
|
||||||
|
- dart
|
||||||
ace_mode: dart
|
ace_mode: dart
|
||||||
|
|
||||||
Diff:
|
Diff:
|
||||||
@@ -904,6 +906,8 @@ E:
|
|||||||
color: "#ccce35"
|
color: "#ccce35"
|
||||||
extensions:
|
extensions:
|
||||||
- .E
|
- .E
|
||||||
|
interpreters:
|
||||||
|
- rune
|
||||||
tm_scope: none
|
tm_scope: none
|
||||||
ace_mode: text
|
ace_mode: text
|
||||||
|
|
||||||
@@ -1544,6 +1548,8 @@ Haskell:
|
|||||||
extensions:
|
extensions:
|
||||||
- .hs
|
- .hs
|
||||||
- .hsc
|
- .hsc
|
||||||
|
interpreters:
|
||||||
|
- runhaskell
|
||||||
ace_mode: haskell
|
ace_mode: haskell
|
||||||
|
|
||||||
Haxe:
|
Haxe:
|
||||||
@@ -1647,6 +1653,8 @@ Io:
|
|||||||
color: "#a9188d"
|
color: "#a9188d"
|
||||||
extensions:
|
extensions:
|
||||||
- .io
|
- .io
|
||||||
|
interpreters:
|
||||||
|
- io
|
||||||
ace_mode: io
|
ace_mode: io
|
||||||
|
|
||||||
Ioke:
|
Ioke:
|
||||||
@@ -2516,6 +2524,7 @@ OCaml:
|
|||||||
interpreters:
|
interpreters:
|
||||||
- ocaml
|
- ocaml
|
||||||
- ocamlrun
|
- ocamlrun
|
||||||
|
- ocamlscript
|
||||||
tm_scope: source.ocaml
|
tm_scope: source.ocaml
|
||||||
|
|
||||||
ObjDump:
|
ObjDump:
|
||||||
@@ -2780,6 +2789,8 @@ Pascal:
|
|||||||
- .lpr
|
- .lpr
|
||||||
- .pascal
|
- .pascal
|
||||||
- .pp
|
- .pp
|
||||||
|
interpreters:
|
||||||
|
- instantfpc
|
||||||
ace_mode: pascal
|
ace_mode: pascal
|
||||||
|
|
||||||
Perl:
|
Perl:
|
||||||
|
|||||||
123
samples/E/atomic-updates.E
Normal file
123
samples/E/atomic-updates.E
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
#!/usr/bin/env rune
|
||||||
|
pragma.syntax("0.9")
|
||||||
|
|
||||||
|
def pi := (-1.0).acos()
|
||||||
|
def makeEPainter := <unsafe:com.zooko.tray.makeEPainter>
|
||||||
|
def colors := <awt:makeColor>
|
||||||
|
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
# --- Definitions
|
||||||
|
|
||||||
|
/** Execute 'task' repeatedly as long 'indicator' is unresolved. */
|
||||||
|
def doWhileUnresolved(indicator, task) {
|
||||||
|
def loop() {
|
||||||
|
if (!Ref.isResolved(indicator)) {
|
||||||
|
task()
|
||||||
|
loop <- ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loop <- ()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The data structure specified for the task. */
|
||||||
|
def makeBuckets(size) {
|
||||||
|
def values := ([100] * size).diverge() # storage
|
||||||
|
def buckets {
|
||||||
|
to size() :int { return size }
|
||||||
|
/** get current quantity in bucket 'i' */
|
||||||
|
to get(i :int) { return values[i] }
|
||||||
|
/** transfer 'amount' units, as much as possible, from bucket 'i' to bucket 'j'
|
||||||
|
or vice versa if 'amount' is negative */
|
||||||
|
to transfer(i :int, j :int, amount :int) {
|
||||||
|
def amountLim := amount.min(values[i]).max(-(values[j]))
|
||||||
|
values[i] -= amountLim
|
||||||
|
values[j] += amountLim
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buckets
|
||||||
|
}
|
||||||
|
|
||||||
|
/** A view of the current state of the buckets. */
|
||||||
|
def makeDisplayComponent(buckets) {
|
||||||
|
def c := makeEPainter(def paintCallback {
|
||||||
|
to paintComponent(g) {
|
||||||
|
def pixelsW := c.getWidth()
|
||||||
|
def pixelsH := c.getHeight()
|
||||||
|
def bucketsW := buckets.size()
|
||||||
|
|
||||||
|
g.setColor(colors.getWhite())
|
||||||
|
g.fillRect(0, 0, pixelsW, pixelsH)
|
||||||
|
|
||||||
|
g.setColor(colors.getDarkGray())
|
||||||
|
var sum := 0
|
||||||
|
for i in 0..!bucketsW {
|
||||||
|
sum += def value := buckets[i]
|
||||||
|
def x0 := (i * pixelsW / bucketsW).floor()
|
||||||
|
def x1 := ((i + 1) * pixelsW / bucketsW).floor()
|
||||||
|
g.fillRect(x0 + 1, pixelsH - value,
|
||||||
|
x1 - x0 - 1, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
g.setColor(colors.getBlack())
|
||||||
|
g."drawString(String, int, int)"(`Total: $sum`, 2, 20)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
c.setPreferredSize(<awt:makeDimension>(500, 300))
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
# --- Application setup
|
||||||
|
|
||||||
|
def buckets := makeBuckets(100)
|
||||||
|
def done # Promise indicating when the window is closed
|
||||||
|
|
||||||
|
# Create the window
|
||||||
|
def frame := <unsafe:javax.swing.makeJFrame>("Atomic transfers")
|
||||||
|
frame.setContentPane(def display := makeDisplayComponent(buckets))
|
||||||
|
frame.addWindowListener(def mainWindowListener {
|
||||||
|
to windowClosing(event) :void {
|
||||||
|
bind done := null
|
||||||
|
}
|
||||||
|
match _ {}
|
||||||
|
})
|
||||||
|
frame.setLocation(50, 50)
|
||||||
|
frame.pack()
|
||||||
|
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
# --- Tasks
|
||||||
|
|
||||||
|
# Neatens up buckets
|
||||||
|
var ni := 0
|
||||||
|
doWhileUnresolved(done, fn {
|
||||||
|
def i := ni
|
||||||
|
def j := (ni + 1) %% buckets.size()
|
||||||
|
buckets.transfer(i, j, (buckets[i] - buckets[j]) // 4)
|
||||||
|
ni := j
|
||||||
|
})
|
||||||
|
|
||||||
|
# Messes up buckets
|
||||||
|
var mi := 0
|
||||||
|
doWhileUnresolved(done, fn {
|
||||||
|
def i := (mi + entropy.nextInt(3)) %% buckets.size()
|
||||||
|
def j := (i + entropy.nextInt(3)) %% buckets.size() #entropy.nextInt(buckets.size())
|
||||||
|
buckets.transfer(i, j, (buckets[i] / pi).floor())
|
||||||
|
mi := j
|
||||||
|
})
|
||||||
|
|
||||||
|
# Updates display at fixed 10 Hz
|
||||||
|
# (Note: tries to catch up; on slow systems slow this down or it will starve the other tasks)
|
||||||
|
def clock := timer.every(100, def _(_) {
|
||||||
|
if (Ref.isResolved(done)) {
|
||||||
|
clock.stop()
|
||||||
|
} else {
|
||||||
|
display.repaint()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
clock.start()
|
||||||
|
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
# --- All ready, go visible and wait
|
||||||
|
|
||||||
|
frame.show()
|
||||||
|
interp.waitAtTop(done)
|
||||||
62
samples/Haskell/maze-solving.hs
Normal file
62
samples/Haskell/maze-solving.hs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/runhaskell
|
||||||
|
|
||||||
|
import Data.Maybe
|
||||||
|
|
||||||
|
-- given two points, returns the average of them
|
||||||
|
average :: (Int, Int) -> (Int, Int) -> (Int, Int)
|
||||||
|
average (x, y) (x', y') = ((x + x') `div` 2, (y + y') `div` 2)
|
||||||
|
|
||||||
|
-- given a maze and a tuple of position and wall position, returns
|
||||||
|
-- true if the wall position is not blocked (first position is unused)
|
||||||
|
notBlocked :: [String] -> ((Int, Int), (Int, Int)) -> Bool
|
||||||
|
notBlocked maze (_, (x, y)) = ' ' == (maze !! y) !! x
|
||||||
|
|
||||||
|
-- given a list, a position, and an element, returns a new list
|
||||||
|
-- with the new element substituted at the position
|
||||||
|
-- (it seems such a function should exist in the standard library;
|
||||||
|
-- I must be missing it)
|
||||||
|
substitute :: [a] -> Int -> a -> [a]
|
||||||
|
substitute orig pos el =
|
||||||
|
let (before, after) = splitAt pos orig
|
||||||
|
in before ++ [el] ++ tail after
|
||||||
|
|
||||||
|
-- given a maze and a position, draw a '*' at that position in the maze
|
||||||
|
draw :: [String] -> (Int, Int) -> [String]
|
||||||
|
draw maze (x,y) = substitute maze y $ substitute row x '*'
|
||||||
|
where row = maze !! y
|
||||||
|
|
||||||
|
-- given a maze, a previous position, and a list of tuples of potential
|
||||||
|
-- new positions and their wall positions, returns the solved maze, or
|
||||||
|
-- None if it cannot be solved
|
||||||
|
tryMoves :: [String] -> (Int, Int) -> [((Int, Int), (Int, Int))] -> Maybe [String]
|
||||||
|
tryMoves _ _ [] = Nothing
|
||||||
|
tryMoves maze prevPos ((newPos,wallPos):more) =
|
||||||
|
case solve' maze newPos prevPos
|
||||||
|
of Nothing -> tryMoves maze prevPos more
|
||||||
|
Just maze' -> Just $ foldl draw maze' [newPos, wallPos]
|
||||||
|
|
||||||
|
-- given a maze, a new position, and a previous position, returns
|
||||||
|
-- the solved maze, or None if it cannot be solved
|
||||||
|
-- (assumes goal is upper-left corner of maze)
|
||||||
|
solve' :: [String] -> (Int, Int) -> (Int, Int) -> Maybe [String]
|
||||||
|
solve' maze (2, 1) _ = Just maze
|
||||||
|
solve' maze pos@(x, y) prevPos =
|
||||||
|
let newPositions = [(x, y - 2), (x + 4, y), (x, y + 2), (x - 4, y)]
|
||||||
|
notPrev pos' = pos' /= prevPos
|
||||||
|
newPositions' = filter notPrev newPositions
|
||||||
|
wallPositions = map (average pos) newPositions'
|
||||||
|
zipped = zip newPositions' wallPositions
|
||||||
|
legalMoves = filter (notBlocked maze) zipped
|
||||||
|
in tryMoves maze pos legalMoves
|
||||||
|
|
||||||
|
-- given a maze, returns a solved maze, or None if it cannot be solved
|
||||||
|
-- (starts at lower right corner and goes to upper left corner)
|
||||||
|
solve :: [String] -> Maybe [String]
|
||||||
|
solve maze = solve' (draw maze start) start (-1, -1)
|
||||||
|
where startx = length (head maze) - 3
|
||||||
|
starty = length maze - 2
|
||||||
|
start = (startx, starty)
|
||||||
|
|
||||||
|
-- takes unsolved maze on standard input, prints solved maze on standard output
|
||||||
|
main = interact main'
|
||||||
|
where main' x = unlines $ fromMaybe ["can't solve"] $ solve $ lines x
|
||||||
100
samples/Pascal/read-a-configuration-file.pascal
Normal file
100
samples/Pascal/read-a-configuration-file.pascal
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
#!/usr/bin/instantfpc
|
||||||
|
|
||||||
|
{$if not defined(fpc) or (fpc_fullversion < 20600)}
|
||||||
|
{$error FPC 2.6.0 or greater required}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes,SysUtils,gvector,ghashmap;
|
||||||
|
|
||||||
|
type
|
||||||
|
TStrHashCaseInsensitive = class
|
||||||
|
class function hash(s: String; n: Integer): Integer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TStrHashCaseInsensitive.hash(s: String; n: Integer): Integer;
|
||||||
|
var
|
||||||
|
x: Integer;
|
||||||
|
c: Char;
|
||||||
|
begin
|
||||||
|
x := 0;
|
||||||
|
for c in UpCase(s) do Inc(x,Ord(c));
|
||||||
|
Result := x mod n;
|
||||||
|
end;
|
||||||
|
|
||||||
|
type
|
||||||
|
TConfigValues = specialize TVector<String>;
|
||||||
|
TConfigStorage = class(specialize THashMap<String,TConfigValues,TStrHashCaseInsensitive>)
|
||||||
|
destructor Destroy; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TConfigStorage.Destroy;
|
||||||
|
var
|
||||||
|
It: TIterator;
|
||||||
|
begin
|
||||||
|
if Size > 0 then begin
|
||||||
|
It := Iterator;
|
||||||
|
repeat
|
||||||
|
It.Value.Free;
|
||||||
|
until not It.Next;
|
||||||
|
It.Free;
|
||||||
|
end;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
ConfigStrings,ConfigValues: TStrings;
|
||||||
|
ConfigStorage: TConfigStorage;
|
||||||
|
ConfigLine,ConfigName,ConfigValue: String;
|
||||||
|
SeparatorPos: Integer;
|
||||||
|
begin
|
||||||
|
ConfigStrings := TStringList.Create;
|
||||||
|
ConfigValues := TStringList.Create;
|
||||||
|
ConfigValues.Delimiter := ',';
|
||||||
|
ConfigValues.StrictDelimiter := true;
|
||||||
|
ConfigStorage := TConfigStorage.Create;
|
||||||
|
|
||||||
|
ConfigStrings.LoadFromFile('config.test');
|
||||||
|
for ConfigLine in ConfigStrings do begin
|
||||||
|
if Length(ConfigLine) > 0 then begin
|
||||||
|
case ConfigLine[1] of
|
||||||
|
'#',';': ; // ignore
|
||||||
|
else begin
|
||||||
|
// look for = first
|
||||||
|
SeparatorPos := Pos('=',ConfigLine);
|
||||||
|
// if not found, then look for space
|
||||||
|
if SeparatorPos = 0 then begin
|
||||||
|
SeparatorPos := Pos(' ',ConfigLine);
|
||||||
|
end;
|
||||||
|
// found space
|
||||||
|
if SeparatorPos <> 0 then begin
|
||||||
|
ConfigName := UpCase(Copy(ConfigLine,1,SeparatorPos - 1));
|
||||||
|
ConfigValues.DelimitedText := Copy(ConfigLine,SeparatorPos + 1,Length(ConfigLine) - SeparatorPos);
|
||||||
|
// no = or space found, take the whole line as a key name
|
||||||
|
end else begin
|
||||||
|
ConfigName := UpCase(Trim(ConfigLine));
|
||||||
|
end;
|
||||||
|
if not ConfigStorage.Contains(ConfigName) then begin
|
||||||
|
ConfigStorage[ConfigName] := TConfigValues.Create;
|
||||||
|
end;
|
||||||
|
for ConfigValue in ConfigValues do begin
|
||||||
|
ConfigStorage[ConfigName].PushBack(Trim(ConfigValue));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
WriteLn('FULLNAME = ' + ConfigStorage['FULLNAME'][0]);
|
||||||
|
WriteLn('FAVOURITEFRUIT = ' + ConfigStorage['FAVOURITEFRUIT'][0]);
|
||||||
|
WriteLn('NEEDSPEELING = ' + BoolToStr(ConfigStorage.Contains('NEEDSPEELING'),true));
|
||||||
|
WriteLn('SEEDSREMOVED = ' + BoolToStr(ConfigStorage.Contains('SEEDSREMOVED'),true));
|
||||||
|
WriteLn('OTHERFAMILY(1) = ' + ConfigStorage['OTHERFAMILY'][0]);
|
||||||
|
WriteLn('OTHERFAMILY(2) = ' + ConfigStorage['OTHERFAMILY'][1]);
|
||||||
|
|
||||||
|
ConfigStorage.Free;
|
||||||
|
ConfigValues.Free;
|
||||||
|
ConfigStrings.Free;
|
||||||
|
end.
|
||||||
Reference in New Issue
Block a user