LINUX.ORG.RU

Где ещё есть print/read как в Common Lisp с *print-readably* ?

 ,


0

4

Вот смотрю Julia

Julia:

julia> Int8[[1 2] [3 4]]
1×4 Array{Int8,2}:
 1  2  3  4
Это круто, конечно, но ведь я уже не зачитаю то, что напечаталось.

Смотрю Dylan: вроде есть что-то похожее на лисповый reader.

Смотрю Io: вроде есть что-то http://iolanguage.org/reference/index.html

  Io> Object clone do(x:=1) serialized
  ==> Object clone do(
  	x := 1
  )

Однако неясно, есть ли что-то подобное *print-readably* Соответственно, вопрос всем: где оно есть, где лично вы им пользовались?

★★★★★

Ответ на: комментарий от portquest2016

опять же, более актуальный вопрос — не о первоначалах, «кто на ком стоял», или что было раньше, что позже (раньше всё было); про «музыку небесных сфер» — когда нечто порождает что-то. важно не «сначала а или б» либо «сначала б, или а?» а «какова связь между а и б (частями), которая порождает целое, систему»

ну то есть: про полезность такого разбиения, той или иной модели. дабы невозбранно достигнуть желаемого.

вот в античности понимали музыку как математический закон, приводящий к гармонии: частот нот и длительностей, при которой звучание «в целом» гармонично (консонанты, а не диссонанты).

то есть, опять же: вопрос о мере. мере какой-то полезности.

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

такое ещё на REBOL красиво выглядит: REBOL за 10 шагов

примеры >>= rebodex.r >>= тетрис

наиболее мощная штука: parse выражения, с диалектами (типа PEG, но более человекопонятней)

что-то среднее между JSON и Фескспрами, и благодаря гомоиконности читается легко.

ещё в районе Dylan про Goo (как Дилан, только схема) и про «функциональные объекты» оттуда что-то было, в презентации.

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

ещё у него же в блоге про Icon

в контексте топика: Удобное отображение структур данных Делаем Icon литературным

описание во второй статье какое-то корявое, и примеры не наглядны, про полезность. но когда-то был какой-то более полноценный инструмент для LitProg на Icon, на ковыражениях. там всё тоже довольно наглядно.

MakeDoc из REBOL для LitProg тоже довольно прозрачный.

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

