LINUX.ORG.RU

Я что то недопонимаю в setf в sbcl


0

1

Почему не работает на SBCL под виндой, вот этот кусок?

(setf (Gethаsh(format nil "~a~a" Строка Столбец)Начальные-х) (* Строка 50)
(Gethаsh(format nil "~a~a" Строка Столбец)Начальные-у) (* Столбец 25)
(Gethаsh(format nil "~a~a" Строка Столбец)Конечные-х) (* (+ Строка 1) 50)
(Gethаsh(format nil "~a~a" Строка Столбец)Конечные-у) (* (+ Столбец 1) 25))

он пытается присвоить толи Gethаsh <=(format nil «~a~a» Строка Столбец) толи говорит что типа (setf Gethаsh) такой функции нет.... не пойму что он хочет... и как это обойти? Мне нужно что бы жестко по ключам записывалось в хэш таблицу, ключи естественно уникальны... и тем более мне нужно такой же алгоритм использовать при вызове значений... тоесть gensim не покатит....



Последнее исправление: RusNekromant (всего исправлений: 1)

>(Gethаsh(format nil «~a~a» Строка Столбец)Начальные-х)

Прозреваю, что тут и в остальных местах перед открывающими и после закрывающих скобок нужны пробелы

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Нет я уже пробовал, лиспу всё равно сколько пробелов до и после скобок. Имеет значение (иногда) только перенос строки.

RusNekromant
() автор топика
Ответ на: комментарий от yoghurt

Просто в общем случае две пусть и одинаковые строки, получаемые #'format-ом, являются разными объектами и разными ключами, и твоя схема летит в адъ

yoghurt ★★★★★
()
Ответ на: комментарий от RusNekromant

>И что предложишь в замен?

