LINUX.ORG.RU
ФорумTalks

Знатокам лиспа


0

0

Какому типу данных в лиспе соотвествует

unsigned char data[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00};

Строка или битовый вектор или еще чего-нибудь?


vector

(капча попалась niggers - сву, шоман, я оскорблен)

anonymous
()

в mzscheme есть строко-подобный тип bytes, и обычные строки могут содержать нулевой символ

inoremap ★★
()

Сун-ч, не пытайся писать на брейнфаке. Истинно говорю тебе.

Gharik
()

(let ((data (1 2 3 4 5 6)))
(with-foreign-object (foreign-data :char (length data))
(loop for elem in data
for index from 0
do (setf (mem-aref foreign-data :char index) elem))))

это если нужно заполнить этот массив
А если нужно просто прочитать данные то
(mem-aref foreign-data :char index)

Встречный вопрос знатокам common lisp:
Пишу jfli на CFFI. (биндинг явы и common lisp с помощью JNI)
Как вы думаете этот проект будет кому-нибудь нужен кроме меня?

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

посмотри http://www.cliki.net/ffa - удобный и быстрый способ обращения с массивами через cffi.
p.s. извиняюсь за хамство

bik ★★
()

Ололо. И эти люди бухтят о превосходстве лиспа во всех поголовно областях. Производство, космос, военка? Обработка научных и инженерных данных? Какая нах обработка, когда у вас нету элементарных бинарных массивов. А попробуйте всосать в память файл на 200 мегабайт, чтобы потом анализировать побайтно. Сколько реально памяти для этого потребуется, а? в 8 раз больше?

Забудьте о лиспе в практических областях применения. Его удел (равно как и Хаскеля, на который упорно др*чит местное псевдоэлитарное небыдло) - заоблачная академическая мутотень.

anonymous
()

