vak: (Default)
[personal profile] vak
Взял исходники игры 15 puzzle game на языке Scheme с rosettacode и перепёр на Gisp. Вроде ясный и понятный код получается. Всё в 200 строчек уложилось.
func playGame() {
var board = createStartPosition()
var movesTaken = 0
while true {
if finished(board) {
newline()
display("COMPLETED PUZZLE in ")
display(movesTaken)
display(" moves\n")
return
}
displayBoard(board)
var moves = findMoves(board)
display("Enter a move: ")
display(moves)
newline()
var move = read()
if moveAllowed(moves, move) {
makeMove(board, move)
movesTaken = movesTaken + 1
} else {
display("Invalid move - try again\n")
}
}
}
Весь текст: puzzle15.gisp

Поиграем. В качестве хода надо вводить слова up/down/left/right.
$ gisp puzzle15.gisp 

7 3 4
2 11 8 12
1 13 6 15
5 9 14 10
Enter a move: (down right)
down

2 7 3 4
11 8 12
1 13 6 15
5 9 14 10
Enter a move: (up down right)
down

2 7 3 4
1 11 8 12
13 6 15
5 9 14 10
Enter a move: (up down right)
right

...

1 2 3 4
5 6 7 8
9 10 11
13 14 15 12
Enter a move: (up down left)
down

COMPLETED PUZZLE in 50 moves
Полный протокол здесь: gist.github.com/sergev/2f8a65b7a11ea23a1693346a68a065d0

Мне с молодости импонировал Лисп (и Scheme) своим изяществом. Когда-то я даже стряпал эспериментальные реализации. Но глядеть на код со скобочками мало удовольствия. С удобным синтаксисом получается совсем другая песня.

Date: 2025-11-10 06:40 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Отлично! Хороший язык получился.

Date: 2025-11-10 06:46 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
В скобках есть смысл: программа доступна как данные.
Можно легко писать анализаторы-преобразователи кода.

С обычным синтаксисом для такого подключаются к парсеру через какой-то API.

Date: 2025-11-10 08:56 (UTC)
sab123: (Default)
From: [personal profile] sab123
Современный улучшенный Лисп - это Tcl.

Date: 2025-11-10 17:45 (UTC)
sab123: (Default)
From: [personal profile] sab123
Вас кто-то обманул. Тикл, конечно, язык без строгой типизации (как и Лисп), но типы в нем есть - целые, вещественные, строки, байтовые строки. Главное достижение по сравнению с Лиспом - операторы uplevel и upvar, делающие замыкания ненужными. Я как-то даже объектную ориентированность прикручивал.

Date: 2025-11-11 01:17 (UTC)
sab123: (Default)
From: [personal profile] sab123
Это _очень_ старая версия Tcl, наверное около 30-летней давности. В 20-летней давности (версия 7.6) старый вариант был для совместимости, но по-новому уже передаются объекты:

static int
lreverse(cld, interp, objc, objv)
    ClientData cld;
    Tcl_Interp *interp;
    int objc;
    Tcl_Obj **objv;
{
    int i, len; 
    Tcl_Obj *old, *new, **buf, **src, **dst;

    
    if(objc!=2) {
        interp->result = "Use: lreverse ";
        return TCL_ERROR;
    }
    old = objv[1];
    if( Tcl_ListObjGetElements(interp, old, &len, &src) == TCL_ERROR )
        return TCL_ERROR;
    if(( buf = malloc(len * sizeof(*buf)) )==NULL) {
        interp->result = "lreverse: unable to allocate temporary space";
        return TCL_ERROR;
    }
    dst = buf + len;
    while(dst != buf)
        *--dst = *src++;
    new = Tcl_NewListObj(len, buf);
    free(buf);
    if(new == NULL)
        return TCL_ERROR;
    Tcl_SetObjResult(interp, new);
    return TCL_OK;
}