(defvar h (make-hash-table :test 'equal))

а почему они будут разными?

Потому что по умолчанию для сравнения ключей используется eql

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Ну спасибо, но это не решило проблему насчёт того что Setf он почему то разбивает строку на несколько агументов хотя теоретически должен видеть всего два...

RusNekromant
() автор топика
Ответ на: комментарий от yoghurt

Вот

The function (SETF ПАКЕТ.ГЛАВНЫЙ::GETHАSH) is undefined.
   [Condition of type UNDEFINED-FUNCTION]

Restarts:
 0: [RETURN-FROM-G-CLOSURE] Return value from closure
 1: [TERMINATE-THREAD] Terminate this thread (#<THREAD "cl-gtk2 main thread" RUNNING {2508B731}>)

Backtrace:
  0: ("bogus stack frame")
  1: ((LAMBDA (ПАКЕТ.ГЛАВНЫЙ::W)) #<unavailable argument>)
  2: (GOBJECT::CALL-WITH-RESTARTS #<CLOSURE (LAMBDA #) {2428EE65}> (#<GTK:BUTTON {24276B31}>))
  3: ((LAMBDA (GOBJECT::CLOSURE GOBJECT::RETURN-VALUE GOBJECT::COUNT-OF-ARGS GOBJECT::ARGS GOBJECT::INVOCATION-HINT GOBJECT::MARSHAL-DATA)) ..)
  4: ((LAMBDA (SB-ALIEN::ARGS-POINTER SB-ALIE

RusNekromant
() автор топика

Очевидно, перед нами вьюноша бледный со взором горящим, видимо, из бывших 1С-ников (если судить по ПАКЕТ.ГЛАВНЫЙ, Строка Столбец Начальный и тому подобному кошмару). Вьюноша, наслушавшийся местных лисп-троллей, забугуртивший и решивший приобщиться к ололоилитному языку.

Перед нами разворачивается фееричная эпопея, полная волнительных событий, драматизма и фейла. С нетерпением ждём следующих серий.

anonymous
()
Ответ на: комментарий от archimag

Всё там нормально с пакетами, вот они:

(asdf:oos 'asdf:load-op :cl-gtk2-gtk)
(asdf:oos 'asdf:load-op :cl-gtk2-cairo)

(defpackage :пакет.главный
  (:shadowing-import-from #:cairo #:scale #:rectangle #:pointer)
  (:use #:cl #:gtk #:gdk #:gobject #:cl-gtk2-cairo #:cairo))

(in-package :пакет.главный)

RusNekromant
() автор топика
Ответ на: комментарий от yoghurt

Нет ну везде нормально а тут проблема.... и ещё в одном месте такая же проблема была но я думал что тупо там нельзя так делать и решил проблему окольным путём, он даже лучше оказался.... но вот тут вроде должно бы работать.... может просто в SBCL какой то баг?

RusNekromant
() автор топика
Ответ на: комментарий от yoghurt

А почему кошмар? Я как раз и выбрал лисп из за того что можно на русском писать, у меня всё норм работает пока проблем небыло. Не ну правда SETF не работает(в этом конкретном случае) но я не думаю что это из за того что я на русском пишу...

RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

> Я как раз и выбрал лисп из за того что можно на русском писать

А ты знаешь, что поддержки юникода в названиях в стандарте лиспа (CL) нет? И то, что ты пишешь заработает далеко не на всех реализациях? И что такая поддержка есть, например в Java?

anonymous
()
Ответ на: комментарий от anonymous

Java проигрывает в скорости(это по тестам в сети, лично сравнить не могу). Вы в курсе что лисп вообще то не использует как java стандарт юникода для того что бы определить что это написано? Он не использует коды вообще, как раз юникод это и есть ахилесова пята явы так как юникод изменился а ява помоиму пока что не подстроилась под новый стандарт.... хотя я не спец могу и ошибаться...

RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

> Java проигрывает в скорости

Ну, это всё же вряд ли, во всяком случае, если говорить о серверных решениях.

ява помоиму пока что не подстроилась под новый стандарт


В яву 16-ти битная кодировка вбита суровыми промышленными болтами )

archimag ★★★
()
Ответ на: комментарий от archimag

)))))) эмммммм ну а насчёт Setf что делать таки? Просто ошибка SBCl? Вот у себя можете попробовать с эмулировать?

RusNekromant
() автор топика
[~]> xxd <<< '(setf (Gethаsh(format nil "~a~a" Строка Столбец)Начальные-х) (* Строка 50)'
0000000: 2873 6574 6620 2847 6574 68d0 b073 6828  (setf (Geth..sh(
0000010: 666f 726d 6174 206e 696c 2022 7e61 7e61  format nil "~a~a
0000020: 2220 d0a1 d182 d180 d0be d0ba d0b0 20d0  " ............ .
0000030: a1d1 82d0 bed0 bbd0 b1d0 b5d1 8629 d09d  .............)..
0000040: d0b0 d187 d0b0 d0bb d18c d0bd d18b d0b5  ................
0000050: 2dd1 8529 2028 2a20 d0a1 d182 d180 d0be  -..) (* ........
0000060: d0ba d0b0 2035 3029 0a                   .... 50).
[~]> xxd <<< 'Gethаsh'
0000000: 4765 7468 d0b0 7368 0a                   Geth..sh.

Я думаю, что у кого-то русский язык головного мозга

anonymous
()
Ответ на: комментарий от RusNekromant

> Просто ошибка SBCl?

Нет, естественно. Твоя ошибка. Что за ошибка не скажу, ибо кода не вижу. Проблема вот - «The function (SETF ПАКЕТ.ГЛАВНЫЙ::GETHАSH) is undefined.». Как ты этого добился я не знаю. Но можешь как временное решение попробовать указать явно пакет: cl:gethash.

archimag ★★★
()
Ответ на: комментарий от anonymous

> Я думаю, что у кого-то русский язык головного мозга

А-а-а!!! Надо сохранить куда-нибудь )))

archimag ★★★
()
Ответ на: комментарий от archimag

Да действительно ступил, наверное не стоит ночью писать... Сори за отнятое время пасибо.

RusNekromant
() автор топика
Ответ на: комментарий от archimag

Гы-гы, глазастый. :)

Тут один знакомый перец никак не мог сдать проект, потому что упорно не работал код. Он прям весь извелся. Попросил меня незамыленным взглядом глянуть, в чем проблема. Человек писал программу в Windows, поэтому не заметил, как в конфигурационном файле в «product» напечатал русскую «с». Настоящее западло. Я в Linux открыл его конфигурацию в Emacs, а так как она вся на английском была, то сразу же заметил левый символ. :)

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Да вот наверное нада через емакс прогонять иногда, а то Notepad++ хорош но таких ошибок не показывает... Я даже не представляю как вообще так получилось...

RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

> Да вот наверное нада через емакс прогонять иногда

а то Notepad++


Ты что, серьёзно пишешь код без SLIME? Так ты далеко не уедешь.

archimag ★★★
()
Ответ на: комментарий от archimag

Нет у меня стоит слим и емакс всё настроено, но просто очень не удобно мне писать в емаксе.... копировать что то это мучение для меня, может просто я не умею настраивать конечно... он копирует при выделении и поэтому если хочешь вместо одной строки вставить вторую то нужно сначала удалить старую строку потом скопировать и вставить. А удобнее скопировать в буфер потом выделить и сразу вставить с заменой... Корочь я воспитан на МS ворде и прочих блокнотах и мне стиль емакс чужд....

RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

>Да вот наверное нада через емакс прогонять иногда, а то Notepad++ хорош но таких ошибок не показывает... Я даже не представляю как вообще так получилось...

Ты бы допустил ту же самую ошибку и в Emacs. У меня Emacs показал левый символ, потому что буфер был в UTF-8, а сам файл был в windows-1251: латиница отобразилась нормально, а русский символ в унибайтной кодировке — нет.

P.S. Работать в CL и писать программы в Notepad++?! Это крайняя степень мазохизма.

Zubok ★★★★★
()
Ответ на: комментарий от RusNekromant

> Корочь я воспитан на МS ворде и прочих блокнотах

и мне стиль емакс чужд....


Да при чём здесь это. Разрабатывать на CL без адекватной среды нормально нельзя. Ты просто отказываешься от лисп-подхода к разработке.

archimag ★★★
()
Ответ на: комментарий от archimag

Нет я некоторые функции новые проверяю в емаксе... а синтаксис подсвечивает и нотпад++, у него удобно сворачивать блоки программы что бы не листать... ну наверное конечно вы правы нада покопаться в настройках может можна норм привести...

RusNekromant
() автор топика
Ответ на: комментарий от RusNekromant

> Корочь я воспитан на МS ворде и прочих блокнотах и мне стиль емакс чужд....
Там есть богомерзкий режим для таких как ты - CUA.

Menu->Options->ставишь галку на нужной строчке, потом Save Options. И всё прям как во всех прочих редакторах.

memnek
()

Factor:

USING: io.files io.encodings.utf8 kernel
sequences splitting ;

«table.txt» utf8 [
file-lines
[ «|» split ] map flip [ «|» join ] map
] 2keep
set-file-lines

ЛNСП:
...
)))))...

---
Feel teh difference.

quantum-troll ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.