А ну-ка, элита. Слабайте-ка на лиспе (я знаю, вам это ничего не стоит) такую вот типичную программулину с производства. Принять с non-seekable потока 200 мегабайт двоичных данных (Xn, n=1..200M), и выдать 200 мегабайт отклонений от среднего (Dn=(Xn-sum(Xn)).

Судя по байкам, это должно занимать от силы три строки. Ну-с, поехали. Да, и не забудьте тайминг и расход хипа показать.

anonymous
()

К слову. Соответствующая программа на Си занимает 16 (шестнадцать) строк, и аллокирует ровно 209715200 байт (200 мебибайт) хипа.

Это чтобы вам было на что ориентироваться, пионерия.

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

А ты что такой дерзкий дядя?

Примерно так:

(with-open-file (s "200_meg_govna" :element-type 'unsigned-byte)
 (x s)

(defun x (stream)
  (let* ((buffer-size (* 1024 1024 200))
	 (buffer (vector :unsigned-char 8 buffer-size))
	 (summa 0) (med 0) (s 0))
    (dotimes (i buffer-size)
      (when (setf s (read-byte stream))
	(incf summa s)
	(setf (aref buffer i) s)))
    (setf med (/ summa buffer-size))
    (dotimes (i buffer-size)
      (setf (aref buffer i) (- (aref buffer i) med)))))

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

А вот код который сделал компилятор.

CL-USER> 
;;;; (disassemble 'x) ...
; 0AD6691B:       64               FS-SEGMENT-PREFIX          ; no-arg-parsing entry point
;       1C:       800D5000000004   OR BYTE PTR [#x50], 4
;       23:       B818000000       MOV EAX, 24
;       28:       64               FS-SEGMENT-PREFIX
;       29:       030528000000     ADD EAX, [#x28]
;       2F:       64               FS-SEGMENT-PREFIX
;       30:       3B052C000000     CMP EAX, [#x2C]
;       36:       7607             JBE L0
;       38:       E807CC2FFD       CALL #x8063544             ; alloc_overflow_eax
;       3D:       EB0A             JMP L1
;       3F: L0:   64               FS-SEGMENT-PREFIX
;       40:       890528000000     MOV [#x28], EAX
;       46:       83E818           SUB EAX, 24
;       49: L1:   8D4007           LEA EAX, [EAX+7]
;       4C:       C640F9B2         MOV BYTE PTR [EAX-7], 178
;       50:       C640FD0C         MOV BYTE PTR [EAX-3], 12
;       54:       64               FS-SEGMENT-PREFIX
;       55:       80355000000004   XOR BYTE PTR [#x50], 4
;       5C:       7402             JEQ L2
;       5E:       CC09             BREAK 9                    ; pending interrupt trap
;       60: L2:   8B0DE868D60A     MOV ECX, [#xAD668E8]       ; :UNSIGNED-CHAR
;       66:       894801           MOV [EAX+1], ECX
;       69:       B920000000       MOV ECX, 32
;       6E:       894805           MOV [EAX+5], ECX
;       71:       B900000032       MOV ECX, 838860800
;       76:       894809           MOV [EAX+9], ECX
;       79:       8BC1             MOV EAX, ECX
;       7B:       31C0             XOR EAX, EAX
;       7D:       31F6             XOR ESI, ESI
;       7F:       EB18             JMP L5
;       81: L3:   8975F4           MOV [EBP-12], ESI
;       84:       8BD0             MOV EDX, EAX
;       86:       8BFE             MOV EDI, ESI
;       88:       E8B39729F6       CALL #x1000140             ; GENERIC-+
;       8D:       7302             JNB L4
;       8F:       8BE3             MOV ESP, EBX
;       91: L4:   8BC2             MOV EAX, EDX
;       93:       8B75F4           MOV ESI, [EBP-12]
;       96:       83C604           ADD ESI, 4
;       99: L5:   81FE00000032     CMP ESI, 838860800
;       9F:       7CE0             JL L3
;       A1:       BF00000032       MOV EDI, 838860800
;       A6:       8BD0             MOV EDX, EAX
;       A8:       8BDC             MOV EBX, ESP
;       AA:       55               PUSH EBP
;       AB:       83EC08           SUB ESP, 8
;       AE:       8BEB             MOV EBP, EBX
;       B0:       B908000000       MOV ECX, 8
;       B5:       FF15CC071001     CALL DWORD PTR [#x11007CC]
;       BB:       7302             JNB L6
;       BD:       8BE3             MOV ESP, EBX
;       BF: L6:   8D65F8           LEA ESP, [EBP-8]
;       C2:       F8               CLC
;       C3:       8B6DFC           MOV EBP, [EBP-4]
;       C6:       C20400           RET 4
;       C9:       CC0A             BREAK 10                   ; error trap
;       CB:       02               BYTE #X02
;       CC:       18               BYTE #X18                  ; INVALID-ARG-COUNT-ERROR
;       CD:       4D               BYTE #X4D                  ; ECX

Sun-ch
() автор топика

ЗЫЖ это массив, если жо этого других определений не было

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

Ща, джаст э момент.

Pentium III 800 Mhz

Evaluation took: 95.086 seconds of real time 93.677855 seconds of total run time (92.461779 user, 1.216076 system) [ Run times consist of 7.552 seconds GC time, and 86.126 seconds non-GC time. ] 98.52% CPU 85,575,484,993 processor cycles Не совсем понимаю, как измерить расход хипа, память я выделяю 1 раз и сборщик мусора работает только после выхода из функции?

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

CL-USER> *features*
(:SB-BSD-SOCKETS-ADDRINFO :ASDF :ANSI-CL :COMMON-LISP :SBCL :SB-DOC :SB-TEST
 :SB-LDB :SB-THREAD :SB-PACKAGE-LOCKS :SB-UNICODE :SB-EVAL :SB-SOURCE-LOCATIONS
 :IEEE-FLOATING-POINT :X86 :UNIX :ELF :LINUX :LARGEFILE :GENCGC
 :STACK-GROWS-DOWNWARD-NOT-UPWARD :C-STACK-IS-CONTROL-STACK
 :COMPARE-AND-SWAP-VOPS :UNWIND-TO-FRAME-AND-CALL-VOP :RAW-INSTANCE-INIT-VOPS
 :STACK-ALLOCATABLE-CLOSURES :ALIEN-CALLBACKS :CYCLE-COUNTER :LINKAGE-TABLE
 :OS-PROVIDES-DLOPEN :OS-PROVIDES-PUTWC :OS-PROVIDES-SUSECONDS-T)

sbcl-1.21

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

> Не совсем понимаю, как измерить расход хипа, память я выделяю 1 раз и сборщик мусора работает только после выхода из функции?

Ну я не знаю, как это сделать кошерноправославным лисповым способом, но на крайняк запусти свою программку под /usr/bin/time -v (если ты на Линуксе).

tailgunner ★★★★★
()
Ответ на: комментарий от Sun-ch

>как измерить расход хипа

самое кондовое - запустить через valgrind
жужжать будет значительно дольше, но память таки померяет

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

>Принять с non-seekable потока 200 мегабайт двоичных данных (Xn, n=1..200M), и выдать 200 мегабайт отклонений от среднего (Dn=(Xn-sum(Xn)).

Вы таки считаете мат. ожидание и дисперсию ВСЕГО массива данных? Можно же считать начальные Mx и Dx по небольшому (скажем ~10%) объёму данных, а потом танцууя от сей печки досчитывать оные Mx и Dx на новых порциях данных.

Память экономится в разы.

marsijanin ★★
()
Ответ на: комментарий от Sun-ch

>что в контексте CFFI

Вопрос был как это сделать в Common Lisp'е, не?

marsijanin ★★
()
Ответ на: комментарий от Sun-ch

Ну что, мои красноглазые пупсики, стесняетесь привести вывод Valgrind? А я его сам приведу. Только вот незадача какая:

>Evaluation took: 95.086 seconds


Sun-ch, по-моему, Вы лжёте, Вы ничего не запускали, а данные выдумали из головы. Вышеприведённая программа не компилируется, хотя бы потому, что там забыта одна закрывающая скобка. Но даже после исправления:

debugger invoked on a SIMPLE-ERROR in thread #<THREAD "initial thread" RUNNING {A6E1709}>:
Error during processing of --eval option (LOAD #P"foo.cl"):

The function X is undefined.

Потрудитесь об'ясниться. SBCL 1.0.21 (Вы ошиблись, 1.21 нет в природе)

Кстати, красноречивый момент: сам лиспо-писака не может сосчитать скобок в элементарной программе! Что же будет в случае большого проекта? Как разобраться во всей этой "мешанине из обрезков ногтей" (С) Ларри Уолл? Спасибо за внимание.

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

Не передёргивайте. Я просил не распространяться на тему оптимизации, а решить конкретную (сильно упрощённую) задачу из реальной жизни. Подойдёт любая задача над большим количеством бинарных данных, не решаемая в потоковом режиме за один проход (т.е. требующая сохранения всего массива в памяти). Например, пусть массив представляет собой прямоугольную матрицу, вычислить среднее в нескольких неизвестных заранее нерегулярных областях.

Да к чёрту это, вы мне просто загрузите ну хотя бы 10 мегабайт из /dev/urandom в память, посуммируйте и покажите расход хипа! всё!

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

Благодарю! Как Вы оперативно реагируете, респект :)

Может, подсобите запустить поделие Саныча? а то что-то там нечисто

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

> подсобите запустить поделие Саныча?

Мои скудные познания в Лиспе говорят, что сначала должно идти определение функции (defun x), а потом - ее использование (witj-open-file), т.е.

(defun x (stream)
  (let* ((buffer-size (* 1024 1024 200))
	 (buffer (vector :unsigned-char 8 buffer-size))
	 (summa 0) (med 0) (s 0))
    (dotimes (i buffer-size)
      (when (setf s (read-byte stream))
	(incf summa s)
	(setf (aref buffer i) s)))
    (setf med (/ summa buffer-size))
    (dotimes (i buffer-size)
      (setf (aref buffer i) (- (aref buffer i) med)))))

(with-open-file (s "200_meg_govna" :element-type 'unsigned-byte)
 (x s))

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

Хрен редьки не слаще.

debugger invoked on a TYPE-ERROR in thread #<THREAD "initial thread" RUNNING {A6E1669}>:
The value 3 is not of type (MOD 3).

Придётся привлекать самих горе-лисперов к процессу их изобличения. :)
Капча smacker кагбэ подстёгивает

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