CL-USER> (defmacro define-sum-special (num)
           (let ((s (multiple-value-bind (sym)
                        (intern (format nil "*SUM-~A*" num)) sym)))
             `(defparameter ,s (loop for i fixnum from 0 to ,num sum i fixnum))))

DEFINE-SUM-SPECIAL

CL-USER> (macroexpand-1 '(define-sum-special 10))

(DEFPARAMETER *SUM-10*
  (LOOP FOR I FIXNUM FROM 0 TO 10
        SUM I FIXNUM))

и превращается в тыкву:

CL-USER> (macroexpand-1 '(define-sum-special i))
(DEFPARAMETER *SUM-I*
  (LOOP FOR I FIXNUM FROM 0 TO I
        SUM I FIXNUM))
T

что вываливается в странные ошибки. второй вариант макроса, кстати более корректный: там честно вываливается в

The value
  I
is not of type
  FIXNUM
   [Condition of type TYPE-ERROR]

с проверкой типов.

CL-USER> (macroexpand-1 '(define-sum-special yoba))
(DEFPARAMETER *SUM-YOBA*
  (LOOP FOR I FIXNUM FROM 0 TO YOBA ; зохватить и овладевать
        SUM I FIXNUM))
T
anonymous
()
Ответ на: комментарий от anonymous

Ух, как много всего! Пока просто запомню слова D, Rebol и Icon

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

А, ну да, у тебя вообще макрос криво написан и работать не будет. Надо же генерить форму в eval-when

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

Зачем там вообще defparameter?

Для наглядной демонстрации определения параметров во время компиляции :-) Твой макрос хоть и считает сумму во время компиляции, но результат выводится в REPL сразу :-) Для непосвящённых не очевидно, что результат рассчитан во время компиляции :-)

А так да, можно и defconstant, а не defparameter :-) Лол :-)

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

Кстати, это надо же было умудриться так назвать: defparameter, defconstant и defvar :-) Тогда уж, defparam, defconst, defvar, или defparameter, defconstant, defvariable :-) Странные какие-то авторы :-)

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

нет, есть. читай «THE MDL PRIMER» MIT-LCS-TR-292.pdf стр. 87

FUNCTIONs which act more like FSUBRs (i.e., they don't have their arguments EVALed.)

11.1. Arguments Not EVALed

Placing a single-quote before an ATOM in the argument list will cause that ATOM to be given the value of its respective argument without EVALuation

 <DEFINE FOO ('ITEM) .ITEM>$
FOO
<FOO <+ 1 2>>$
<+ 1 2>

[..] 11.4. Arbitary Numbers of un-EVALed Arguments

Instead of using «TUPLE», one could have used the STRING «ARGS». This has the effect of binding the following ATOM to a LIST of all of the remainding argumetns,unEVALuated. In fact, the ATOM is bound to the LIST which is the FORM used to call the FUNCTION RESTed down to the remaining arguments. The use of «ARGS» allows one to write FSUBRs in MDL.

<DEFINE FOO ("ARGS" L) .L>$
FOO
<SET F '<FOO 1 2 3>>$
<SET LL <EVAL .F>>$
(1 2 3)
<==$ .LL <REST .F 1>>$
T

In the previous example, we explicitilty called the SUBR EVAL, which caused EVALuation of the FORM <FOO 1 2 3>. This returned LIST (1 2 3), which is ==? to <REST .F 1>. Now we will write a FUNCTION to simulate FSUBR DEFINE in MDL: this is just what MDL does internally when the FSUBR DEFINE is called.

Section 11.3

<DEFINE MY-DEFINE (NAM "ARGS" L)
        <SETG .NAM <CHTYPE .L FUNCTION>>
        .NAM>$
MY-DEFINE
<MY-DEFINE FOO (A B C) <+ .A .B .C>>$
FOO
,FOO$
#FUNCTION ((A B C) <+ .A .B .C>)
<FOO 1 2 3>$
6

Now that we have simulated DEFINE, let's try out hand at AND.

<DEFINE MY-AND ("ARGS" L)
        <REPEAT ((LAST T))
            <COND (<EMPTY? .L> <RETURN .LAST>)
                  (<NOT <SET LAST <EVAL <1 .L>>>>
                   <RETURN .LAST>)
                  (T <SET L <REST .L>>)>>>$
MY-AND

This will exactly simulate the behavior of AND.

конкретно в Zork-MDL.zip макросы используются в: макрос TELL, DEFMAC ..., разные SYNTAX

конкретный SYNTAX привязан к парсеру: парсер парсит Verb-Subject-Object, и вызывает связанную рутину.

в ZIL тоже есть макросы.

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

ага, лисперы вообще знатные любители экономии на спичках, прям как перл-хакеры. Даже профессора этим грешат — SICP полон этих клоунских сокращений.

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

ага, лисперы вообще знатные любители экономии на спичках, прям как перл-хакеры. Даже профессора этим грешат — SICP полон этих клоунских сокращений.

Не, ну ладно сокращения :-) Но ведь надо тогда однообразия придерживаться :-) Сокращаете defvariable, сократите и defparameter :-)

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

экономии на спичках,

Обычно, подразумевается, что усилия тратятся на экономию там, где в целом не будет значительного выигрыша.

Объясни, как это относится к перлу? Или ты имеешь в виду весь подход тимтоуди?

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

Я может и зря перл обидел, хз. Просто я имел в виду, что на уровне базовых именований в языке, сокращения не допустимы, а если прогеру нужно что то сокпащать, это надо делать только в локальном коде, например посредством аллиасовp = veryLongName, например, что, впрочем, все равно не способствует читаемости и как правило не нужно, так как код должен говорить о себе сам. Я когда то щупал перл, и у меня сложилось такое впечатление, что перл-программисты стараются писать кратко ради самой краткости, для понтов, иными словами, а ЯП этому потворствует, и сам по себе полон всяких подобных выкрутасов:) Впрочем, я не знаток перла:)

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

помимо всего прочего, помимо того, что это все затрудняет понимание кода, бесит еще то, что разные языки сокращают все по разному, типа: printf printl println printline prline, вроде все понятно, но, пля, для каждого языка надо это все отдельно запоминать:)

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

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

не нужно так категорично :) К примеру, say(perl) vs printf printl println printline prline.

код должен говорить о себе сам.

Ты не учитываешь области применимости. К примеру, для шелл-скриптинга, синтаксис явы избыточен. И все минусы избыточности не перевесят достоинств, пригодных в другой сфере.

Еще один пример: язык регулярных выражений. Можно ведь и циклом пройтись. Однако я видел такой красивый код с регэкспами, который сочетаясь с given/when (аналог switch/case с зачаточным ИИ), неимоверно увеличивало читаемость и самодокументируемость кода больше, чем написание автоматов. Впрочем, видел на лоре программистов, которые боятся регэкспов как черт ладана.

Еще в perl есть use English. Эта прагма сделает все сокращения, которые так удобны для быстрого скриптинга человекочитаемыми для серьёзных проектов. Perl может быть одним из самых читаемых, потому что предоставляет программисту овердофига вариантов самовыражения, и лишь от программиста зависит, насколько он хочет быть понятным, и для какой целевой группы.

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

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

Надо, иначе макрос не сработает нормально.

Сработает, либо eval-when не поможет (зависит от определения «нормально»). Покажи уже код с проблемой, а то я теперь думаю, что ты не понимаешь как работают макросы.

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