Игра пятнашки на Гиспе
2025-11-09 22:17Взял исходники игры 15 puzzle game на языке Scheme с rosettacode и перепёр на Gisp. Вроде ясный и понятный код получается. Всё в 200 строчек уложилось.
Поиграем. В качестве хода надо вводить слова up/down/left/right.
Мне с молодости импонировал Лисп (и Scheme) своим изяществом. Когда-то я даже стряпал эспериментальные реализации. Но глядеть на код со скобочками мало удовольствия. С удобным синтаксисом получается совсем другая песня.
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.
Полный протокол здесь: gist.github.com/sergev/2f8a65b7a11ea23a1693346a68a065d0$ 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
Мне с молодости импонировал Лисп (и Scheme) своим изяществом. Когда-то я даже стряпал эспериментальные реализации. Но глядеть на код со скобочками мало удовольствия. С удобным синтаксисом получается совсем другая песня.

no subject
Date: 2025-11-10 06:40 (UTC)no subject
Date: 2025-11-10 08:39 (UTC)no subject
Date: 2025-11-10 06:46 (UTC)Можно легко писать анализаторы-преобразователи кода.
С обычным синтаксисом для такого подключаются к парсеру через какой-то API.
no subject
Date: 2025-11-10 07:22 (UTC)Такого народа сильно меньше, чем кажется.
А мне желательно по человечески.
no subject
Date: 2025-11-10 08:56 (UTC)no subject
Date: 2025-11-10 09:09 (UTC)Единственный тип данных - текстовая строка.
Прошлый век. 😀
no subject
Date: 2025-11-10 17:45 (UTC)no subject
Date: 2025-11-10 23:05 (UTC)int MultiplyCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { double product = 1.0; double value; int i; if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " num1 ?num2 ...?\"", (char *) NULL); return TCL_ERROR; } for (i = 1; i < argc; i++) { if (Tcl_GetDouble(interp, argv[i], &value) != TCL_OK) { return TCL_ERROR; } product *= value; } // Convert the product back to a string and set it as the result char buf[64]; // Sufficient for double precision snprintf(buf, sizeof(buf), "%.15g", product); Tcl_SetResult(interp, buf, TCL_VOLATILE); return TCL_OK; }Так что нет, больше похоже на sed чем на язык программирования. 😀
no subject
Date: 2025-11-11 01:17 (UTC)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; }no subject
Date: 2025-11-11 02:09 (UTC)