Date: Sun, 1 Jul 2001 02:03:01 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: [lang] [BF] Emacs mode


Hi,

I worked up a little emacs mode for brainfuck including an interpreter and
odd debugging functionality.

Please look at my comments for more details, though. They comprise more
than a third of the file, after all :-)

Markus


-- Attached file included as plaintext by Listar --
-- File: bf.el

;;; bf.el --- Major mode for editing, running and debugging brainfuck

;; Copyright (C) 2001 Markus Kliegl

;; Author: Markus Kliegl <markus.kliegl@t-online.de>
;; Created: 24 Jun 2001
;; Version: 0.1
;; Keywords: bf brainfuck

;; This software is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; This software is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this software; see the file COPYING.  If not, write to the
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:

;;; Using

;; Editing commands:
;; C-c %     -- jumps to the matching bracket.

;; Running and debugging commands:
;; C-c C-s p -- sets the value of the pointer
;; C-c C-s a -- set the values of the elements of the array
;;   (val-of-elt-0 val-of-elt-1... val-of-elt-n)
;;   (val-of-elt-0 (10 val-of-elt-10) val-of-elt-11... val-of-elt-n)
;;   ex: (5 (10 12) 6 (4 2) 4) will set element 0 to 5, element 10 to
;;   12, element 11 to 6, element 4 to 2 and element 5 to 4.
;; C-c C-p   -- Display the value of the pointer
;; C-c C-a   -- Display the value of the nth element of the array
;;              (defaults to a[p])
;; C-c C-b a -- Add a breakpoint at current cursor position
;; C-c C-b d -- Remove breakpoint at current cursor position
;; C-c C-b r -- Remove all breakpoints
;; C-c C-t   -- Reset pointer and all array elements to 0.
;;              Reset current position (in case of being after a breakpoint)
;; C-c C-r   -- Interpret the buffer
;; C-c C-c   -- Continue interpreting after a breakpoint

;; The Interpreter

;; It should work similar to most other interpreters, though
;; at the moment it is very slow (be sure to byte-compile this file
;; or it will be *way* too slow!)

;; When reading input, pressing ESC will put 0 into a[p], similar
;; to the EOF->0 of other interpreters.

;; I tested the interpreter with a hello world and cat ( +[,.] )
;; program and they seem to be working. 99 bottles of beer, however,
;; doesn't seem to be working. Oddly enough, using the debugger, it
;; appears that it manages to print out the text of the first 9 bottles
;; (i.e. down to 90 bottles...) and then runs into an infinite loop with
;; weird negative numbers in the array. The program runs fine on Panu's
;; bfi, though.

;;; Installing

;; Emacs must be able to find this file, so there are two options:
;; (1) Copy this file to your local site-lisp directory. This will
;;     usually be something like /usr/local/share/emacs/site-lisp
;;     To see a list of all directories that emacs searches on
;;     startup, start emacs and in the *scratch* buffer type
;;     'load-path' (without the quotes, obviously) and press C-j.
;; (2) Add the following to your ~/.emacs file (where "/some/dir"
;;     is the directory which contains this file):
;;     (setq load-path (cons "/some/dir" load-path))

;; In order for emacs to automatically put you in brainfuck-mode when
;; editing a file, whose name ends in either .b or .bf, add the following
;; to your ~/.emacs:
;; (autoload 'bf-mode "bf" "Brainfuck major mode" t)
;; (setq auto-mode-alist
;;   (append '(("\\.b$"  . bf-mode)
;;             ("\\.bf$" . bf-mode))
;;           auto-mode-alist))

;; For efficiency reasons it is recommended to run the following at your
;; shell in order to obtain a byte-compiled version, bf.elc, of this file.
;; $ emacs -batch -f batch-byte-compile bf.el
;; In particular the interpreter and startup are considerably faster.

;;; Customizing

;; I don't quite get the differences between the following two methods, in
;; particular I'm having problems understanding all this 'customization'
;; stuff and only included it in this version to get some hints on how to
;; use it correctly.
;; You can customize several things. There should be two ways to do this:
;; (1) type M-x customize-group RET bf RET. There you should be able to
;;     change the values of the customizable variables.
;; (2) Set the bf-mode-hook in your ~/.emacs. For example, you could use
;;     something like the following:
;;     (setq bf-mode-hook
;;           '(lambda ()
;;              (setq bf-arr-size 1000)))

;;; Todo:

;; * optional running of external bf interpreter/compiler
;; * editing commands
;;      + generate-string
;;      + set-current-elt-to-val
;;      + copy n times to left/right
;;      + ...
;; * fix the customization stuff
;; * clean up matching-bracket (especially to reuse common code)
;; * speed up interpreter
;; * don't print ^@ when ESC is entered, etc.
;; * more debugging capabilities (stepping through the program, etc.)

;;; Change Log:

;; 0.1
;; - initial version

;;; Bugs:

;; * the temporary buffer doesn't display until the program
;;   finished running or is otherwise stopped and is apparently
;;   reopened when continuing after a break
;; * why doesn't 99 bottles of beer work?

;;; Code:

(eval-when-compile
  (require 'cl)
  (require 'custom))

;;; Customization
(defgroup brainfuck nil
  "Major mode for editing, running and debugging brainfuck."
  :group 'languages)

(defcustom bf-arr-size 30000
  "*Size of the array."
  :type 'int
  :group 'bf)

(defcustom bf-mode-hook nil
  "*Hook that is run on startup of brainfuck mode"
  :type 'hook
  :group 'bf)

;;; Editing
(defun matching-bracket-open ()
  (interactive)
  (let ((cur (point)) (end (point-max)) (depth 1) (not-found t))
    (while (and (< cur end) not-found)
      (incf cur)
      (case (char-after cur)
        (?\[ (incf depth))
        (?\] (decf depth)
             (when (= depth 0)
               (setq not-found nil)))))
    (goto-char cur)))

(defun matching-bracket-close ()
  (interactive)
  (let ((cur (point)) (end (point-min)) (depth 1) (not-found t))
    (while (and (> cur end) not-found)
      (decf cur)
      (case (char-after cur)
        (?\] (incf depth))
        (?\[ (decf depth)
             (when (= depth 0)
               (setq not-found nil)))))
    (goto-char cur)))

(defun matching-bracket ()
  "Jump to matching bracket."
  (interactive)
  (case (char-after (point))
    (?\[ (matching-bracket-open))
    (?\] (matching-bracket-close))
    (t (message "Not on a bracket!"))))

;;; Running and debugging
(defvar bf-ptr 0 "Pointer")

(defvar bf-arr (make-vector bf-arr-size 0) "Array")

(defvar bf-break-points nil "Breakpoints for debugging purposes")

(defvar bf-cur-pos (point-min) "Current position")

(defun set-ptr (n)
  "Set the initial value of the pointer."
  (interactive "NInitial value of pointer: ")
  (setq bf-ptr n)
  (message "Pointer set!"))

(defun set-arr-aux (lst n)
  (let ((x (car lst)))
    (cond ((consp x)
           (let ((idx (car x)))
             (aset bf-arr idx (cadr x))
             (set-arr-aux (cdr lst) (1+ idx))))
          ((null lst) nil)
          (t (aset bf-arr n x) (set-arr-aux (cdr lst) (1+ n))))))

(defun set-arr (lst)
  "Set the initial values of the elements of the array."
  (interactive "xArray initialization: ")
  (set-arr-aux lst 0)
  (message "Array set!"))

(defun val-of-ptr ()
  "Display the value of the pointer."
  (interactive)
  (message "%d" bf-ptr))

(defun val-of-arr-elt (&optional n)
  "Display the element of the array denoted by the numeric prefix
argument. Default value is the pointer."
  (interactive "P")
  (let ((x (if (not n) bf-ptr (prefix-numeric-value n))))
    (message "a[%d]: %d" x (aref bf-arr x))))

(defun reset-for-new-run ()
  "Reset the pointer, array and current position for a new run."
  (interactive)
  (setq bf-arr (map 'vector #'(lambda (foo) 0) bf-arr))
  (setq bf-ptr 0)
  (setq bf-cur-pos (point-min))
  (message "Reset!"))

(defun add-break-point ()
  "Add a break point."
  (interactive)
  (push (point) bf-break-points)
  (message "Breakpoint added at %d" (point)))

(defun remove-break-point ()
  "Remove a break point."
  (interactive)
  (delete (point) bf-break-points)
  (message "Breakpoint at %d removed" (point)))

(defun remove-all-break-points ()
  "Remove all break points."
  (interactive)
  (setq bf-break-points ())
  (message "All breakpoints removed!"))

(defun bf-interpret ()
  (let ((end (point-max)))
    (while (< (point) end)
      (when (member (point) bf-break-points)
        (message "Breakpoint at %d" (point))
        (setq end -1))
      (case (char-after (point))
        (?+ (incf (aref bf-arr bf-ptr)))
        (?- (decf (aref bf-arr bf-ptr)))
        (?> (incf bf-ptr))
        (?< (decf bf-ptr))
        (?. (write-char (aref bf-arr bf-ptr)))
        (?, (aset bf-arr bf-ptr
                  (let ((c (read-char)))
                    (if (= c ?\e)
                        0
                      c))))
        (?\[ (when (= (aref bf-arr bf-ptr) 0)
               (matching-bracket-open)))
        (?\] (unless (= (aref bf-arr bf-ptr) 0)
               (matching-bracket-close))))
      (forward-char 1))))

(defun run-bf (&optional cont)
  "Interpret the current buffer."
  (interactive)
  (message "Running...")
  (save-excursion
    (unless cont
      (setq bf-cur-pos 0))
    (goto-char bf-cur-pos)
    (with-output-to-temp-buffer "*bf-run*"
      (bf-interpret))
    (setq bf-cur-pos (point))))

(defun bf-continue ()
  "Continue running after stopping at a breakpoint."
  (interactive)
  (message "Continuing at %d..." bf-cur-pos)
  (run-bf t))

;;; General
(defconst bf-mode-version "0.1")

(defvar bf-mode-map nil)

(unless bf-mode-map
  (setq bf-mode-map (make-sparse-keymap))
  (define-key bf-mode-map "\C-c%" 'matching-bracket)
  (define-key bf-mode-map "\C-c\C-p" 'val-of-ptr)
  (define-key bf-mode-map "\C-c\C-a" 'val-of-arr-elt)
  (define-key bf-mode-map "\C-c\C-sp" 'set-ptr)
  (define-key bf-mode-map "\C-c\C-sa" 'set-arr)
  (define-key bf-mode-map "\C-c\C-ba" 'add-break-point)
  (define-key bf-mode-map "\C-c\C-bd" 'remove-break-point)
  (define-key bf-mode-map "\C-C\C-br" 'remove-all-break-points)
  (define-key bf-mode-map "\C-c\C-t" 'reset-for-new-run)
  (define-key bf-mode-map "\C-c\C-r" 'run-bf)
  (define-key bf-mode-map "\C-c\C-c" 'bf-continue))

(defvar bf-mode-syntax-table nil)

(unless bf-mode-syntax-table
  (setq bf-mode-syntax-table (make-syntax-table))
  (modify-syntax-entry ?+ "." bf-mode-syntax-table)
  (modify-syntax-entry ?- "." bf-mode-syntax-table)
  (modify-syntax-entry ?< "." bf-mode-syntax-table)
  (modify-syntax-entry ?> "." bf-mode-syntax-table)
  (modify-syntax-entry ?. "." bf-mode-syntax-table)
  (modify-syntax-entry ?, "." bf-mode-syntax-table)
  (modify-syntax-entry ?\[ "(]" bf-mode-syntax-table)
  (modify-syntax-entry ?\] ")[" bf-mode-syntax-table))

(defvar bf-mode-abbrev-table nil)

(define-abbrev-table 'bf-mode-abbrev-table ())

(defun bf-mode ()
  "Major mode for editing and running brainfuck. Please see the
comments at the beginning of the file bf.el for instructions on
how to setup bf-mode and general information and documentation
on what bf-mode provides and how to use it.

Key bindings:
\\{bf-mode-map}"
  (interactive)
  (message "Brainfuck mode v%s" bf-mode-version)
  (kill-all-local-variables)
  (use-local-map bf-mode-map)
  (set-syntax-table bf-mode-syntax-table)
  (setq local-abbrev-table bf-mode-abbrev-table)
  (setq major-mode 'bf-mode)
  (setq mode-name "Brainfuck")
  (run-hooks 'bf-mode-hook))

;;; bf.el ends here


------------------------------

Date: Sun, 1 Jul 2001 02:55:01 +0200 (CEST)
From: "Rafal M. Sulejman" <rafal@engelsinfo.de>
Subject: [lang] Re: [BF] Emacs mode

On Sun, 1 Jul 2001, markus.kliegl wrote:

> I worked up a little emacs mode for brainfuck including an
> interpreter and odd debugging functionality.

Heh, someone to implement this in vi? emacsers just won a battle
in this world domination war ;) (Use of BF against civil
population was forbidden by UN in 1999)

> Please look at my comments for more details, though. They
> comprise more than a third of the file, after all :-)

FSF will probably send you four six-packs of Virtual Beer :)
Now I have *real* reason to learn eeee-macs.

BTW. -- where do you live, Markus? Ich bin ein M'jlabbacher (not
exactly ;)
--
 . . . . | Rafal M. Sulejman <rms@spam-haters.poczta.onet.pl>
 . # . . |
 # . # . | "It's a small world, but I wouldn't want
 . . # . |  to have to paint it." --Steven Wright





------------------------------

Date: Sun, 01 Jul 2001 17:27:53 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: pretentious rant about operating systems

I'll get right to the point.  WHERE'S THE METADATA?

The answer: when it is there, it is spread across umpteen configuration
files that don't know about each other, OR, it is lumped willy-nilly
into an obscure, convoluted centralized database... but it's usually not
there.

The fact is that system objects (files, devices, etc) have relationships
with each other.  Relationships are nothing new in computer science,
we've been using relational databases for years.  So why hasn't the
rather simple concept of "Object-A somehow-relates-to Object-B" filtered
down to the operating system level yet?

We have dependencies in 'make' scripts, and we have 'install' and
'uninstall' scripts, and we have 'file type detection' in the form of
either file suffix or 'magic'... but these are all loose and scattered
functions.  In the meantime, you can rename a file and none of these
measures are the wiser.  (And when an OS does have enough seatbelts to
warn you, the warning is seemingly never specific enough: "file may be
required by some installed packages" - well I'd love to know which
ones?!?)

There are some other little things that are just shell/filesystem
issues.  I'd love for a shell to be able to change to a directory just
by typing its name.  It should be obvious that "enter" is the verb to be
implied when you just name a directory.  I'd also love for the FS to be
able to treat archive files (.tar, .tgz, .zip, .bz2 etc) as directories,
so you could "enter" them and copy files in and out with the usual
commands (not to mention having programs like "find" able to search
within archives automatically :)

Chris

-- 
This sentence was false half an hour ago, did you notice?


------------------------------

Date: Mon, 2 Jul 2001 01:54:30 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: Re: pretentious rant about operating systems



On Sun, 1 Jul 2001, Chris Pressey wrote:

> 
> There are some other little things that are just shell/filesystem
> issues.  I'd love for a shell to be able to change to a directory just
> by typing its name.  It should be obvious that "enter" is the verb to be
> implied when you just name a directory.

I'm quite sure that would be simple enough to change... most shells these
days hash executables in the PATH, so it should be easy enough to detect
if there's an executable of the same name as the directory and then ask
the user.

Interesting, though... having to type 'cd' to change directories never
bothered me. 'some_dir' just doesn't seem right to me for changing to
directory some_dir. Why not have <directory>ENTER mean 'ls <directory>'
instead? Or something else if you get what I mean :-)

> I'd also love for the FS to be
> able to treat archive files (.tar, .tgz, .zip, .bz2 etc) as directories,
> so you could "enter" them and copy files in and out with the usual
> commands (not to mention having programs like "find" able to search
> within archives automatically :)

There was an interesting article on freshmeat a while ago...
http://freshmeat.net/articles/view/237/

> 
> Chris
> 
> -- 
> This sentence was false half an hour ago, did you notice?
>



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: a linux rant  (was: pretentious rant about operating systems)
Date: Mon, 2 Jul 2001 20:48:41 +0100


Chris, Metadata: you have problems! Here is what happened the weekend before
last:

I am dissatisfied with Windows again and decide its once again try working
my way with Linux. I buy the brand new Suse Linux 7.2 Pro at 130,- DM.
"Free", really. I go home and boot the DVD -> the boot process stops and
shows a blank screen. For the 130,- DM I have the right to phone a support
line; I stay for nearly one hour on the phone with support until they give
up: my machine is not supported, write down all hardware & send a letter.
[Its a brandnew Dual 1GHz P3 with 512m].

I try changing various BIOS settings until I find a combination that lets me
install Linux. I am greeted with a resolution of 800x600. (I have a GeForce
2MX, plus a 21" monitor capable of 2048x1536, but I am willing to do with
1600x1200). I install XFree 4.1.0. When I switch to 1600x1200, the mouse
disappears. But this is not a problem, since SAX2 has lost its capability of
changing the resolution anyway: I can change it, but it has no effect on
KDE. I reinstall Linux. SAX2 works, but my Monitor is not on the monitor
list (its an USB monitor on a OS with USB support, btw) & I have to fiddle
with settings. I have to edit vertical & horizontal freqs; If I enter the
specs given by my monitors vendor, the screen gets blank; I thus enter the
specs of a different 21" monitor I use @ work, finally I see something
somewhat resembling 1600x1200, but with a total different screen dimension
than W2K on the same machine. I'm probably ruining my monitor as I speak.

I enable font antialiasing. The font for Konsole changes to something
unreadable and unrenderable. I quickly decide to disable font antialising
again.

I start Mozilla. It fails on my homepage. It shows a clearly faulty error
message for out-of-memory, on a 512mB machine. I start Konqueror. It has
trouble with my homepage. I cannot change the fonts in Konqueror, even
though the default fonts designed for 800x600 look really really really
really tiny on a 1600x1200 resolution.

I edit some python scripts in NEdit. NEdit uses unreadble oldskool X-Widgets
(I never figured out if that checkbutton is now pressed or depressed).
NEdits Ctrl+S doesn't work 50% of the time. NEdit mixes \t and spaces so the
source gets unreadble for python.

I use Komodo instead. Initially, I am pleased to see something somewhat
resembling the good Pythonwin. I am used to scroll mainly with the
mousewheel. I like that I can use the mousewheel in Komodo, until I find out
that the mousewheel is also associated with "Paste", so when I scroll the
sourcecode gets sprinkled with pasted bits. ***AAAARG***! And the UNDO
doesn't seem to care.

I want to import my IE bookmarks to konqueror. I wrote an import script some
months ago, and after a few editings (see above) the bookmark files are
created; then I notice that in the meanwhile they have changed the bookmarks
to a goddamn XML-file. (Did I tell you that I hate XML, and with a reason ?
XML is worth a rant in its own right, so maybe nexttime)

I change the script to create an XML file. Konqueror doesn't like it because
it contains Windows characters (German Umlauts et al).

I ask Yast to install the gtk-bindings for Python. The gtk-samples don't
start. I ask Yast to install the Qt-Bindings for Python. I didn't find any
samples and/or docs.

RealPlayer keeps hanging up. I am a vivid real-listener, for I am addicted
to www.klubradio.de. Needless to say, there are no DFX plugins for Linux MP3
players.

Knowing ext2, I had choosen ReiserFS during install. It is impossible to
access the ReiserFS-parition from windows. Hans Reiser claims this is
because the M$ IFS kit is too expensive and M$ is a bad monopoly anyway.
Even though he most likely is right on the latter part, I once bought
"Windows NT File System Internals"
(http://www.oreilly.com/catalog/wininternals/index.html) for $49.95, and I
can read raw NTFS ondisk structures; but then again, I am no Hans Reiser.

I have a Dual P3 1Ghz, but somehow copying from large files from NTFS to my
~ brings down the whole multitasking SMP system speed to the point that the
mouse cursor freezes until the file has been copied. I attempt to enable
UDMA support, but am greeted with horrendous warnings about possible bugs in
IDE chipsets. (Windows doesn't seem to mind, though).

I try working as a normal user. (Yes, I logged on as root before). I cannot
start mozilla. "shutdown" is an unknown command. When I "su", I cannot start
X apps. I have to re-edit .bashrc to get some aliases i can remember. I
logoff and logon as root again. Logged on as root, my DSL connection keeps
hanging up - it only keeps alive if I am logged on as non-root-user. In
psychology, you call that double-bind.

I start reading the documentation for "Suse personal firewall". Being used
to AtGuard on Windows, I quickly stop doing so. I have a *really* quick look
at IPChains before I reboot to Windows.

Somehow, all that reminds me *terribly* of OS/2. And you all know what I
think of OS/2.

OT: I really miss Amiga-Style ASSIGN:s





------------------------------

Date: Mon, 02 Jul 2001 12:29:11 -0700
From: Robert <nrobert@pacbell.net>
Subject: Re: a linux rant  (was: pretentious rant about operating systems)

None of you probly know me, I subscribed to the mailing list right when the
number-base thread started, then never bothered to subscribe to the two new
lists until now hehehe.

For some reason I don't seem to run in to any of these problems with linux.
But I've been using slackware since 1996..if you have the bandwidth it's
easier in the long run just to download the iso and burn it to a cd.
Can't run X programs when you su? Well export DISPLAY=":0" if using bash.
USB support means it supports the usb chipset, and we won't go in to how
messed up via's usb chipset is..*cough*
FreeBSD has better usb support..not to mention overall is just better for
the most part.
With regards to xml, I'd rather have the standard document format as xml
over m$ word format. ;)
I guess some people are just better off with windows :)
Windows once you install win2k is bearable to some degree.  I'm using WinXP
Beta-2 going to upgrade to rc1 tonight hehe.

----- Original Message -----
From: "Gerson Kurz" <Gerson.Kurz@t-online.de>
To: "ESOLANG" <misc@esoteric.sange.fi>
Sent: Monday, July 02, 2001 12:48 PM
Subject: a linux rant (was: pretentious rant about operating systems)


>
> Chris, Metadata: you have problems! Here is what happened the weekend
before
> last:
>
> I am dissatisfied with Windows again and decide its once again try working
> my way with Linux. I buy the brand new Suse Linux 7.2 Pro at 130,- DM.
> "Free", really. I go home and boot the DVD -> the boot process stops and
> shows a blank screen. For the 130,- DM I have the right to phone a support
> line; I stay for nearly one hour on the phone with support until they give
> up: my machine is not supported, write down all hardware & send a letter.
> [Its a brandnew Dual 1GHz P3 with 512m].
>
> I try changing various BIOS settings until I find a combination that lets
me
> install Linux. I am greeted with a resolution of 800x600. (I have a
GeForce
> 2MX, plus a 21" monitor capable of 2048x1536, but I am willing to do with
> 1600x1200). I install XFree 4.1.0. When I switch to 1600x1200, the mouse
> disappears. But this is not a problem, since SAX2 has lost its capability
of
> changing the resolution anyway: I can change it, but it has no effect on
> KDE. I reinstall Linux. SAX2 works, but my Monitor is not on the monitor
> list (its an USB monitor on a OS with USB support, btw) & I have to fiddle
> with settings. I have to edit vertical & horizontal freqs; If I enter the
> specs given by my monitors vendor, the screen gets blank; I thus enter the
> specs of a different 21" monitor I use @ work, finally I see something
> somewhat resembling 1600x1200, but with a total different screen dimension
> than W2K on the same machine. I'm probably ruining my monitor as I speak.
>
> I enable font antialiasing. The font for Konsole changes to something
> unreadable and unrenderable. I quickly decide to disable font antialising
> again.
>
> I start Mozilla. It fails on my homepage. It shows a clearly faulty error
> message for out-of-memory, on a 512mB machine. I start Konqueror. It has
> trouble with my homepage. I cannot change the fonts in Konqueror, even
> though the default fonts designed for 800x600 look really really really
> really tiny on a 1600x1200 resolution.
>
> I edit some python scripts in NEdit. NEdit uses unreadble oldskool
X-Widgets
> (I never figured out if that checkbutton is now pressed or depressed).
> NEdits Ctrl+S doesn't work 50% of the time. NEdit mixes \t and spaces so
the
> source gets unreadble for python.
>
> I use Komodo instead. Initially, I am pleased to see something somewhat
> resembling the good Pythonwin. I am used to scroll mainly with the
> mousewheel. I like that I can use the mousewheel in Komodo, until I find
out
> that the mousewheel is also associated with "Paste", so when I scroll the
> sourcecode gets sprinkled with pasted bits. ***AAAARG***! And the UNDO
> doesn't seem to care.
>
> I want to import my IE bookmarks to konqueror. I wrote an import script
some
> months ago, and after a few editings (see above) the bookmark files are
> created; then I notice that in the meanwhile they have changed the
bookmarks
> to a goddamn XML-file. (Did I tell you that I hate XML, and with a reason
?
> XML is worth a rant in its own right, so maybe nexttime)
>
> I change the script to create an XML file. Konqueror doesn't like it
because
> it contains Windows characters (German Umlauts et al).
>
> I ask Yast to install the gtk-bindings for Python. The gtk-samples don't
> start. I ask Yast to install the Qt-Bindings for Python. I didn't find any
> samples and/or docs.
>
> RealPlayer keeps hanging up. I am a vivid real-listener, for I am addicted
> to www.klubradio.de. Needless to say, there are no DFX plugins for Linux
MP3
> players.
>
> Knowing ext2, I had choosen ReiserFS during install. It is impossible to
> access the ReiserFS-parition from windows. Hans Reiser claims this is
> because the M$ IFS kit is too expensive and M$ is a bad monopoly anyway.
> Even though he most likely is right on the latter part, I once bought
> "Windows NT File System Internals"
> (http://www.oreilly.com/catalog/wininternals/index.html) for $49.95, and I
> can read raw NTFS ondisk structures; but then again, I am no Hans Reiser.
>
> I have a Dual P3 1Ghz, but somehow copying from large files from NTFS to
my
> ~ brings down the whole multitasking SMP system speed to the point that
the
> mouse cursor freezes until the file has been copied. I attempt to enable
> UDMA support, but am greeted with horrendous warnings about possible bugs
in
> IDE chipsets. (Windows doesn't seem to mind, though).
>
> I try working as a normal user. (Yes, I logged on as root before). I
cannot
> start mozilla. "shutdown" is an unknown command. When I "su", I cannot
start
> X apps. I have to re-edit .bashrc to get some aliases i can remember. I
> logoff and logon as root again. Logged on as root, my DSL connection keeps
> hanging up - it only keeps alive if I am logged on as non-root-user. In
> psychology, you call that double-bind.
>
> I start reading the documentation for "Suse personal firewall". Being used
> to AtGuard on Windows, I quickly stop doing so. I have a *really* quick
look
> at IPChains before I reboot to Windows.
>
> Somehow, all that reminds me *terribly* of OS/2. And you all know what I
> think of OS/2.
>
> OT: I really miss Amiga-Style ASSIGN:s
>
>
>
>
>



------------------------------

Date: Mon, 02 Jul 2001 22:47:19 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Bloody Listar!

Ok, every time I've posted stuff to the list, it's gone back to the sender. 
Why? Listar doesn't seem to include something as simple as a Reply-To: in 
the email header when it forwards on mail. Is this just happening to me? 
Could it be Eudora that's causing the problems? Panu, if it really is 
Listar, could you please fix this?

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Mon, 02 Jul 2001 22:49:03 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Fwd: Re: pretentious rant about operating systems

He're one of those emails which *didn't* get sent to the correct address:

>Date: Mon, 02 Jul 2001 21:37:43 +0100
>To: Chris Pressey <cpressey@catseye.mb.ca>
>From: Keith Gaughan <keith@digital-crew.com>
>Subject: Re: pretentious rant about operating systems
>
>At 17:27 01/07/2001 -0500, Chris Pressey wrote:
>
>>I'll get right to the point.  WHERE'S THE METADATA?
>>
>>The answer: when it is there, it is spread across umpteen configuration
>>files that don't know about each other, OR, it is lumped willy-nilly
>>into an obscure, convoluted centralized database... but it's usually not
>>there.
>
>The Windows registry was a Bad Idea. The filing system should be the 
>registry. Or at least that's how we did it over on RISC OS. The closest we 
>ever got to a registry was that there was a directory in the !Boot 
>application which stored software settings.
>
>>The fact is that system objects (files, devices, etc) have relationships
>>with each other.  Relationships are nothing new in computer science,
>>we've been using relational databases for years.  So why hasn't the
>>rather simple concept of "Object-A somehow-relates-to Object-B" filtered
>>down to the operating system level yet?
>
>Ooh! I've been thinking about this sort of thing for ages and it's 
>recently crystallised that all these separate threads in my head were 
>connected. I envisioned some way of creating objects (not in the dumbass 
>OOP way, these would be autonomous) where the user would give them 
>semantic value by relating them to one another. Goodbye stupid 
>hierarchical filing system, hello Data Network. Currently, I'm thinking 
>that simple unidirectional and bidirectional links would be made into 
>complex ones by associating a controlling object to that link.
>
>Ok, so maybe it's still a bit messy, but I'm getting there. Anybody I've 
>suggested this idea to has thought I'm a raving lunatic, but I think it 
>has virtue.
>
>>We have dependencies in 'make' scripts,
>
>That's because C had flaws which later languages such as Java (for all 
>it's flaws) cured.
>
>>and we have 'install' and 'uninstall' scripts,
>
>We shouldn't need these. It should simply be a matter of deleting the 
>application.
>
>>and we have 'file type detection' in the form of
>>either file suffix or 'magic'...
>
>Nobody said *nixen were perfect, did they?
>
>>but these are all loose and scattered
>>functions.  In the meantime, you can rename a file and none of these
>>measures are the wiser.
>
>The file name should be independent of the semantic relations of a file. 
>In fact, why do we need filenames anyway? All they are are summaries of 
>the file's content.
>
>>There are some other little things that are just shell/filesystem
>>issues.  I'd love for a shell to be able to change to a directory just
>>by typing its name.  It should be obvious that "enter" is the verb to be
>>implied when you just name a directory.
>
>Hmmm...
>
>>I'd also love for the FS to be
>>able to treat archive files (.tar, .tgz, .zip, .bz2 etc) as directories,
>
>We could do this on RISC OS. Such things were called Image Filing Systems. 
>It rocked.
>
>>This sentence was false half an hour ago, did you notice?
>
>No, I was too busy playing XKobo :-)


K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Mon, 02 Jul 2001 22:49:37 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Fwd: Re: a linux rant  (was: pretentious rant about operating

And the other one:

>Date: Mon, 02 Jul 2001 21:16:52 +0100
>To: Gerson.Kurz@t-online.de (Gerson Kurz)
>From: Keith Gaughan <keith@digital-crew.com>
>Subject: Re: a linux rant  (was: pretentious rant about operating systems)
>
>At 20:48 02/07/2001 +0100, Gerson Kurz wrote:
>
>>Chris, Metadata: you have problems! Here is what happened the weekend before
>>last:
>>
>>I am dissatisfied with Windows again and decide its once again try working
>>my way with Linux. I buy the brand new Suse Linux 7.2 Pro at 130,- DM.
>>"Free", really. I go home and boot the DVD -> the boot process stops and
>>shows a blank screen. For the 130,- DM I have the right to phone a support
>>line; I stay for nearly one hour on the phone with support until they give
>>up: my machine is not supported, write down all hardware & send a letter.
>>[Its a brandnew Dual 1GHz P3 with 512m].
>
><snip>
>
>I've been meaning to do it for a while now, and at the weekend I took the 
>plunge: I formatted one of the partitions on my laptop and installed 
>Linux. (Well, I backed up all the data I needed from Windows, reinstalled 
>Windows 2000 on the first partition and then installed Linux on the other. 
>I'd had a bad weekend and I needed something to cheer me up.
>
>I'm burned a copy of Mandrake Linux 8 onto CD which I'd got with PC Plus 
>Magazine (I intend making a contribution to Mandrakesoft now). Set up my 
>partitions with about the best partitioning tool I've ever used and only 
>when it came to setting up X did I have problems. It forced me to use 
>800x600 in the beginning even though I said my screen was capable of 
>displaying 1024x768--I fixed that after the OS had been installed.
>
>I haven't had anywhere near the number of problems you had, Gerson. Apart 
>from the fact that Enlightenment won't display the User Menu (I prefer 
>Window Maker anyway so it doesn't matter that much), one of the themes in 
>Enlightenment is buggy (Blue Metal, AFAIR) and KDevelop didn't install 
>properly (a problem I've heard others have had), I've had no problems. I'm 
>addicted to XKobo at the moment.
>
>I'm quite happy with things. KDE's anti-aliasing mightn't be quite as good 
>as RISC OS's, but it's definitely better than the terrible attempt at it 
>in Windows.
>
>Aside:
>I have to go back to getting JServ to recognise what the WEB-INF directory 
>is for. I've far more experience with JRun and Tomcat and they work just 
>fine, but JServ seems to be too dumb. It makes no sense to me at all. Of 
>course, it could be all the crap that Oracle contaminated my copy of 
>Apache with.


K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Mon, 2 Jul 2001 15:01:43 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: Bloody Listar!


nope its not just you...

I'm using unix Pine.. and from what I can see, basically what is going on
is the To: and Cc: are switched around the wrong way.  To: should be
misc@esoteric.sange.fi and Cc: should be whoever we are repling to.  That
way if we hit Reply, it automatically defaults to the list rather than a
single person, but if you hit Reply to All you can still mail the person
(just gotta strip out the list).

Jeff



On Mon, 2 Jul 2001, Keith Gaughan wrote:

> Ok, every time I've posted stuff to the list, it's gone back to the sender.
> Why? Listar doesn't seem to include something as simple as a Reply-To: in
> the email header when it forwards on mail. Is this just happening to me?
> Could it be Eudora that's causing the problems? Panu, if it really is
> Listar, could you please fix this?
>
> K.
>
> --
> Keith Gaughan <keith@digital-crew.com>
> Software Developer, Digital Crew Ltd.
> Take off every '.sig'!!
>
>
>



------------------------------

Date: Mon, 02 Jul 2001 23:36:45 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: Bloody Listar!

Being very careful to enter the list address...

At 15:01 02/07/2001 -0700, Jeff  Johnston wrote:

>nope its not just you...
>
>I'm using unix Pine.. and from what I can see, basically what is going on
>is the To: and Cc: are switched around the wrong way.  To: should be
>misc@esoteric.sange.fi and Cc: should be whoever we are repling to.  That
>way if we hit Reply, it automatically defaults to the list rather than a
>single person, but if you hit Reply to All you can still mail the person
>(just gotta strip out the list).

That doesn't quite make sense to me. Here's the header of the email you 
sent to the list as Eudora gives it:

Delivered-To: di2834984@mail-03
X-Sent-via: StarNet http://www.azstarnet.com/
Date: Mon, 2 Jul 2001 15:01:43 -0700 (MST)
From: Jeff Johnston <jeffryj@azstarnet.com>
X-X-Sender: <jeffryj@andromeda>
To: <misc@esoteric.sange.fi>
Subject: Re: Bloody Listar!
Sender: misc-bounce@esoteric.sange.fi
X-original-sender: jeffryj@azstarnet.com

Which is all fine, but why would it take the respondee's address from To:? 
It makes more sense to me to take it from Reply-To: or From:. Here's a 
header (with that person's details and the list's address--it's invitation 
only--blanked out) from another list I'm on:

Delivered-To: di2834984@mail-03
X-Authentication-Warning: newsvendor.com: ewsvend set sender to 
owner-open@***.ie using -f
From: "***" <***@rte.ie>
To: <open@***.ie>
Subject: Open: Micropayments and the New/Old Economy
Date: Thu, 28 Jun 2001 15:28:36 +0100
X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2910.0)
Importance: Normal
Sender: owner-open@***.ie
Reply-To: open@***.ie

This all makes sense to me and I've had no problems with any other lists. 
Here's the header of a post Steve sent to the Cats Eye list in it's dying days:

Delivered-To: di2834984@mail-02
Mailing-List: contact list-help@catseye.mb.ca; run by ezmlm
Reply-To: list@catseye.mb.ca
Delivered-To: mailing list list@catseye.mb.ca
From: Steve Mosher <goat@isn.net>
To: list@catseye.mb.ca
Subject: [Tara MacLean] Poor Boy
Date: Tue, 22 May 2001 10:41:32 -0300
X-Mailer: KMail [version 1.0.28]
Sender: misc-bounce@esoteric.sange.fi
X-original-sender: goat@isn.net

All fine, makes perfect sense. My question is: why does Listar leave out 
the Reply-To: address in the header. When it receives a mail, it should 
take the address in the To: field and insert a Reply-To: field with this 
address in it. I can't see why it's working for everybody else and not 
me--is there something I'm missing?

>On Mon, 2 Jul 2001, Keith Gaughan wrote:
>
> > Ok, every time I've posted stuff to the list, it's gone back to the sender.
> > Why? Listar doesn't seem to include something as simple as a Reply-To: in
> > the email header when it forwards on mail. Is this just happening to me?
> > Could it be Eudora that's causing the problems? Panu, if it really is
> > Listar, could you please fix this?


K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Mon, 02 Jul 2001 23:44:55 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Fwd: Re: Bloody Listar!

Would you believe, I just did it again! Fucking L*st*r!

>Date: Mon, 02 Jul 2001 23:43:01 +0100
>To: Keith Gaughan <keith@digital-crew.com>
>From: Keith Gaughan <keith@digital-crew.com>
>Subject: Re: Bloody Listar!
>
>At 23:36 02/07/2001 +0100, Keith Gaughan wrote:
>
>>At 15:01 02/07/2001 -0700, Jeff  Johnston wrote:
>>
>>>nope its not just you...
>>
>>That doesn't quite make sense to me.
>
>To be a bit more precise, I meant to say that Listar's behaviour makes no 
>sense to me. When I read this after I sent it, it seemed as if I was 
>contradicting you. Sorry about that. Still, I can see a light irony in the 
>whole thing... :)


K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Tue, 3 Jul 2001 01:21:34 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: Re: pretentious rant about operating systems




On Mon, 2 Jul 2001, Brian Connors wrote:

> 
> --- "markus.kliegl" <markus.kliegl@t-online.de> wrote:
> > 
> > 
> > On Sun, 1 Jul 2001, Chris Pressey wrote:
> > 
> > > 
> > > There are some other little things that are just
> > shell/filesystem
> > > issues.  I'd love for a shell to be able to change
> > to a directory just
> > > by typing its name.  It should be obvious that
> > "enter" is the verb to be
> > > implied when you just name a directory.
> > 
> > I'm quite sure that would be simple enough to
> > change... most shells these
> > days hash executables in the PATH, so it should be
> > easy enough to detect
> > if there's an executable of the same name as the
> > directory and then ask
> > the user.
> 
> Yeah... it's definitely a shell issue, nothing more.
> You still have to execute a "cd" somewhere.

Changing to a different directory is simply a matter of setting PWD to a
new value (and cd sets OLDPWD as well). I think I don't quite understand
you... the way I see it, changing to a different directory requires
changing to a different directory :-)

In bash, due to auto-completion features, one can type
<beginning-of-dir-name>, press TAB and it will automatically expand it to
<dir-name>/ so maybe if a single word that ends in '/' is read on a line,
bash could assume that we want to change directories... that would resolve
ambiguaties about whether to execute a command or change to a different
directory as well. Or maybe <dir-name-on-beginning-of-line><TAB> could be
expanded into "cd <dir-name>".

If someone really feels like changing a shell, I've included a simple
patch for bash (for the execute_command.c file) that most likely won't
work (in particular I have no idea what the flags are supposed to be), but
might be a step in the right direction (or in the wrong place altogether).

>  
> > Interesting, though... having to type 'cd' to change
> > directories never
> > bothered me. 'some_dir' just doesn't seem right to
> > me for changing to
> > directory some_dir. Why not have <directory>ENTER
> > mean 'ls <directory>'
> > instead? Or something else if you get what I mean
> > :-)
> > 
> > > I'd also love for the FS to be
> > > able to treat archive files (.tar, .tgz, .zip,
> > .bz2 etc) as directories,
> > > so you could "enter" them and copy files in and
> > out with the usual
> > > commands (not to mention having programs like
> > "find" able to search
> > > within archives automatically :)
> > 
> > There was an interesting article on freshmeat a
> > while ago...
> > http://freshmeat.net/articles/view/237/
> 
> I think it's been done here and there anyway -- I
> believe gmc (the file manager from GNOME) does this
> fairly transparently. Konqueror doesn't, which is
> mildly annoying. 
> 
> 
> =====
> --
> 
> __________________________________________________
> Do You Yahoo!?
> Get personalized email addresses from Yahoo! Mail
> http://personal.mail.yahoo.com/
> 


-- Attached file included as plaintext by Listar --
-- File: exec-patch

3393c3393
< 
---
>   
3404c3404,3416
< 	internal_error ("%s: is a directory", command);
---
>         {
>           Function *cd_builtin;
>           WORD_LIST *args;
> 
>           args = xmalloc (sizeof (WORD_LIST));
>           args->next = xmalloc (sizeof (WORD_LIST));
>           args->word->word = xmalloc (3);
>           args->next->word->word = xmalloc (strlen(command) + 1);
>           strcpy (args->word->word, "cd");
>           strcpy (args->next->word->word, command);
>           cd_builtin = find_shell_builtin ("cd");
>           execute_builtin (cd_builtin, args, 0, 0);
>         }


------------------------------

Date: Mon, 2 Jul 2001 17:08:41 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: Bloody Listar!



Well something IS different, because before I could just hit reply, but
now I have to Reply, to all recipients, then modify it so it sends to the
list and not just the person

On Mon, 2 Jul 2001, Keith Gaughan wrote:

> Being very careful to enter the list address...
>
> At 15:01 02/07/2001 -0700, Jeff  Johnston wrote:
>
> >nope its not just you...
> >
> >I'm using unix Pine.. and from what I can see, basically what is going on
> >is the To: and Cc: are switched around the wrong way.  To: should be
> >misc@esoteric.sange.fi and Cc: should be whoever we are repling to.  That
> >way if we hit Reply, it automatically defaults to the list rather than a
> >single person, but if you hit Reply to All you can still mail the person
> >(just gotta strip out the list).
>
> That doesn't quite make sense to me. Here's the header of the email you
> sent to the list as Eudora gives it:
>
> Delivered-To: di2834984@mail-03
> X-Sent-via: StarNet http://www.azstarnet.com/
> Date: Mon, 2 Jul 2001 15:01:43 -0700 (MST)
> From: Jeff Johnston <jeffryj@azstarnet.com>
> X-X-Sender: <jeffryj@andromeda>
> To: <misc@esoteric.sange.fi>
> Subject: Re: Bloody Listar!
> X-original-sender: jeffryj@azstarnet.com
>
> Which is all fine, but why would it take the respondee's address from To:?
> It makes more sense to me to take it from Reply-To: or From:. Here's a
> header (with that person's details and the list's address--it's invitation
> only--blanked out) from another list I'm on:
>
> Delivered-To: di2834984@mail-03
> X-Authentication-Warning: newsvendor.com: ewsvend set sender to
> owner-open@***.ie using -f
> From: "***" <***@rte.ie>
> To: <open@***.ie>
> Subject: Open: Micropayments and the New/Old Economy
> Date: Thu, 28 Jun 2001 15:28:36 +0100
> X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2910.0)
> Importance: Normal
> Reply-To: open@***.ie
>
> This all makes sense to me and I've had no problems with any other lists.
> Here's the header of a post Steve sent to the Cats Eye list in it's dying days:
>
> Delivered-To: di2834984@mail-02
> Mailing-List: contact list-help@catseye.mb.ca; run by ezmlm
> Reply-To: list@catseye.mb.ca
> Delivered-To: mailing list list@catseye.mb.ca
> From: Steve Mosher <goat@isn.net>
> To: list@catseye.mb.ca
> Subject: [Tara MacLean] Poor Boy
> Date: Tue, 22 May 2001 10:41:32 -0300
> X-Mailer: KMail [version 1.0.28]
> X-original-sender: goat@isn.net
>
> All fine, makes perfect sense. My question is: why does Listar leave out
> the Reply-To: address in the header. When it receives a mail, it should
> take the address in the To: field and insert a Reply-To: field with this
> address in it. I can't see why it's working for everybody else and not
> me--is there something I'm missing?
>
> >On Mon, 2 Jul 2001, Keith Gaughan wrote:
> >
> > > Ok, every time I've posted stuff to the list, it's gone back to the sender.
> > > Why? Listar doesn't seem to include something as simple as a Reply-To: in
> > > the email header when it forwards on mail. Is this just happening to me?
> > > Could it be Eudora that's causing the problems? Panu, if it really is
> > > Listar, could you please fix this?
>
>
> K.
>
> --
> Keith Gaughan <keith@digital-crew.com>
> Software Developer, Digital Crew Ltd.
> Take off every '.sig'!!
>
>
>



------------------------------

Date: Tue, 03 Jul 2001 09:37:03 +0200
From: =?iso-8859-1?Q?Fr=E9d=E9ric?= van der Plancke <fvdp@decis.be>
Subject: Re: Bloody Listar!

I have a similar but different problem...

Netscape's "Reply-To" button yields "misc-bounce@esoteric.sange.fi" as
reply address to my new message. If I don't delete the "-bounce" the 
message never reaches the misc list.

Here are the headers I receive (some of them obviously added by our
MDaemon internal router; others added by lovely Netscape). Given these
headers the "misc-bounce" thing is no surprise.

|Return-path: <misc-bounce@esoteric.sange.fi>
|Received: [snipped]
|Message-Id: <5.0.2.1.0.20010702234412.00a8fdf0@mail.9netave.com>
|X-Sender: di2834984@mail.9netave.com
|X-Mailer: QUALCOMM Windows Eudora Version 5.0.2
|Date: Mon, 02 Jul 2001 23:44:55 +0100
|To: misc@esoteric.sange.fi
|From: Keith Gaughan <keith@digital-crew.com>
|Subject: Fwd: Re: Bloody Listar!
|Mime-Version: 1.0
|Content-Type: text/plain; charset="us-ascii"; format=flowed
|X-listar-version: Listar v0.129a
|Sender: misc-bounce@esoteric.sange.fi
|Errors-to: misc-bounce@esoteric.sange.fi
|X-original-sender: keith@digital-crew.com
|Precedence: bulk
|X-list: misc
|X-MDRcpt-To: fvdp@decis.be
|X-MDRemoteIP: 195.170.158.190
|X-Return-Path: misc-bounce@esoteric.sange.fi
|X-MDaemon-Deliver-To: FPlancke@decis.be
|Reply-To: misc-bounce@esoteric.sange.fi
|X-Mozilla-Status: 8001
|X-Mozilla-Status2: 00000000
|X-UIDL: MD50000005915:MSG:3431:133710979

Frédéric vdP

Keith Gaughan wrote:
> 
> Ok, every time I've posted stuff to the list, it's gone back to the sender.
> Why? Listar doesn't seem to include something as simple as a Reply-To: in
> the email header when it forwards on mail. Is this just happening to me?
> Could it be Eudora that's causing the problems? Panu, if it really is
> Listar, could you please fix this?
> 
> K.
> 
> --
> Keith Gaughan <keith@digital-crew.com>
> Software Developer, Digital Crew Ltd.
> Take off every '.sig'!!



------------------------------

Date: Tue, 3 Jul 2001 16:55:49 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: Re: pretentious rant about operating systems


[replying to myself...]

On Tue, 3 Jul 2001, markus.kliegl wrote:

> 
> 
> On Mon, 2 Jul 2001, Brian Connors wrote:
> 
> If someone really feels like changing a shell, I've included a simple
> patch for bash (for the execute_command.c file) that most likely won't
> work (in particular I have no idea what the flags are supposed to be), but
> might be a step in the right direction (or in the wrong place altogether).
> 

Sorry about that code... looking at it again, it's incredibly ugly (I
forgot to free the allocated memory, causing memory leaks and forgot to
set args->next->next to NULL). By the way, does anyone know what 'xmalloc'
is? It was used all over the code, so I suppose it's simply some sort of
wrapper of malloc.

Markus



------------------------------

Date: Tue, 3 Jul 2001 18:32:40 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: Fwd: Announce: ICFP programming contest


I hope you all participate with Brainfuck, Intercal and the lot :-)
Unfortunately I'm gone at the time :-(

Hope you have fun,
Markus


From: Damien Doligez <damien.doligez@inria.fr>
Newsgroups: comp.programming,comp.lang.apl,comp.lang.c,comp.lang.c++,comp.lang.dylan,comp.lang.eiffel,comp.lang.forth,comp.lang.functional,comp.lang.icon,comp.lang.lisp,comp.lang.misc,comp.lang.modula2,comp.lang.modula3,comp.lang.oberon,comp.lang.objective-c,comp.lang.perl.misc,comp.lang.prolog,comp.lang.python,comp.lang.sather,comp.lang.scheme,comp.lang.smalltalk,comp.lang.tcl
Subject: Announce: ICFP programming contest
Date: 3 Jul 2001 15:37:49 GMT

We are pleased to announce:

                         The Fourth Annual

                     ICFP PROGRAMMING CONTEST

                         July 26-29, 2001

             http://cristal.inria.fr/ICFP2001/prog-contest/

Convinced your favorite programming language provides unbeatable
productivity?  Convinced you and your friends are world-class programmers?

If so, we're providing you the opportunity to prove it! We are pleased
to announce the Fourth Annual ICFP Programming Contest to be held in
conjunction with the 2001 International Conference on Functional
Programming (ICFP 2001). All programmers are invited to enter the
contest, either individually or in teams; we especially encourage
students to enter.  You may use any programming language (or
combination of languages) to show your skill.

On Thursday, July 26, 2001 at 15:00 UTC, we will publish a challenge
task on the Web site and by e-mail to registered participants.  Teams
will have until Sunday, 29 July 2001, 15:00 UTC (72 hours) to
implement a program to perform this task and submit it to the contest
judges.  We've designed the contest for direct, head-to-head
comparison of language technology and programming skill.  We have a
range of prizes for the winners: cash awards, special student prizes,
and, of course, unlimited bragging rights.

For more information about the contest, prizes, and registration,
point your browser to:

   http://cristal.inria.fr/ICFP2001/prog-contest/

For more information about ICFP 2001, see:

   http://cristal.inria.fr/ICFP2001/


-- 
Damien Doligez, Luc Maranget, Pierre Weis

-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr



------------------------------

From: "Chris Pressey" <cpressey@catseye.mb.ca>
Subject: various
Date: Tue, 3 Jul 2001 16:23:49 -0500

Re Listar... Panu has said a couple of times that misc can't add a Reply-To
header for some reason (because traffic from lang is mirrored onto misc, or
something.)

So just hit 'Reply to All' instead of 'Reply to Sender' (which actually
makes a certain amount of sense.)

You can doctor the To: and Cc: fields so that you don't send off useless
duplicates to the poster, or, if you don't, I'm sure the poster won't mind
(this is the situation on the Erlang list, last I checked.)

But... the strange thing is... me, being the poster of one of those e-mails,
should have received the single-replies that some people sent.... but, I
didn't.  And I have no idea what "misc-bounce" is all about.  So I don't
have the whole story, here...

Re mailing lists and e-mail in general... maybe we should be bitching about
the general awkwardness and unreliability e-mail instead of operating
systems. :)

Re metadata... I tend to believe in "the filesystem IS the database" -
making things like a seperate "registry" are just patching on contingency
measures instead of fixing the problem.  (The problem is even worse in the
Unix world where there are n "third-party" registries; who cares if they're
open source iffen they're not sponsored by the operating system?  Metadata
is too integral a component for everyone to be using a slightly different
way of storing it...)

Re filenames... "just" a summary of the contents of a file?  Well, no,
there's got to be more to it than that.  It's hard to find a book when you
don't know it's title... how does an app find it's configuration file, if
files don't have names?  Look through every nearby file until it finds one
that fits the bill?  The name serves as a "global relationship"... even if
it were replaced by a relationship, it'd still have to be name-like...
like... a named relationship.  Or something :)  It does make a certain
amount of sense for a name to only be a 'link', so that a file could be
referred to by more than one name (but hopefully, y'know, something a little
more elegant than Unix' symbolic links...)

Re Linux & FreeBSD.  Unix will certainly not threaten the 'user' market of
Mac and Windows until it's packaged in such a way that little 'hacky' tricks
like Robert mentioned don't have to be used to use X windows.  Really, I've
encountered enough of those little *non*intuitive things already ("Whattya
mean, I forgot to chown the .xsession file?"  "Whattya mean, *CTRL* plus alt
plus function key to swap screens?"  etc)

I also used to think browser software for Windows was buggy - now I've found
web sites that not only silently crash my browser (NS4.76), I've actually
found ones that crash X windows completely, with nary a chance to save my
work.  This, ladies and gentlemen, is why there is an option in Netscape to
disable Java... because, heh, it doesn't work.  Imagine that!  :)

I've said it before, I'll say it again: web pages are *documents*, and
documents should *not* crash.  The idea of embedding "scripting" languages
and such in documents is just... shall we say conceptually flawed, perhaps
even doomed but no one has noticed yet :)

If there's something that pisses me off about FreeBSD it's availability of
commercial products for it.  When a company (such as, oh, I dunno,
RealNetworks,) develops a product, why they want the greatest market share
of course, they have to maximize the number of small green pieces of paper
they acquire of course, so of course they're going to target Windows.  Then
maybe Mac, you know.  And sure, why not Solaris... but what about people
running "free" operating systems?  Why, that'd be the "community" project...
which, of course, has done it's best to make it available for Linux... and
presumably FreeBSD can't be far behind... but what pisses me off is that in
the meantime between releases, Real is kind enough to make old versions of
their software unobtainable.  Practical upshot of all this is that I can't
listen to half the sound files on the net... unless I want to be bothered
into hacking a bunch of Netscape-related code.  Or running Linux Netscape
under the Linux-emulation-layer (which I haven't had the best of luck with
so far.)

Also, I'm really not sure why downloading the "community" version of
RealPlayer should elicit Real to be even nosier with their download form,
but they are.  I mean, if it's a community version, I ought to be able to
get it from somewhere besides Real, right?  Well - I haven't seen it
anywhere else, so far...

Ok, ok.  Enough bitching for now :)

Chris





------------------------------

Date: Tue, 03 Jul 2001 14:58:51 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: various

Chris Pressey wrote:
> I've said it before, I'll say it again: web pages are *documents*, and
> documents should *not* crash.  The idea of embedding "scripting" languages
> and such in documents is just... shall we say conceptually flawed, perhaps
> even doomed but no one has noticed yet :)

It may be conceptually flawed, but in the same way as the idea that 
"normal" people should be expected to use computers, it's an idea 
that's here to stay. You could have fought this in 1993, but not 
in 2001. 

Some web pages are documents. Some are active, dynamic environments. 
I will meet you halfway on this and say that there should be a 
clearer distinction between the two -- different protocols or 
something (dhttp: for dynamic), but it's just pissing into the tide
[sic] to try and complain about this now.

> ...but what pisses me off is that in
> the meantime between releases, Real is kind enough to make old versions of
> their software unobtainable.  

I would really love to see more companies releasing copyright and 
distributing source to their old software... ahhh, it's too hot to 
start this rant. 

-RB


------------------------------

Date: Wed, 04 Jul 2001 00:13:25 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: various (fortified with Keith yacking on about RISC OS)

"Taking Chris's advice on 'Reply to All', Keith decided to do just that..."

At 16:23 03/07/2001 -0500, Chris Pressey wrote:

>Re Listar... Panu has said a couple of times that misc can't add a Reply-To
>header for some reason (because traffic from lang is mirrored onto misc, or
>something.)

Hmmm... (my favourite noise at the moment) I'm compelled to hack listar's 
source to see if I could fix this little anomaly. Probably not though, but 
it'd still be fun to try.

Then again, I hardly have time to work on my Eloi language, never mind hack 
a listserver.

>So just hit 'Reply to All' instead of 'Reply to Sender' (which actually
>makes a certain amount of sense.)

But it'd make even more sense if both the sender's address and the list's 
address didn't both appear :(

>Re mailing lists and e-mail in general... maybe we should be bitching about
>the general awkwardness and unreliability e-mail instead of operating
>systems. :)

I wonder--I've never found email unreliable, you must just be unlucky Chris.

>Re metadata... I tend to believe in "the filesystem IS the database" -
>making things like a seperate "registry" are just patching on contingency
>measures instead of fixing the problem.

I've always found the idea of a system registry outside of the filing 
system a bit silly, though all my godless Windows-loving friends can't see 
how things'd work without one. On RISC OS (an OS I get slagged off for 
still loving to use and program for), you could throw an application 
anywhere you wanted -- it was all up to you. This was because the structure 
of applications on RISC OS was well thought out. Example:

I wrote a small utility many moons ago called 'Pollster', which allowed me 
to calculate certain magic numbers which help keep my software polling the 
OS efficiently. It's structure was a good example of how a RISC OS 
application was structured. Here's a tree:

!Pollster        <-- The application directory. Notice the exclamation mark.
   |
   |-- !Boot      <-- A script file executed the first time the application 
is 'seen' by
   |                  the OS. Sets up various bits and pieces.
   |-- !Help      <-- A file run if help is requested for this application. 
Usually text.
   |
   |-- !Run       <-- A script file executed when the application is 
executed. It is the
   |                  application's bootstrapping program.
   |-- !RunImage  <-- The primary application binary image, that it to say, 
the real thing.
   |
   |-- !Sprites   <-- The application's icons. This file is usually loaded 
into memory by
   |                  the !Boot file, or the OS if the !Boot file wasn't 
present.
   |-- Resources  <-- Directory holding the application's resources such as 
extra
   |                  icons/images, window templates, files containing 
version's of the
   |                  app's messages in various languages, modules (think 
Unix DSOs) etc...
   :
   .
   .

A typical !Boot file would be something like:

|
| > !Boot file for FooBar v0.01 (01-Apr-1999)
|
Set FooBar$Dir <Obey$Dir>
Iconsprites <FooBar$Dir>.!Sprites
If "<Alias$RunType_666>" = "" Then Set Alias$RunType_666 <FooBar$Dir>.!Run %%0
If "<File$Type_666>" = "" Then Set File$Type_666 EvilWord

And a typical !Run file would be something like:

|
| > !Boot file for FooBar v0.01 (01-Apr-1999)
|
Set FooBar$Dir <Obey$Dir>
Iconsprites <FooBar$Dir>.!Sprites
Set Alias$RunType_666 <FooBar$Dir>.!Run %%0
Set File$Type_666 EvilWord
WimpSlot -min 640k -max 640k
Run <FooBar$Dir>.!RunImage %*0

It looks like gobbledegook, I know, but this is all quite useful stuff.
The 'Set' command sets system variables. If you want to read the value of 
system variables, you enclose them in angle brackets. There's no real 
registry anywhere saying which application is run when file xyz is run, 
instead the closest is that applications register themselves by setting 
system variables (there's a set of system variable 'shapes' which serve 
different purposes) if the place isn't gone. That's what the third line of 
code in each of the files is about. In this example, the !Boot file checks 
to see if another program has registered itself to handle files with the 
numerical file type 666. If  there is none, it sets itself up to handle 
them, and on the next line, gives that file type a human-readable name. The 
!Run file does much the same thing in this case, but forces itself to be 
registered as that filetype's handler. After that, it's just the program 
itself being run.

There's a lot more to it. It's all pretty cool, I think. It's a pity RISC 
OS never shook off the image it got in its early days.



>Re filenames... "just" a summary of the contents of a file?  Well, no,
>there's got to be more to it than that.  It's hard to find a book when you
>don't know it's title...

That's because there's no such thing as semantic links in the real world 
beyond names and associations we keep in our heads. If these links and 
associations were part of the real word and we could manipulate them, then 
we'd have no need for names. That's what I mean.

>how does an app find it's configuration file, if
>files don't have names?

Easily enough, as long as you've not constrained yourself to 'modern day' 
filing systems and place semantic associations between the files, which 
don't require a name, their existence is enough.

>Look through every nearby file until it finds one
>that fits the bill?

Ack! That's so 1970's! My application object just takes a look at the 
objects associated with it and queries the object managing it's 
configuration details... No, no, wait... it's semantic relations to other 
objects *are* it's configuration. Nice slight of hand, eh!

>The name serves as a "global relationship"... even if
>it were replaced by a relationship, it'd still have to be name-like...
>like... a named relationship.  Or something :)

Possibly, but not necessarily. You could give a relationship a name, or an 
object a name, just it's still little more than a mnemonic for your own 
convenience. You could easily get by without it.

>I've said it before, I'll say it again: web pages are *documents*, and
>documents should *not* crash.  The idea of embedding "scripting" languages
>and such in documents is just... shall we say conceptually flawed, perhaps
>even doomed but no one has noticed yet :)

I'm sort of with Russell on this one.

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Tue, 03 Jul 2001 19:15:04 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: various

Russell Bornschlegel wrote:
> Chris Pressey wrote:
> > I've said it before, I'll say it again: web pages are *documents*, and
> > documents should *not* crash.  The idea of embedding "scripting" languages
> > and such in documents is just... shall we say conceptually flawed, perhaps
> > even doomed but no one has noticed yet :)
> It may be conceptually flawed, but in the same way as the idea that
> "normal" people should be expected to use computers, it's an idea
> that's here to stay. You could have fought this in 1993, but not
> in 2001.

I doubt that I could have fought it in '93, actually.  HTML just kin'a
took over in that path-of-least-resistance way; it was never intended to
be a layout format, much less a carrier for code...

Java is a good idea, in that it runs in a 'sandbox'; Javascript is much
less of a good idea.  When you think about it, Javascript is probably
the "crashingest" language on the planet.  Supporting n different
scripting languages is even a WORSE idea...

So the problem here is really complexity.  The Powers that Be got
together and said, "We shall make this Far More Complex Than it Really
Needs to Be," as they so often do.  And the result is that there's
seemingly no browser on earth that's sufficiently "compliant" enough to
not crash/fail-to-display-effectively on at least one of a hundred web
sites selected at random...

> Some web pages are documents. Some are active, dynamic environments.
> I will meet you halfway on this and say that there should be a
> clearer distinction between the two -- different protocols or
> something (dhttp: for dynamic), but it's just pissing into the tide
> [sic] to try and complain about this now.

Well, I'm certainly not expecting anything to *change* because of it,
I'm just venting... :)

I dunno, y'know, web "page" is almost a total misnomer these days.  I'm
guessing it would be easier to go the other way around; surrender http
as the dynamic protocol, and resort to PDF/DVI/PS/something/other for
static documents.

And I should clarify that dynamic environments ideally shouldn't crash
either of course!  But it's easier to forgive a programmer for messing
that up, than it is to forgive them for messing up something that should
be *simple*.  Think of how many pages you've seen with Java[script] that
is merely gratuitous, hardly counting as  'dynamic environment'.

> > ...but what pisses me off is that in
> > the meantime between releases, Real is kind enough to make old versions of
> > their software unobtainable.
> I would really love to see more companies releasing copyright and
> distributing source to their old software... ahhh, it's too hot to
> start this rant.

The problem here is the lawyers, of course.  The companies would
actually *profit* from doing this kin'a stuff.  (If not monetarily, then
in customer confidence.)  But, they can't see the forest because their
lawyers keep shouting "TREES! TREES!" at them.  :)  It's silly to think
that there's "still profit to be had" from obsolete software; if there
was, then the software wouldn't be *obsolete*, now would it?!?  :)  To
me that's a strong argument that "damages" based on the "piracy" of
obsolete-but-still-copyrighted software would be very, very difficult to
obtain in any court of law where the judge has his or her eyes open...

But, that could just be my imagination :)

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Tue, 03 Jul 2001 19:44:53 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: various (fortified with Keith yacking on about RISC OS)

Keith Gaughan wrote:
> >So just hit 'Reply to All' instead of 'Reply to Sender' (which actually
> >makes a certain amount of sense.)
> But it'd make even more sense if both the sender's address and the list's
> address didn't both appear :(

Well... yes... but you can't have everything :)

> >Re mailing lists and e-mail in general... maybe we should be bitching about
> >the general awkwardness and unreliability e-mail instead of operating
> >systems. :)
> I wonder--I've never found email unreliable, you must just be unlucky Chris.

Or maybe you've just never noticed? :)

Granted it seems mostly reliable.  but I worry a lot when people reply
to messages on a mailing list that *I've never seen*.  This has happened
both with my ol' list and this list; e.g. I don't seem to have ever
received Brian's "If someone really feels like changing a shell,"
message (although maybe that's because he only sent it to markus, I
dunno.)

Further to that - if someone *is* gonna hack Listar, could you *please*
also make it so that it adjusts the timestamp on each message to match
the *list's* local time, i.e. pretend it was sent at the time the list
manager receieved it?  I'm kind of sick of receiving replies before
their original posts, simply because someone's local internal clock is
messed up.

> >Re metadata... I tend to believe in "the filesystem IS the database" -
> >making things like a seperate "registry" are just patching on contingency
> >measures instead of fixing the problem.
> 
> I've always found the idea of a system registry outside of the filing
> system a bit silly, though all my godless Windows-loving friends can't see
> how things'd work without one.

Well, these are probably the same people who can't see how you'd live
without filename extensions...

> On RISC OS (an OS I get slagged off for
> still loving to use and program for), you could throw an application
> anywhere you wanted -- it was all up to you. This was because the structure
> of applications on RISC OS was well thought out. [...]
> It's all pretty cool, I think. It's a pity RISC
> OS never shook off the image it got in its early days.

I dunno... for me, it's a problem with the name... RISC has nothing to
do with OS.  Unless it's a "reduced-instruction-set" OS, I suppose...? 
Hell, "RISC" has little or nothing to do with seperate load and store
instructions, so... in for a penny, in for a pound :)

> >Re filenames... "just" a summary of the contents of a file?  Well, no,
> >there's got to be more to it than that.  It's hard to find a book when you
> >don't know it's title...
> That's because there's no such thing as semantic links in the real world
> beyond names and associations we keep in our heads. If these links and
> associations were part of the real word and we could manipulate them, then
> we'd have no need for names. That's what I mean.

Well, yeah... names act as a proxy for chemistry.  Sorta.

> >how does an app find it's configuration file, if
> >files don't have names?
> Easily enough, as long as you've not constrained yourself to 'modern day'
> filing systems and place semantic associations between the files, which
> don't require a name, their existence is enough.

Hm, yes - but then, you can only find the files by going through the
application.  Which may not be a bad thing, it just runs
counter-intuitive to probably most OS-user's sense of "what should be"
(which has simply been fostered by "what currently is")...

> >Look through every nearby file until it finds one
> >that fits the bill?
> 
> Ack! That's so 1970's! My application object just takes a look at the
> objects associated with it and queries the object managing it's
> configuration details... No, no, wait... it's semantic relations to other
> objects *are* it's configuration. Nice slight of hand, eh!

But if you take it too far, then all of your objects are empty and ALL
the useful information exists only in the relationships between them! 
Which is fascinating, but maybe not totally efficient :)

> >The name serves as a "global relationship"... even if
> >it were replaced by a relationship, it'd still have to be name-like...
> >like... a named relationship.  Or something :)
> Possibly, but not necessarily. You could give a relationship a name, or an
> object a name, just it's still little more than a mnemonic for your own
> convenience. You could easily get by without it.

Sometimes those mnemonics for your own convenience are pretty damned
convenient, though; like, if I make four different versions of the same
image, I want to differentiate them, probably with names like "foo1"
"foo2" "foo3" etc.

I suppose one could use "next" and "prev" relationships, like a linked
list, but that strikes me as at least a little awkward.  At the very
least, you still practically need an "annotation" field on a file if
nothing else.

I guess what I'm getting to is that, names or no, you still have a
single 'hub' object to which everything has a (direct or indirect) link
to.  Unix has /, Mac has the desktop, Windows has... well it's hard to
tell, given that the desktop resides in \WINDOWS\Desktop, it's circular
:)  btw, if I can't save a document in "My Computer" directly, howcum it
shows up in file dialogs :)

> >I've said it before, I'll say it again: web pages are *documents*, and
> >documents should *not* crash.  The idea of embedding "scripting" languages
> >and such in documents is just... shall we say conceptually flawed, perhaps
> >even doomed but no one has noticed yet :)
> 
> I'm sort of with Russell on this one.

I should say that I am, too.  I can't change it and I wouldn't even want
it to change, really, but I would like to see some way, some measure of
ensuring that a page most likely won't crash.  I mean, some way besides
self-restraint, which not enough webweavers seem to have very much of :)

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Tue, 03 Jul 2001 17:57:31 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: various

Chris Pressey wrote:
> To me that's a strong argument that "damages" based on the "piracy" of
> obsolete-but-still-copyrighted software would be very, very difficult to
> obtain in any court of law where the judge has his or her eyes open...

Legal fees at some point will vastly eclipse damages, and work just 
as well as a deterrent. Personally, I believe piracy of obsolete-but-
still-copyrighted software is ethically Wrong; it's not up to the 
pirate to decide when the software deserves to be free, it's up to 
the owner of the IP. I may wish they would release their IP sooner
rather than later, but my wishes are not a valid claim on their IP.
I mean, I wish Bill Gates would give me a million dollars -- he 
wouldn't miss it -- but I don't expect him to.

-R


------------------------------

Date: Tue, 03 Jul 2001 18:06:16 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: various (fortified with Keith yacking on about RISC OS)

Chris Pressey wrote:
> >
> > Ack! That's so 1970's! My application object just takes a look at the
> > objects associated with it and queries the object managing it's
> > configuration details... No, no, wait... it's semantic relations to other
> > objects *are* it's configuration. Nice slight of hand, eh!
> 
> But if you take it too far, then all of your objects are empty and ALL
> the useful information exists only in the relationships between them!
> Which is fascinating, but maybe not totally efficient :)

I'll once again launch the "filesystem node = raw binary block + 
key/value pair property data" meme, and see if anyone salutes.

> > >I've said it before, I'll say it again: web pages are *documents*, and
> > >documents should *not* crash.  The idea of embedding "scripting" languages
> > >and such in documents is just... shall we say conceptually flawed, perhaps
> > >even doomed but no one has noticed yet :)
> >
> > I'm sort of with Russell on this one.
> 
> I should say that I am, too.  I can't change it and I wouldn't even want
> it to change, really, but I would like to see some way, some measure of
> ensuring that a page most likely won't crash.  I mean, some way besides
> self-restraint, which not enough webweavers seem to have very much of :)

How about a restricted or private TLD called .static or something? Any 
use of any Javascript, other embedded scripting language, or other
escape
route in an .html file in a .static domain would be grounds for the 
managers of the TLD to kill that domain. :) 

-RB


------------------------------

Date: Tue, 03 Jul 2001 20:49:46 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: intellectual property (was Re: various)

Russell Bornschlegel wrote:
> Chris Pressey wrote:
> > To me that's a strong argument that "damages" based on the "piracy" of
> > obsolete-but-still-copyrighted software would be very, very difficult to
> > obtain in any court of law where the judge has his or her eyes open...
> Legal fees at some point will vastly eclipse damages, and work just
> as well as a deterrent. Personally, I believe piracy of obsolete-but-
> still-copyrighted software is ethically Wrong;

I'd rather leave ethics out of it; arguably, merely using a computer
would be "ethically wrong" to a luddite, right? :)

> it's not up to the
> pirate to decide when the software deserves to be free, it's up to
> the owner of the IP.

Well, speaking legally, that's the case (subject to what, exactly, you
or anyone means by "free"... :)  Internet Explorer is "free" in the
sense that you can (in theory) obtain the binaries for no charge; but it
is far from free in the sense of unrestrictedness of development.  Otoh,
FSF seems the other way around; vehemently against anyone (except,
perhaps, themselves) making a buck off their software, even if it is
unrestricted in terms of development.  I mean, pleeeez.  "Why you should
not use the LGPL."  FMH grumble grumble...  Anyway, that's why I admire
the BSD license, and why I consider it "freer" than most commercial
software, and even GNU stuff, too.

And if anyone would like to toss in their 2c about the FSF, I will be
*quite* happy to moan and gripe and carp further upon the subject of how
utterly silly I think the GPL is... :)

> I may wish they would release their IP sooner
> rather than later, but my wishes are not a valid claim on their IP.
> I mean, I wish Bill Gates would give me a million dollars -- he
> wouldn't miss it -- but I don't expect him to.

Hell no.

On the other hand, the law is pretty clear about this: if I download, I
dunno, C64 Ultimate Wizard, without paying for the license, the onus is
on EA - and, AFAICT,  no one else - to find me and to sue me for
infringement.

This obviously constitutes a huge waste of resources on EA's part should
they choose to do so, resources they could be using to develop new,
"non-obsolete" games, which is, arguably, their job - otherwise, they'd
still be selling Ultimate Wizard, which, last I checked, they ain't.

Or, take something even more interesting - var'aq.  Like all "fanart,"
it's technically in violation of Paramount's license, because it uses
elements from their copyrighted material (Klingons.)  But if you could
argue that var'aq is a parody of Star Trek, rather than a derivative
work, it would be excepted from infringement.  Do you understand that
distinction?  I'm not sure I do - especially considering the
sophisticated sense of humour that can appear in some parodies.  It
really freaks me out to think that this is what courts of the land are
busy doing, trying to decide if some story or programming language or
other is a joke or not :)

Or, take the license on NT, which states you can't apply a patch to it,
which contradicts what the courts have AFAIK decided about software in
general: if you own it (that is, if you own a licensed copy,) then you
have the right to modify it, just like you have the right to install a
new muffler in a car that you own; call it the "right to aftermarket
upgrading" if you like.  You can put whatever you like in a license, but
federal and international law take precedence.

If you thought this was bad you ought to hear me rant about patents
sometime :)

Chris

-- 
Epimenides sez "Feel free, Cretan"


------------------------------

Date: Tue, 03 Jul 2001 20:57:48 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: various (fortified with Keith yacking on about RISC OS)

Russell Bornschlegel wrote:
> Chris Pressey wrote:
> > > Ack! That's so 1970's! My application object just takes a look at the
> > > objects associated with it and queries the object managing it's
> > > configuration details... No, no, wait... it's semantic relations to other
> > > objects *are* it's configuration. Nice slight of hand, eh!
> > But if you take it too far, then all of your objects are empty and ALL
> > the useful information exists only in the relationships between them!
> > Which is fascinating, but maybe not totally efficient :)
> I'll once again launch the "filesystem node = raw binary block +
> key/value pair property data" meme, and see if anyone salutes.

I think the question we're coming to here is, if you have a key/value
property list, what do you need the raw binary block for (except,
perhaps, efficiency?)

> > > >I've said it before, I'll say it again: web pages are *documents*, and
> > > >documents should *not* crash.  [...]
> How about a restricted or private TLD called .static or something? Any
> use of any Javascript, other embedded scripting language, or other
> escape
> route in an .html file in a .static domain would be grounds for the
> managers of the TLD to kill that domain. :)

Eek!  That's a bit... fundamentalist... but I kinda like it :)

I dunno, wasn't it, like, years ago (like, 1996) that everybody was
talking about how we were going to have new TLD's like .store, .info and
so forth?  Well, here we are five years later and... I dunno about you,
but I've yet to encounter one of those on the internet at large.

Chris

-- 
"Enthusiasm!  Enthusiasm!  Rah, rah, rah!"


------------------------------

From: "Cal Henderson" <cal@iamcal.com>
Subject: Re: various (fortified with Keith yacking on about RISC OS)
Date: Wed, 4 Jul 2001 07:16:28 +0100

: It looks like gobbledegook, I know, but this is all quite useful stuff.
: The 'Set' command sets system variables. If you want to read the value of
: system variables, you enclose them in angle brackets. There's no real
: registry anywhere saying which application is run when file xyz is run,
: instead the closest is that applications register themselves by setting
: system variables (there's a set of system variable 'shapes' which serve
: different purposes) if the place isn't gone. That's what the third line of
: code in each of the files is about. In this example, the !Boot file checks
: to see if another program has registered itself to handle files with the
: numerical file type 666. If  there is none, it sets itself up to handle
: them, and on the next line, gives that file type a human-readable name. The
: !Run file does much the same thing in this case, but forces itself to be
: registered as that filetype's handler. After that, it's just the program
: itself being run.
:
: There's a lot more to it. It's all pretty cool, I think. It's a pity RISC
: OS never shook off the image it got in its early days.

It's a good OS, but within the !boot lies one of it's problems. Until you've
opened the folder containing your program, the file association hasn't been
made. The basic file associations (text, sprites, draw, obey, command etc.) are
made by the !Resources booting on startup (correct?) which suggests that the
!Resources folder is a kind of registry.

There's also the limitation of one (or two) applications per file in terms of
association. Each file type (and file types are a good thing - MacOS is
fundementally wrong here) only has two actions - dblclick and shift-dblclick,
which means it can't be associated with more than two programs. To open it in
another program, you need that program already open.

Hmmm.

--cal



------------------------------

Date: Wed, 4 Jul 2001 17:33:59 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: Re: intellectual property (was Re: various)


On Tue, 3 Jul 2001, Chris Pressey wrote:

> 
> Well, speaking legally, that's the case (subject to what, exactly, you
> or anyone means by "free"... :)  Internet Explorer is "free" in the
> sense that you can (in theory) obtain the binaries for no charge; but it
> is far from free in the sense of unrestrictedness of development.  Otoh,
> FSF seems the other way around; vehemently against anyone (except,
> perhaps, themselves) making a buck off their software, even if it is
> unrestricted in terms of development.

Anyone can sell their software, as long as you give whomever you sell it
to the same rights that you have, i.e. they can get the souce code and can
do anything they want with the software under the terms and conditions of
the GPL. 

The idea is free software for free software in return. The GPL allows
that... taking free software, making it proprietary and selling it is
forbidden.

> I mean, pleeeez.  "Why you should
> not use the LGPL."  FMH grumble grumble...  Anyway, that's why I admire
> the BSD license, and why I consider it "freer" than most commercial
> software, and even GNU stuff, too.

The problem with the FSF stuff is that they take it so strict that you
can't use their free software with your free software (even if it fits
the FSF's definition of "free"), unless it is "GPL-compatible". This is,
for example, a problem with Ocaml. Ocaml is distributed under the QPL and
can't use the GNU readline library (LGPL).

The GNU's "free" is more of an ensuring that your software remains free,
with the trade-off of the software in total being a little less free that
way :-)

> 
> And if anyone would like to toss in their 2c about the FSF, I will be
> *quite* happy to moan and gripe and carp further upon the subject of how
> utterly silly I think the GPL is... :)

I always wonder... how many people that find the GPL utterly silly have
ever actually had a _problem_ with it? The QPL-LGPL example above is a
sort of stupid thing, but how often does something like that happen?

So please, go on with your "utterly silly" rant... but give me an example
where you actually had a problem.

I personally like putting stuff under the GPL for sake of simplicity...
it is for what I want, i.e. free software that can be modified, etc. If
somebody wants to do something more with the software than the GPL allows,
they can send me an email asking me to dual-license the software and I
will, if I don't see any problem with it (ignoring for a moment the fact
that I don't write any useful software, anyway :-)

> 
> Chris
> 

Markus



------------------------------

Date: Wed, 04 Jul 2001 16:59:36 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: various (fortified with Keith yacking on about RISC OS)

At 07:16 04/07/2001 +0100, Cal Henderson wrote:
>: It looks like gobbledegook, I know, but this is all quite useful stuff.
>: The 'Set' command sets system variables. If you want to read the value of
>: system variables, you enclose them in angle brackets. There's no real
>: registry anywhere saying which application is run when file xyz is run,
>: instead the closest is that applications register themselves by setting
>: system variables (there's a set of system variable 'shapes' which serve
>: different purposes) if the place isn't gone. That's what the third line of
>: code in each of the files is about. In this example, the !Boot file checks
>: to see if another program has registered itself to handle files with the
>: numerical file type 666. If  there is none, it sets itself up to handle
>: them, and on the next line, gives that file type a human-readable name. The
>: !Run file does much the same thing in this case, but forces itself to be
>: registered as that filetype's handler. After that, it's just the program
>: itself being run.
>:
>: There's a lot more to it. It's all pretty cool, I think. It's a pity RISC
>: OS never shook off the image it got in its early days.
>
>It's a good OS, but within the !boot lies one of it's problems. Until you've
>opened the folder containing your program, the file association hasn't been
>made. The basic file associations (text, sprites, draw, obey, command 
>etc.) are
>made by the !Resources booting on startup (correct?) which suggests that the
>!Resources folder is a kind of registry.

Are you sure you're not thinking of the !Boot application?

The !Boot application is more of a repository than a registry, a standard 
place to put things. The basic associations are part of the OS (such as 
absolute files invoking the Run command, Obey files, etc.) set up when it 
boots first. Then it boots the applications in Resources:$.Apps. What 
happens to sprites, textfiles, drawfiles and the like is all up to that 
application. When !Edit is booted, it sets itself up to load text files, 
the same with !Paint with sprites, and !Draw with drawfiles. These aren't 
set up initially.

There is a way around the whole 
application-must-be-seen-before-!boot-is-run problem. I had a wee program 
!AutoBoot which allowed me to edit a list of applications with would be 
Filer_Boot-ed by another small program sitting in the Tasks directory in 
the !Boot application. I'd just drag the application onto !AutoBoot's icon 
and it would add it to the list if it wasn't already there. It also had a 
small editor which would allow me to edit the list and could try to find 
applications if it got moved. If you dragged a normal directory onto it, it 
would register all the applications in it to be autobooted on startup. It 
was pretty nifty.

>There's also the limitation of one (or two) applications per file in terms of
>association. Each file type (and file types are a good thing - MacOS is
>fundementally wrong here) only has two actions - dblclick and shift-dblclick,
>which means it can't be associated with more than two programs. To open it in
>another program, you need that program already open.

I never understood (happens to me a lot, doesn't it!) quite why we had to 
set those system  variables directly, rather than maybe using commands. 
Something like:

RegisterFileHandler "<Handler Name>" <filetype> "<Filetype Name>" <command 
to invoke>

so rather than

Set Alias$RunType_666 <FooBar$Dir>.!Run %%0

I'd do

RegisterFileHandler "Evil Word" 666 "EvilWord" <FooBar$Dir>.!Run %%0

This would do the same as the line above, but the OS could also keep a 
record of all the previous programs which registered themselves as handlers 
for this kind of file *and* we'd be able to get rid of the

If "<Alias$RunType_666>" = "" Then Set Alias$RunType_666 <FooBar$Dir>.!Run %%0

nonsense that we have to include in !Boot files.

One nice thing about Windows is the 'Open With...' submenu. If the above 
scheme was implemented, RISC OS could do this too and wouldn't need a registry.

Shift-double-click *always* sends the file to whatever application is 
currently handling textfiles so I wonder if that counts.

Despite poor attempts, something which RISC OS had which other desktops 
would benefit from is the iconbar. The iconbar made the desktop truly 
document-centric, something which no other desktop/GUI has ever been able 
to achieve. Hats off to Sophie!

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: Abandonware for Programmers (was: Re: various)
Date: Wed, 4 Jul 2001 19:13:10 +0100

Am I the only one for whom http://community.borland.com/museum brings up
nice (?)
memories ?

(In case you don't want to register: They provide

- Turbo Pascal 5.5
- Turbo C++ 1.01
- Turbo C 2.01

4free)



------------------------------

Date: Wed, 04 Jul 2001 13:31:28 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: intellectual property (was Re: various)

"markus.kliegl" wrote:
> On Tue, 3 Jul 2001, Chris Pressey wrote:
> > FSF seems the other way around; vehemently against anyone (except,
> > perhaps, themselves) making a buck off their software, even if it is
> > unrestricted in terms of development.
> Anyone can sell their software, as long as you give whomever you sell it
> to the same rights that you have, i.e. they can get the souce code and can
> do anything they want with the software under the terms and conditions of
> the GPL.

Which is as it should be, I was mainly rolling my eyes at FSF's general
attitude, here.

> The idea is free software for free software in return. The GPL allows
> that... taking free software, making it proprietary and selling it is
> forbidden.

...without express consent of the copyright holder, I should add; if you
can get that, you can do anything you like with it.  As with any
license.

> > I mean, pleeeez.  "Why you should
> > not use the LGPL."  FMH grumble grumble...  Anyway, that's why I admire
> > the BSD license, and why I consider it "freer" than most commercial
> > software, and even GNU stuff, too.
> The problem with the FSF stuff is that they take it so strict that you
> can't use their free software with your free software (even if it fits
> the FSF's definition of "free"), unless it is "GPL-compatible". This is,
> for example, a problem with Ocaml. Ocaml is distributed under the QPL and
> can't use the GNU readline library (LGPL).

See, that's just idiotic.  Especially considering it's *L*GPL, that's
supposed to relieve problems like this.

In fact I suspect it might not be a problem, but the legal text is so
thick that people are merely frightened that it might be a problem.

The fact is a single piece of software is nigh useless alone, and no one
can scientifically define the difference between "mere aggregation" and
"integration."

So why doesn't OCaml's author write the FSF and ask for one of the
"special exceptions" that they "sometimes grant."  Surely theirs is not
against the "spirit of free software."

Imagine, for example, if OCaml just went ahead and included gnureadline
anyway.  Would FSF sue them?  I'd guess no.  They obviously have
similar, if not the same, intent.  See, maybe part of the problem is
that people just aren't communicating enough...

> The GNU's "free" is more of an ensuring that your software remains free,
> with the trade-off of the software in total being a little less free that
> way :-)

Try telling *them* that:

"If you develop a new program, and you want it to be of the *greatest*
possible use to the public, the *best* way to achieve this is to make it
free software which everyone can redistribute and change under *these*
terms."  (emphasis mine)

> > And if anyone would like to toss in their 2c about the FSF, I will be
> > *quite* happy to moan and gripe and carp further upon the subject of how
> > utterly silly I think the GPL is... :)
> I always wonder... how many people that find the GPL utterly silly have
> ever actually had a _problem_ with it? The QPL-LGPL example above is a
> sort of stupid thing, but how often does something like that happen?

Well, FreeBSD has it's problems as well, unable to distribute gmake et
al as part of it's installation.  Thank heavens for the ports collection
:)

> So please, go on with your "utterly silly" rant... but give me an example
> where you actually had a problem.

I'll jump to the silliest part:

"Also add information on how to contact you by electronic and paper
mail."

Mmm hmm, right, paper mail.  I see the author's home address on a *lot*
of free software, I do I do :)

Other stuff:

"7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License."

Nope... law of the land takes precedence over license, regardless of
what the license states, as I mentioned earlier.  So when I see
something like this I have to ask myself "who are they trying to fool?"

"9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns."

That's not a term nor a condition.  It should be in the preamble... if
it needs to be stated at all!

> I personally like putting stuff under the GPL for sake of simplicity...
> it is for what I want, i.e. free software that can be modified, etc. If
> somebody wants to do something more with the software than the GPL allows,
> they can send me an email asking me to dual-license the software and I
> will, if I don't see any problem with it (ignoring for a moment the fact
> that I don't write any useful software, anyway :-)

Well, dual licenses are their own cup of stew.  I have no idea how
that's supposed to work, legally.  Apparently nothing is stopping me
from putting two (quite possibly mutually contradictory) licenses on a
program, hell, why not put it under ALL the licenses listed at
http://www.opensource.org/licenses/ , that would sure confuse the hell
out of the lawyers wouldn't it :)

I don't like the GPL because it's *not* simple (compared to something
like BSD, which *is* simple and *doesn't* seem to beg for 'dual
licensing'.)

So, I like putting stuff under the *BSD* license for the sake of
simplicity.  It does "the same thing" as the GPL, but:
- it's way shorter
- it avoids the "you should have received a copy" problem entirely
- it's written in legal language instead of the vague idealistic prattle
found in the GPL and the Artistic license

I mean, face it, if you hired a lawyer to come up with a license for
your product, and what they gave you looked like the GPL or the Artistic
license... would *you* pay the guy? :)

Chris

-- 
THE VIEWS EXPRESSED IN THE PRECEDING E-MAIL ARE SOLELY THE VIEWS OF
CHRIS PRESSEY (WHO IS NOT A LAWYER) AND MAY OR MAY NOT REFLECT REALITY
WHERE YOU COME FROM.  YOUR MILEAGE MAY VARY.  VOID WHERE PROHIBITED. 
POST NO BILLS.  WATCH THIS SPACE.


------------------------------

Date: Wed, 04 Jul 2001 12:48:08 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: intellectual property (was Re: various)



Chris Pressey wrote:
> 
> Russell Bornschlegel wrote:
> > Chris Pressey wrote:
> > > To me that's a strong argument that "damages" based on the "piracy" of
> > > obsolete-but-still-copyrighted software would be very, very difficult to
> > > obtain in any court of law where the judge has his or her eyes open...
> > Legal fees at some point will vastly eclipse damages, and work just
> > as well as a deterrent. Personally, I believe piracy of obsolete-but-
> > still-copyrighted software is ethically Wrong;
> 
> I'd rather leave ethics out of it; arguably, merely using a computer
> would be "ethically wrong" to a luddite, right? :)

Sure, so it's "ethically wrong" to force a Luddite to use a computer. 

Leaving ethics aside, I started going in circles here: 

Obsoleteware piracy violates copyright law. I believe in obeying 
"just" laws and in disobeying certian "unjust" laws. I consider 
portions of copyright law just, and other portions unjust (like
the DMCA, which I think is dangerously restrictive and gives too
much power to large holders of IP). 

However, I just realized how to get obsolete software in a reasonable
way without violating copyright law. (It may violate EULAs, but I 
don't believe them to be legally binding for the most part.)

Buy old software from people who have upgraded to new software.

Take a quick trip to eBay. Borland makes their abandonware available
for free, but I see on eBay a sealed-box copy of Turbo C++ 3.0 going 
for $2.25 -- that's a bargain for printed manuals. MS-DOS 6 runs
around $10. If I had to get a kid set up with a system where he 
could learn to program, this might be a viable alternative to 
a free Unixoid OS -- particularly if I wanted to keep him off the 
internet ("Here's the RFCs. Let me know when you've written a 
TCP/IP stack.").

If you need "modern" but not latest software, you're gonna pay
a little more: MS Office is stil pretty pricey -- Office 95 
goes for about $40, Office 97 upgrades around $50, Office 97 
full versions $100. Lotus SmartSuite Millennium edition is 
under $20. Photoshop 4, $30. 

> And if anyone would like to toss in their 2c about the FSF, I will be
> *quite* happy to moan and gripe and carp further upon the subject of how
> utterly silly I think the GPL is... :)

Well, it depends on what you mean by silly. Something shifted in my
head a few months ago that made the GPL make sense to me. Every time
GPL'd code is taken and reused, something of value has changed hands;
the condition, the value given in return, is the expectation that 
code of value will be returned to the GPL community, eventually 
trickling down (in a statistical, if not literally traceable way) to 
the person who released the code in the first place. If you don't 
want to participate in this, don't -- but it doesn't make sense to
me to bitch about it. 

It's a neighborhood, a community. It's going next door to borrow a 
cup of sugar from the neighbors. If you borrow from everyone else and 
don't let anyone else borrow from you, eventually the neighbors get 
pissed off and send nasty letters.  

The less restrictive open source licenses are merely neighbors who
don't worry so much about bad apples in the neighborhood.

(Chris, I just got your response to markus after I wrote all this, 
so I see that much of your problem with GPL is the phrasing, rather
than the intent.
 
> On the other hand, the law is pretty clear about this: if I download, I
> dunno, C64 Ultimate Wizard, without paying for the license, the onus is
> on EA - and, AFAICT,  no one else - to find me and to sue me for
> infringement.

Hmm, can't find C64 Ultimate Wizard on eBay. :)

> Or, take something even more interesting - var'aq.  Like all "fanart,"
> it's technically in violation of Paramount's license, because it uses
> elements from their copyrighted material (Klingons.)

As usual, Paramount has to balance community goodwill against the 
money they could get by launching a competing product. They could
try to suppress var'aq, but they would annoy some people and they
couldn't show _any_ financial damage -- there's no market for 
var'aq. So yeah, they would only consider doing it as a deterrent
to others. 

> But if you could
> argue that var'aq is a parody of Star Trek, rather than a derivative
> work, it would be excepted from infringement.  Do you understand that
> distinction?  I'm not sure I do - especially considering the
> sophisticated sense of humour that can appear in some parodies.

AFAIK, it's not an objective distinction, and there are a lot of
interacting factors. You can do a blatant parody of Star Trek, 
down to costume design and character names, as a single skit on 
Saturday Night Live (IIRC, the fact that both SNL and ST-TOS were 
on the same TV network helped make this work, but I think another 
network could get away with a one-off like that). Doing a feature 
film (Galaxy Quest) you have to disguise things a bit more. 

I'm not sure how I'd try to defend var'aq. It uses parts of the
Klingon language; I don't know what exactly the relationship 
between Paramount and the KLI is. It's more a parody of programming
languages (as with any esolang) than a parody of Star Trek. 
If you did a string search-n-replace on the var'aq page, you'd 
get exactly the same logical content, but it's significance
would change drastically -- the giggle value of var'aq is tied 
intimately to Paramount's IP. That sounds like parody to me...


> It
> really freaks me out to think that this is what courts of the land are
> busy doing, trying to decide if some story or programming language or
> other is a joke or not :)

No worse than some people's careers and reputations hanging on 
whether some court of the land decides is something is art or 
obscenity.[1] 

-RB


[1] http://www.cbldf.org/casefiles/index.shtml -- Mike 
Diana's case is IMO the most significant of these.


------------------------------

Date: Wed, 4 Jul 2001 23:58:46 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: Re: intellectual property (was Re: various)



On Wed, 4 Jul 2001, Chris Pressey wrote:

> "markus.kliegl" wrote:
> > On Tue, 3 Jul 2001, Chris Pressey wrote:
> > > FSF seems the other way around; vehemently against anyone (except,
> > > perhaps, themselves) making a buck off their software, even if it is
> > > unrestricted in terms of development.
> > Anyone can sell their software, as long as you give whomever you sell it
> > to the same rights that you have, i.e. they can get the souce code and can
> > do anything they want with the software under the terms and conditions of
> > the GPL.
> 
> Which is as it should be, I was mainly rolling my eyes at FSF's general
> attitude, here.

I fail to understand you here.

> 
> > The idea is free software for free software in return. The GPL allows
> > that... taking free software, making it proprietary and selling it is
> > forbidden.
> 
> ...without express consent of the copyright holder, I should add; if you
> can get that, you can do anything you like with it.  As with any
> license.

GPL'd software, even if used in a commercial and/or proprietary product,
is still freely available to everyone. If a company wants to use free
software, rather than reinventing the wheel, in a commercial and
proprietary manner, why shouldn't they pay the copyright holder?

Of course, the copyright holder of GNU software is the FSF, which would
never dare think of selling a proprietary company software.

> 
> > > I mean, pleeeez.  "Why you should
> > > not use the LGPL."  FMH grumble grumble...  Anyway, that's why I admire
> > > the BSD license, and why I consider it "freer" than most commercial
> > > software, and even GNU stuff, too.
> > The problem with the FSF stuff is that they take it so strict that you
> > can't use their free software with your free software (even if it fits
> > the FSF's definition of "free"), unless it is "GPL-compatible". This is,
> > for example, a problem with Ocaml. Ocaml is distributed under the QPL and
> > can't use the GNU readline library (LGPL).
> 
> See, that's just idiotic.  Especially considering it's *L*GPL, that's
> supposed to relieve problems like this.

I don't know why the LGPL exists. It goes against the philosophical ideal
of the FSF and still isn't all too helpful, but I'm not one to decide
that.

> 
> In fact I suspect it might not be a problem, but the legal text is so
> thick that people are merely frightened that it might be a problem.

It is a problem.

> 
> The fact is a single piece of software is nigh useless alone, and no one
> can scientifically define the difference between "mere aggregation" and
> "integration."
> 
> So why doesn't OCaml's author write the FSF and ask for one of the
> "special exceptions" that they "sometimes grant."  Surely theirs is not
> against the "spirit of free software."

The problem is one of the QPL being incompatible with the GPL and thus (I
suppose) some sort of weird legal problems that could in some way crop up
are trying to be avoided at all costs. It's a matter of not being dragged
into the world of unsafe free software.

> 
> Imagine, for example, if OCaml just went ahead and included gnureadline
> anyway.  Would FSF sue them?  I'd guess no.  They obviously have
> similar, if not the same, intent.  See, maybe part of the problem is
> that people just aren't communicating enough...

No, but the FSF would probably ask them to stop including it. I by all
means don't know very much about law, but the way I know laws and have
experienced the pedanticness of GNU software (recording *every* change,
etc.), probably there's something about invalidness of the license if the
FSF is aware and doesn't do anything. OTOH, I may be completely wrong.

   In the Objective Caml distribution, all files marked "Copyright INRIA"
   in the following directories and their sub-directories are distributed
   under the terms of the GNU Library General Public License:
            asmrun, byterun, config, maccaml, otherlibs, stdlib

   All files marked "Copyright INRIA" in the other directories and their
   sub-directories are distributed under the terms of the Q Public
   License version 1.0.

So INRIA is actually quite willing to play along.

> 
> > The GNU's "free" is more of an ensuring that your software remains free,
> > with the trade-off of the software in total being a little less free that
> > way :-)
> 
> Try telling *them* that:
> 
> "If you develop a new program, and you want it to be of the *greatest*
> possible use to the public, the *best* way to achieve this is to make it
> free software which everyone can redistribute and change under *these*
> terms."  (emphasis mine)

No, not "of the greatest use to the public", but "of the greatest use to
those that play along and *only* those that play along", which leads back
to the philosophical ideal, which I approve of.

> 
> > > And if anyone would like to toss in their 2c about the FSF, I will be
> > > *quite* happy to moan and gripe and carp further upon the subject of how
> > > utterly silly I think the GPL is... :)
> > I always wonder... how many people that find the GPL utterly silly have
> > ever actually had a _problem_ with it? The QPL-LGPL example above is a
> > sort of stupid thing, but how often does something like that happen?
> 
> Well, FreeBSD has it's problems as well, unable to distribute gmake et
> al as part of it's installation.  Thank heavens for the ports collection
> :)

Yes, that's really ridiculous.

The GNU project is about having free software and fighting proprietary
software in all manner. Unfortunately we do not live in that ideal world,
so in order to still not serve proprietary software the GPL is very
strict about anything that isn't GPL. So it requires the "play along"...
if everyone would play along, all these problems wouldn't exist.

> 
> > So please, go on with your "utterly silly" rant... but give me an example
> > where you actually had a problem.

I was asking for a problem you had with using GPL'd software, not what
you find utterly silly about the text of the license. So I assume you only
find it utterly silly to use it yourself.

> 
> I'll jump to the silliest part:
> 
> "Also add information on how to contact you by electronic and paper
> mail."
> 
> Mmm hmm, right, paper mail.  I see the author's home address on a *lot*
> of free software, I do I do :)

That's in the 'Appendix: How to Apply These Terms to Your New Programs'.
So it's more of a guideline. Putting your email address somewhere makes
sense to me, but you don't seem to object to that, either. Paper mail...
yes, seems a bit weird, but the GPLv2 dates back to June 1991, where not
everybody had electronic mail.

> 
> Other stuff:
> 
> "7. If, as a consequence of a court judgment or allegation of patent
> infringement or for any other reason (not limited to patent issues),
> conditions are imposed on you (whether by court order, agreement or
> otherwise) that contradict the conditions of this License, they do not
> excuse you from the conditions of this License."
> 
> Nope... law of the land takes precedence over license, regardless of
> what the license states, as I mentioned earlier.  So when I see
> something like this I have to ask myself "who are they trying to fool?"

I'm no lawyer, either, but if you're sure about that, go ahead and send
the FSF an email asking them for clarification (or ask one of the many
GPL-specialists around).

> 
> "9. The Free Software Foundation may publish revised and/or new versions
> of the General Public License from time to time. Such new versions will
> be similar in spirit to the present version, but may differ in detail to
> address new problems or concerns."
> 
> That's not a term nor a condition.  It should be in the preamble... if
> it needs to be stated at all!

Perhaps it is the wrong place, but taking the "...either version 2 of the
License, or (at your option) any later version." found in most GPL'd
files, it is something important to note.


> 
> > I personally like putting stuff under the GPL for sake of simplicity...
> > it is for what I want, i.e. free software that can be modified, etc. If
> > somebody wants to do something more with the software than the GPL allows,
> > they can send me an email asking me to dual-license the software and I
> > will, if I don't see any problem with it (ignoring for a moment the fact
> > that I don't write any useful software, anyway :-)
> 
> Well, dual licenses are their own cup of stew.  I have no idea how
> that's supposed to work, legally.  Apparently nothing is stopping me
> from putting two (quite possibly mutually contradictory) licenses on a
> program, hell, why not put it under ALL the licenses listed at
> http://www.opensource.org/licenses/ , that would sure confuse the hell
> out of the lawyers wouldn't it :)

It works by giving people the option of using the software under either
the conditions of license 1 or license 2, not a mix of both or anything
like that. Sure, put a piece of software under all those licenses, I'm
sure it wouldn't confuse lawyers, exactly because it's like the same piece
of software distributed in 10 different versions, each with a different
license.

> 
> I don't like the GPL because it's *not* simple (compared to something
> like BSD, which *is* simple and *doesn't* seem to beg for 'dual
> licensing'.)

By simplicity I mean that I don't have to worry about anything. The GPL
has everything worked out for me, i.e. I want to distribute free community
software and I don't want to deal with legal details. It guarantees me
safety.

> 
> So, I like putting stuff under the *BSD* license for the sake of
> simplicity.  It does "the same thing" as the GPL, but:
> - it's way shorter
> - it avoids the "you should have received a copy" problem entirely
> - it's written in legal language instead of the vague idealistic prattle
> found in the GPL and the Artistic license

It doesn't do the same thing. Someone can take the software and relicense
it...
     * Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
     * Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in
       the documentation and/or other materials provided with the
       distribution.
Thus the software can be used in proprietary products... this is
completely contradictory of the GNU ideal.

> 
> I mean, face it, if you hired a lawyer to come up with a license for
> your product, and what they gave you looked like the GPL or the Artistic
> license... would *you* pay the guy? :)

From a legal standpoint the GPL has been checked by several lawyers. The
whole point of the FSF being founded (it's an official organization) was
to protect software and sue any companies trying to steal any of it. In
order for this to work, they needed an absolutely safe license and that's
what the GPL is.

Which license to use depends on your philosophy. Saying that one license
is "utterly silly" (why, actually? You don't like the wording?) is utterly
silly :-)

> 
> Chris
> 
> -- 
> THE VIEWS EXPRESSED IN THE PRECEDING E-MAIL ARE SOLELY THE VIEWS OF
> CHRIS PRESSEY (WHO IS NOT A LAWYER) AND MAY OR MAY NOT REFLECT REALITY
> WHERE YOU COME FROM.  YOUR MILEAGE MAY VARY.  VOID WHERE PROHIBITED. 
> POST NO BILLS.  WATCH THIS SPACE.
> 
> 

Markus



------------------------------

Date: Thu, 5 Jul 2001 00:09:31 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: [lang] Re: [BF] Emacs mode


(Sorry I didn't respond earlier)

On Sun, 1 Jul 2001, Rafal M. Sulejman wrote:

> On Sun, 1 Jul 2001, markus.kliegl wrote:
> 
> > I worked up a little emacs mode for brainfuck including an
> > interpreter and odd debugging functionality.
> 
> Heh, someone to implement this in vi? emacsers just won a battle
> in this world domination war ;) (Use of BF against civil
> population was forbidden by UN in 1999)

I've only really used vi (more specifically vim) for a few months, so I'm
not sure how much is possible (to my understanding, vim now supports
scripting in perl, python and ruby).
But here are some things to note:
vim doesn't have an array data type, so it has to be simulated by a
buffer (I read that somewhere, I have no idea how it works).
[ and ] can be, depending on a[p], mapped to either '%' or 'l', which is
basically what I used in bf.el (bf-matching-bracket). Of course this is
terribly inefficient, but it makes BF seem like the perfect editor
language sometimes :-)

Anyone to implement a bf interpreter in TECO?

> 
> > Please look at my comments for more details, though. They
> > comprise more than a third of the file, after all :-)
> 
> FSF will probably send you four six-packs of Virtual Beer :)
> Now I have *real* reason to learn eeee-macs.

I wouldn't dare show any emacs lisp hacker the code...

> 
> BTW. -- where do you live, Markus? Ich bin ein M'jlabbacher (not
> exactly ;)

I live in Stahnsdorf, about 7 km from Berlin and 3 from Potsdam.

> --
>  . . . . | Rafal M. Sulejman <rms@spam-haters.poczta.onet.pl>
>  . # . . |
>  # . # . | "It's a small world, but I wouldn't want
>  . . # . |  to have to paint it." --Steven Wright
> 





------------------------------

Date: Thu, 5 Jul 2001 00:24:38 +0200 (CEST)
From: "Rafal M. Sulejman" <rafal@engelsinfo.de>
Subject: [lang] Re: [BF] Emacs mode

On Thu, 5 Jul 2001, markus.kliegl wrote:

>
> (Sorry I didn't respond earlier)
>
> On Sun, 1 Jul 2001, Rafal M. Sulejman wrote:
>
> > On Sun, 1 Jul 2001, markus.kliegl wrote:
> >
> > > I worked up a little emacs mode for brainfuck including an
> > > interpreter and odd debugging functionality.
> >
> > Heh, someone to implement this in vi? emacsers just won a
> > battle in this world domination war ;) (Use of BF against
> > civil population was forbidden by UN in 1999)
>
> I've only really used vi (more specifically vim) for a few
> months, so I'm not sure how much is possible (to my
> understanding, vim now supports scripting in perl, python and
> ruby).
> But here are some things to note:
> vim doesn't have an array data type, so it has to be simulated
> by a buffer (I read that somewhere, I have no idea how it
> works).  [ and ] can be, depending on a[p], mapped to either '%'
> or 'l', which is basically what I used in bf.el
> (bf-matching-bracket). Of course this is terribly inefficient,
> but it makes BF seem like the perfect editor language sometimes
> :-)

I already "created" something -- set of macros.

Instead of array you can use actual buffer of vi :)

Just split. In one window/buffer you have BF code in second --
something like:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Because you can map:

:map + ^V^A
:map - ^V^X

you can easily increase or decrease "cell" next to cursor.

Movements can be "implemented" using

:map > W
:map < B

To add input/output you need to open next window/buffer and copy
back and forth values in it (so far it worked with
numeric,space-separated values.

>
> Anyone to implement a bf interpreter in TECO?
>

bf? TECO is powerful enough to emulate how WE think :)
(someone said it can be done with 18(?) macros and 4000
Q-registers :)

> > > Please look at my comments for more details, though. They
> > > comprise more than a third of the file, after all :-)
> >
> > FSF will probably send you four six-packs of Virtual Beer :)
> > Now I have *real* reason to learn eeee-macs.
>
> I wouldn't dare show any emacs lisp hacker the code...
>
THEY ALREADY KNOW.


> > BTW. -- where do you live, Markus? Ich bin ein M'jlabbacher (not
> > exactly ;)
>
> I live in Stahnsdorf, about 7 km from Berlin and 3 from Potsdam.

Ossi with attitude ? ;) [I'm still more "eastern" than you].

--
 . . . . | Rafal M. Sulejman                        /"\
 . . . . | rms@spam-haters.poczta.onet.pl>          \ /
 . # . . | ASCII Ribbon Campaign for HTML-free mail  X
 # # . . |                                          / \





------------------------------

Date: Thu, 5 Jul 2001 01:49:13 +0200 (CEST)
From: markus.kliegl@t-online.de (markus.kliegl)
Subject: [lang] Re: [BF] Emacs mode



On Thu, 5 Jul 2001, Rafal M. Sulejman wrote:

> On Thu, 5 Jul 2001, markus.kliegl wrote:
> 
> >
> > (Sorry I didn't respond earlier)
> >
> > On Sun, 1 Jul 2001, Rafal M. Sulejman wrote:
> >
> > > On Sun, 1 Jul 2001, markus.kliegl wrote:
> > >
> > > > I worked up a little emacs mode for brainfuck including an
> > > > interpreter and odd debugging functionality.
> > >
> > > Heh, someone to implement this in vi? emacsers just won a
> > > battle in this world domination war ;) (Use of BF against
> > > civil population was forbidden by UN in 1999)
> >
> > I've only really used vi (more specifically vim) for a few
> > months, so I'm not sure how much is possible (to my
> > understanding, vim now supports scripting in perl, python and
> > ruby).
> > But here are some things to note:
> > vim doesn't have an array data type, so it has to be simulated
> > by a buffer (I read that somewhere, I have no idea how it
> > works).  [ and ] can be, depending on a[p], mapped to either '%'
> > or 'l', which is basically what I used in bf.el
> > (bf-matching-bracket). Of course this is terribly inefficient,
> > but it makes BF seem like the perfect editor language sometimes
> > :-)
> 
> I already "created" something -- set of macros.
> 
> Instead of array you can use actual buffer of vi :)
> 
> Just split. In one window/buffer you have BF code in second --
> something like:
> 
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 
> Because you can map:
> 
> :map + ^V^A
> :map - ^V^X
> 
> you can easily increase or decrease "cell" next to cursor.
> 
> Movements can be "implemented" using
> 
> :map > W
> :map < B
> 
> To add input/output you need to open next window/buffer and copy
> back and forth values in it (so far it worked with
> numeric,space-separated values.

Wow! I really like that, great for debugging.
Time to learn some more vi(m).

> 
> >
> > Anyone to implement a bf interpreter in TECO?
> >
> 
> bf? TECO is powerful enough to emulate how WE think :)
> (someone said it can be done with 18(?) macros and 4000
> Q-registers :)

I wasn't questioning if it _could_ be implemented in TECO :-)

If hope I get around to reading more of the manual sometime.

> 
> > > > Please look at my comments for more details, though. They
> > > > comprise more than a third of the file, after all :-)
> > >
> > > FSF will probably send you four six-packs of Virtual Beer :)
> > > Now I have *real* reason to learn eeee-macs.
> >
> > I wouldn't dare show any emacs lisp hacker the code...
> >
> THEY ALREADY KNOW.

Your initials are RMS... hmm :-)

> 
> 
> > > BTW. -- where do you live, Markus? Ich bin ein M'jlabbacher (not
> > > exactly ;)
> >
> > I live in Stahnsdorf, about 7 km from Berlin and 3 from Potsdam.
> 
> Ossi with attitude ? ;) [I'm still more "eastern" than you].

I was born in western Berlin :-)

> 
> --
>  . . . . | Rafal M. Sulejman                        /"\
>  . . . . | rms@spam-haters.poczta.onet.pl>          \ /
>  . # . . | ASCII Ribbon Campaign for HTML-free mail  X
>  # # . . |                                          / \
> 

Markus





------------------------------

Date: Thu, 5 Jul 2001 02:13:49 +0200 (CEST)
From: "Rafal M. Sulejman" <rafal@engelsinfo.de>
Subject: [lang] Re: [BF] Emacs mode

On Thu, 5 Jul 2001, markus.kliegl wrote:

>
>
> On Thu, 5 Jul 2001, Rafal M. Sulejman wrote:

> Wow! I really like that, great for debugging.
> Time to learn some more vi(m).
>
> >
> > >
> > > Anyone to implement a bf interpreter in TECO?
> > >
> >
> > bf? TECO is powerful enough to emulate how WE think :)
> > (someone said it can be done with 18(?) macros and 4000
> > Q-registers :)
>
> I wasn't questioning if it _could_ be implemented in TECO :-)
> If hope I get around to reading more of the manual sometime.

Smokey! ;)

> > > > > Please look at my comments for more details, though. They
> > > > > comprise more than a third of the file, after all :-)
> > > >
> > > > FSF will probably send you four six-packs of Virtual Beer :)
> > > > Now I have *real* reason to learn eeee-macs.
> > >
> > > I wouldn't dare show any emacs lisp hacker the code...
> > >
> > THEY ALREADY KNOW.
>
> Your initials are RMS... hmm :-)

Not RMS, but rms... unices are case sensitive.
Just trying to make you paranoid ;)


> > > > BTW. -- where do you live, Markus? Ich bin ein
> > > > M'jlabbacher (not exactly ;)
> > >
> > > I live in Stahnsdorf, about 7 km from Berlin and 3 from
> > > Potsdam.
> >
> > Ossi with attitude ? ;) [I'm still more "eastern" than you].
>
> I was born in western Berlin :-)

Oooops! %)

--
 . . . . | Rafal M. Sulejman                        /"\
 . # . . | rms@spam-haters.poczta.onet.pl>          \ /
 # . . . | ASCII Ribbon Campaign for HTML-free mail  X
 # . . . |                                          / \





------------------------------

Date: Wed, 04 Jul 2001 20:43:41 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: intellectual property (was Re: various)

Russell Bornschlegel wrote:
> Sure, so it's "ethically wrong" to force a Luddite to use a computer.

It's probably ethically wrong to force anyone to use a computer against
their will.  OK, um, never mind... :)

> Leaving ethics aside, I started going in circles here:
> 
> Obsoleteware piracy violates copyright law. I believe in obeying
> "just" laws and in disobeying certian "unjust" laws.

Well - yeah.  There has to be some flexibility in law; people who treat
it as sacrosanct just bug me.  ("It must be wrong, 'cos it's against the
law...")  Laws are trying in some imperfect way to reflect ethics rather
than the other way around...

> I consider
> portions of copyright law just, and other portions unjust (like
> the DMCA, which I think is dangerously restrictive and gives too
> much power to large holders of IP).

I agree that recent "extensions" to copyright law have been contrived to
protect companies like Disney from having to release 70-some-yr-old
material into the public domain... to me this goes against the spirit of
copyright, regardless of their nonsensical arguments of "oh, if we don't
keep protecting intellectual property rights, artists will stop creating
art"... bull! you just wanna keep making money off Mickey Mouse. :)

> However, I just realized how to get obsolete software in a reasonable
> way without violating copyright law. (It may violate EULAs, but I
> don't believe them to be legally binding for the most part.)

Not when "actual" laws precede them (hmm, I seem to be detecting a theme
here.)

> Buy old software from people who have upgraded to new software.

Makes sense...

> The less restrictive open source licenses are merely neighbors who
> don't worry so much about bad apples in the neighborhood.

Which strikes me as canny.  Being paranoid about people "stealing the
code" is falling prey to the same thought patterns that keep code closed
in the first place!

Many, many companies are VERY reluctant to use software they perceive as
"too free" because it goes against their economic sensibilities.  This
is the case even when the free software is undeniably superior to what
they're currently using.  Because they've paid for what they're
currently using, the idea of getting the same (or better!) software
gratis makes them very nervous.  Understandable?  Maybe... I dunno. 
Anyway there does seem to be a huge rift between two equally zealous
camps, and that division hurts everyone in a small way.

> (Chris, I just got your response to markus after I wrote all this,
> so I see that much of your problem with GPL is the phrasing, rather
> than the intent.

The intent is great.  It's the implementation that bugs me (and the
people who can't seem to tell the implementation apart from the
intent...)

Plus you have to realize I'm just bitching for the sake of bitching. 
It's fun, I don't expect anything to change, but maybe these thoughts
can help spark some ideas or something.

> > On the other hand, the law is pretty clear about this: if I download, I
> > dunno, C64 Ultimate Wizard, without paying for the license, the onus is
> > on EA - and, AFAICT,  no one else - to find me and to sue me for
> > infringement.
> Hmm, can't find C64 Ultimate Wizard on eBay. :)

http://www.lemon64.com/

Of course, be aware that you are (AFAIK) VIOLATING EA's COPYRIGHT if
you choose to download it from there :)

I dunno.  In most ways, I don't believe there is such a thing as
obsolescence... but I do believe that other people believe that there
is.  If they want to abandon old software without relaxing copyright on
it, that's fine, but they have to realize that it becomes not much more
than a formality if they don't have the resources to enforce it.  And a
formality isn't going to dissuade anyone who's determined to obtain it.

> > Or, take something even more interesting - var'aq.  Like all "fanart,"
> > it's technically in violation of Paramount's license, because it uses
> > elements from their copyrighted material (Klingons.)
> As usual, Paramount has to balance community goodwill against the
> money they could get by launching a competing product. They could
> try to suppress var'aq, but they would annoy some people and they
> couldn't show _any_ financial damage -- there's no market for
> var'aq. So yeah, they would only consider doing it as a deterrent
> to others.

Well, the "good neighbours" thing applies here, too, or at least it
should.  If Paramount explicitly tells people "fanart is OK," then they
would theoretically be duly rewarded, and this would overall profit for
them and their community.  but, if they act paranoid and suppressive,
then theoretically they should be identified as "bad blood."  Of course
- this sort of assumes that people will think for themselves, which,
often as not isn't the case :)

> > It
> > really freaks me out to think that this is what courts of the land are
> > busy doing, trying to decide if some story or programming language or
> > other is a joke or not :)
> No worse than some people's careers and reputations hanging on
> whether some court of the land decides is something is art or
> obscenity.[1]

"The judge has just ruled that the legal proceedings themselves are both
obscene and a joke, and, complaining of a headache, has called a
recess..." :)

Chris

-- 
Add the next term to this series: 1. hunt and gather 
                                  2. farm 
                                  3. industry-commerce 
                                  4. ___________________    --R.A.W.


------------------------------

Date: Wed, 04 Jul 2001 20:59:46 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: re: intellectual property

Crap. Replied to sender again.

Chris Pressey wrote:
> 
> Russell Bornschlegel wrote:
> > Obsoleteware piracy violates copyright law. I believe in obeying
> > "just" laws and in disobeying certian "unjust" laws.
> 
> Well - yeah.  There has to be some flexibility in law; people who treat
> it as sacrosanct just bug me.  ("It must be wrong, 'cos it's against the
> law...")  Laws are trying in some imperfect way to reflect ethics rather
> than the other way around...

Sure. Obeying the law as a rule-of-thumb or default position is 
probably good. Obey if you can, protest if you want, willfully 
disregard if you must. Since I have trouble even understanding 
why the DMCA hasn't been shot down in the courts yet, I'll be 
disregarding that one...

> I agree that recent "extensions" to copyright law have been contrived to
> protect companies like Disney from having to release 70-some-yr-old
> material into the public domain... to me this goes against the spirit of
> copyright, regardless of their nonsensical arguments of "oh, if we don't
> keep protecting intellectual property rights, artists will stop creating
> art"... bull! you just wanna keep making money off Mickey Mouse. :)

Note that all the digital copy protection schemes being devised 
have _no_ facility for expiring the copyright in 70 or 90 or 120 
or 1357 years. 

> > The less restrictive open source licenses are merely neighbors who
> > don't worry so much about bad apples in the neighborhood.
> 
> Which strikes me as canny.  Being paranoid about people "stealing the
> code" is falling prey to the same thought patterns that keep code closed
> in the first place!

Then you can look at it as the FSF people wanting to have the 
control of source code somewhere other than the status quo, 
because more control for the status quo is less control for the
FSF. Like any revolution, they have decided on some level that
even if a utopia doesn't arise, they can be better off than 
what the status quo provides. I'm all for bloodless revolutions
that aren't actually being forced upon anyone, so again, more
power to 'em. Just... not _too much_ more power to them. ;)

I'll take a quick leap out of IP law & philosophy into sociology
here.

Consider all of human society as an emergent feature of the 
interaction between xenophilia/neophilia and xenophobia/neophobia. 
We get bored and seek out the new; we become enriched by the new, 
want to hold and possess it, to defend it (or our ownership of it) 
against the outsiders. We leave our hometowns to meet exotic 
MOTASes[1], settle down with them, make friends with the neighbors
in the new neighborhood, and freak out when the children rebel 
against the status quo. 
 
> Many, many companies are VERY reluctant to use software they perceive as
> "too free" because it goes against their economic sensibilities.  This
> is the case even when the free software is undeniably superior to what
> they're currently using. 

I wonder how many companies are using free software and don't 
realize it. Companies aren't monoliths any more than governments 
are. I can grab perl and use it and there's no need to notify 
my manager, let alone purchasing and accounting. Think anyone 
at Microsoft uses perl?

> Anyway there does seem to be a huge rift between two equally zealous
> camps, and that division hurts everyone in a small way.

Yup. It's just so hard to rally the masses around the banner of 
pragmatism and moderation and compromise, though. At least, things
are perceived that way.

> > Hmm, can't find C64 Ultimate Wizard on eBay. :)
> 
> http://www.lemon64.com/
> 
> Of course, be aware that you are (AFAIK) VIOLATING EA's COPYRIGHT if
> you choose to download it from there :)

I was trying to see if I could steer _you_ towards a more-legal 
method of obtaining the software, so your soul wouldn't be 
burdened with the heinous crime of abandonware piracy, my son. 
I've never even owned a C64. :)

> 
> I dunno.  In most ways, I don't believe there is such a thing as
> obsolescence... but I do believe that other people believe that there
> is.  If they want to abandon old software without relaxing copyright on
> it, that's fine, but they have to realize that it becomes not much more
> than a formality if they don't have the resources to enforce it.  And a
> formality isn't going to dissuade anyone who's determined to obtain it.

Yeah, I'll give you that. I would love to see more companies 
stating a common-sense IP policy. Example: Ani DiFranco records 
on her own family-run Righteous Babe label. Her CDs all come 
with the following statement: "Unauthorized reproduction, while
sometimes necessary, is never as good as the real thing." This
is just beautiful. It works just as well as "...is prohibited
by law," but has the added feature of demonstrating some sort 
of connection with reality, of some respect for the person 
reading the warning. 

I was going to compose an Estarcion Media License for if/when I 
make music good enough to sell (hah), defining in excruciating 
detail what sort of reproduction I considered acceptable. Given 
all the possible analog and digital representations of music, it 
would have been absurdly long and dull. I may just use the Ani 
License. 

> Well, the "good neighbours" thing applies here, too, or at least it
> should.  If Paramount explicitly tells people "fanart is OK," then they
> would theoretically be duly rewarded, and this would overall profit for
> them and their community. 

Paramount's strategy seems to be simply to put out more and 
crappier Star Trek stuff than the fan community has the resources
to produce, thereby collecting money from the fan community
so they don't have any left to buy fanart. :)

-R

[1] Members Of The Appropriate Sex


------------------------------

Date: Thu, 5 Jul 2001 09:37:48 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: re: intellectual property


[ Using "Reply to all" in Pine, I got
  To: Russel Bornschlegel
  CC: misc@esoteric.sange.fi

  I've just always been manually deleting the To: and moving the CC:
  there. ]

On Wed, 4 Jul 2001, Russell Bornschlegel wrote:

>
> > Many, many companies are VERY reluctant to use software they perceive as
> > "too free" because it goes against their economic sensibilities.  This
> > is the case even when the free software is undeniably superior to what
> > they're currently using. 
> 
> I wonder how many companies are using free software and don't 
> realize it. Companies aren't monoliths any more than governments 
> are. I can grab perl and use it and there's no need to notify 
> my manager, let alone purchasing and accounting. Think anyone 
> at Microsoft uses perl?

Companies are reluctant to use free software, because it usually isn't
supported by an organization. "No warranty" is scary if there's a bug that
won't let them do whatever they want to do after they've written 90 % of
whatever they want to do. Or support... if something doesn't work, they
don't know how to do something, there's no commercial support line
available. Then there's of course the problem of the free software
sometimes requiring its output to be free as well, which I believe is the
case with GCC. (Bison and Flex I think allow people to do whatever they
want with generated code.)

Other than that, who knows what companies use what free software?

The reason Perl and Linux are used commercially so much is that they are
a) marketed quite well, i.e. are a "buzzword" in relation to eBusiness
b) there are lots of books available
c) they can get commercial support (from vendors, etc.)

GNU wants Linux to be called GNU/Linux... how about 'Linux' in relation to
eBuiseness uses and 'GNU/Linux' in relation to the open-source
programmer/idealist/hobbyist community that surrounds GNU/Linux?

> 
> -R
> 

Markus
--
Time to get rid of some quotes :-)

'An operating system is just a name you give the features you left out
of your editor.'                       -- Per Abrahamsen in comp.emacs



------------------------------

Date: Thu, 5 Jul 2001 18:30:51 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] [BF] Common Repository


There doesn't seem to be a BF repository. I know this has been suggested
several times, but I was thinking in terms of having a Wiki.

It would make it a lot easier for anyone to add their interpreter,
compiler, text, bf program, link, whatever and anyone could post ideas.

A simple FTP repository wouldn't be bad, either.

Or maybe a Common Brainfuck Archive Network.

There's plenty of possibilities... does someone have a server they can use
for this? (Panu, can you set up something on esoteric.sange.fi?)

Markus





------------------------------

Date: Thu, 05 Jul 2001 11:24:43 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: intellectual property (was Re: various)

I'm not trying to start an oslic war here, so I'll try to skip the minor
details and get to the heart of the matter...

"markus.kliegl" wrote:
> On Wed, 4 Jul 2001, Chris Pressey wrote:
> > "markus.kliegl" wrote: [...]
> > See, that's just idiotic.  Especially considering it's *L*GPL, that's
> > supposed to relieve problems like this.
> I don't know why the LGPL exists.

My understanding is that it exists because of the 'virulent' nature of
the GPL.  If the code in, say, gcc's crt1.o was GPL'ed, then every C
program compiled with gcc would (apparently) suddenly become GPL'ed too.

> It goes against the philosophical ideal
> of the FSF and still isn't all too helpful, but I'm not one to decide
> that.

It's pretty silly that they simultaneously provide the LGPL and
discourage it's use.  If they're serious about their philosophy, then
why not just refuse to make an "L" version of their license, and tell
everyone who uses gcc to just "put up and shut up?"

> > "If you develop a new program, and you want it to be of the *greatest*
> > possible use to the public, the *best* way to achieve this is to make it
> > free software which everyone can redistribute and change under *these*
> No, not "of the greatest use to the public", but "of the greatest use to
> those that play along and *only* those that play along",

That's what I don't like.  Don't confuse the two.  That's no better than
Microso~1.

The point I'm trying to make here is that BSD is "freer" than GPL
largely because it doesn't suffer under any such philosophical pretense
that everyone feels the same way the FSF does.

> which leads back
> to the philosophical ideal, which I approve of.

And I think it's silly in it's idealism.  Open source is about
licensing, not philosophy.

Try searching www.fsf.org for "manifesto" (eight pages.)  Try searching
www.freebsd.org for "manifesto" (no documents.)

> > > So please, go on with your "utterly silly" rant... but give me an example
> > > where you actually had a problem.
> I was asking for a problem you had with using GPL'd software, not what
> you find utterly silly about the text of the license.

I wasn't trying to say that I have a problem using GPL'd software, I
hope I didn't give you that impression.  I was trying to say that the
license, moreso the philosophy, strikes me as a silly way to go about
it.

> > "Also add information on how to contact you by electronic and paper
> > mail."
> > Mmm hmm, right, paper mail.  I see the author's home address on a *lot*
> > of free software, I do I do :)
> That's in the 'Appendix: How to Apply These Terms to Your New Programs'.
> So it's more of a guideline.

If you have a license, why do you need guidelines too?  To me, it just
runs the danger of people confusing the two.  When you put
legally-binding rules together with non-legally-binding suggestions,
you're sending an inconsistent message.

> > Well, dual licenses are their own cup of stew.  I have no idea how
> > that's supposed to work, legally.  Apparently nothing is stopping me
> > from putting two (quite possibly mutually contradictory) licenses on a
> > program, hell, why not put it under ALL the licenses listed at
> > http://www.opensource.org/licenses/ , that would sure confuse the hell
> > out of the lawyers wouldn't it :)
> It works by giving people the option of using the software under either
> the conditions of license 1 or license 2, not a mix of both or anything
> like that. Sure, put a piece of software under all those licenses, I'm
> sure it wouldn't confuse lawyers, exactly because it's like the same piece
> of software distributed in 10 different versions, each with a different
> license.

Oh... so if I choose to look at Perl as being GPL'ed, I can assume
artistic control if I like?  While that strikes me as probably true... I
have the impression Mr. Wall doesn't look at it that way...

> > So, I like putting stuff under the *BSD* license for the sake of
> > simplicity.  It does "the same thing" as the GPL, but:
> > - it's way shorter
> > - it avoids the "you should have received a copy" problem entirely
> > - it's written in legal language instead of the vague idealistic prattle
> > found in the GPL and the Artistic license
> It doesn't do the same thing. Someone can take the software and relicense
> it... [...]
> Thus the software can be used in proprietary products... this is
> completely contradictory of the GNU ideal.

Yeah, but what's *wrong* with it?  If someone makes a proprietary
version of gcc, how does that hurt the "community"?

> > I mean, face it, if you hired a lawyer to come up with a license for
> > your product, and what they gave you looked like the GPL or the Artistic
> > license... would *you* pay the guy? :)
> >From a legal standpoint the GPL has been checked by several lawyers. The
> whole point of the FSF being founded (it's an official organization) was
> to protect software and sue any companies trying to steal any of it.

Not unlike Microso~1.

> Which license to use depends on your philosophy. Saying that one license
> is "utterly silly" (why, actually? You don't like the wording?) is utterly
> silly :-)

I never claimed it wasn't :)

To me it looks like the FSF is, well, at war with proprietary software
(and by extension for-profit software) out of idealistic notions and the
assumption that "if it's proprietary, it must necessarily be evil"...

Whereas I don't see how that's the case.

Chris

-- 
This sentence will self-destruct in five... four... three... Tuesday...


------------------------------

Date: Thu, 05 Jul 2001 09:36:38 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: intellectual property

Markus Kliegl wrote:
> 
> [ Using "Reply to all" in Pine, I got
>   To: Russel Bornschlegel
>   CC: misc@esoteric.sange.fi
> 
>   I've just always been manually deleting the To: and moving the CC:
>   there. ]

I get the same result when I remember to reply-to-all; my trouble 
is that I'm trained to not hit reply-to-all by another mailing 
list that I'm involved in which is intended as a one-to-many 
communication. There, reply-to-all is the Wrong Thing, and other 
people's careless use of reply-to-all has started flamewars and 
embarrassed people. My problem, I know, but there you have it.
 
> Then there's of course the problem of the free software
> sometimes requiring its output to be free as well, which I believe is the
> case with GCC. (Bison and Flex I think allow people to do whatever they
> want with generated code.)

I don't believe that's the case with gcc. I've used gcc for game 
development in the past, with support from Cygnus arranged through
Sega of America. Believe me, there have been times when I've 
wished I could point at something like a licensing issue to avoid 
having to use it... :) 

Can anyone here cite a license that explicitly says that program 
output is covered by the same license as the program itself?

> GNU wants Linux to be called GNU/Linux... how about 'Linux' in relation to
> eBuiseness uses and 'GNU/Linux' in relation to the open-source
> programmer/idealist/hobbyist community that surrounds GNU/Linux?

Okay, this is one of _my_ hot button issues. Does the GPL address
naming? Is there anything in the license which prevents one from 
messing with some internal details of the Linux kernel and re-
releasing the product as "Foonix", "Narcissux", or "I Am Jack's 
Operating System"? If not, then GNU can release their own damn 
distribution, and call it GNU/Linux or LiGNUx or GNUX -- or 
GNU/Hurd for that matter. But if it isn't in the license, don't
even try to tell me what I can call _my_ product.

-R


------------------------------

Date: Thu, 5 Jul 2001 10:39:48 -0600 (MDT)
From: Ben Olmstead <bolmstea@Mines.EDU>
Subject: Re: GEB (was Re: number-o-mania...)

On Sat, 23 Jun 2001, Russell Bornschlegel wrote:

Sorry for how late this is; I've been on an actual vacation for the past
week and a half.

> Chris Pressey wrote:
>
> > I didn't really like it enough to read the whole thing... kind of geeky
> > for my taste.  It confirmed what I didn't really like about his style.
> > Too much awe, not enough whimsey.
>
> I don't believe I've actually read the whole book, but I have read
> bits and pieces of it over and over and over. Certainly it's not
> flawless, but it did introduce me to a lot of then-new-to-me ideas
> when I started trying to read it years-n-years ago.

Ironically, I just picked it up and read it during my vacation (well, I
read about the first third, skimmed the second third, and skipped the
last third).  My impression of the book was that the first half was
trying to explore/explain the ramifications of self-reference, while the
second half was simply trying to apply the first half to the question of
'Is true AI possible?'.

I also was talking to a friend of mine who is basically of geek of
anatomy and geology.  (As opposed to a geek of computer science, like
me.)  She had a very difficult time getting through even the first few
pages, just because she had never really thought about self-reference; I
suspect these kinds of thoughts are a mathematics/comp sci thing, and
not that many people overall have actually thought about it.

                                          Ben Olmstead
                                          bem@mad.scientist.com

Inertia: Simple.  Addictive.  Free.
http://www.mines.edu/students/b/bolmstea/games/inertia/



------------------------------

Date: Thu, 05 Jul 2001 11:38:42 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: intellectual property

Markus Kliegl wrote:
> On Wed, 4 Jul 2001, Russell Bornschlegel wrote:
> > > Many, many companies are VERY reluctant to use software they perceive as
> > > "too free" because it goes against their economic sensibilities.  This
> > > is the case even when the free software is undeniably superior to what
> > > they're currently using.
> > I wonder how many companies are using free software and don't
> > realize it. Companies aren't monoliths any more than governments
> > are. I can grab perl and use it and there's no need to notify
> > my manager, let alone purchasing and accounting. Think anyone
> > at Microsoft uses perl?

Well, certainly yes in the sense that MS is (last i heard) trying to
assimilate "every known programming language" into it's VM/C# thingy. 
But I assume you mean beyond that, and the answer is probably still yes,
'cos it's a really useful rapid-development-gluing-scripting language.

But I was referring less to software companies and moreso to companies
that have a significant technological investment: insurance, telephony,
and such.

> Companies are reluctant to use free software, because it usually isn't
> supported by an organization. "No warranty" is scary if there's a bug that
> won't let them do whatever they want to do after they've written 90 % of
> whatever they want to do.

I have yet to see a commercial software product that comes with a
warranty.

> Or support... if something doesn't work, they
> don't know how to do something, there's no commercial support line
> available.

Even when there is... Gerson can attest to how useful it is, I'm sure
:)  Seriously, a support line is largely a security blanket.  One of
those corporate things that makes other corporate things feel
comfortable... just because most corporations don't recognize (say) the
FreeBSD-questions mailing list as a support line, doesn't mean it
doesn't provide as good or better support than some toll-free number.

> Then there's of course the problem of the free software
> sometimes requiring its output to be free as well, which I believe is the
> case with GCC.

Not when the c-libraries are LGPL'ed.  Which, last I checked, they are. 
IIRC that was the reason for making the LGPL in the first place.

> Other than that, who knows what companies use what free software?

I can only speak for companies I've seen locally that don't.  Or at
least, their attitude of reluctance.

> GNU wants Linux to be called GNU/Linux... how about 'Linux' in relation to
> eBuiseness uses and 'GNU/Linux' in relation to the open-source
> programmer/idealist/hobbyist community that surrounds GNU/Linux?

How about whatever Linus Torvalds damn well pleases to call it?  He's
the guy who owns it, after all.

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Thu, 05 Jul 2001 18:25:14 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: intellectual property (was Re: various)

At 11:24  05/07/2001 -0500, Chris Pressey wrote:

>The point I'm trying to make here is that BSD is "freer" than GPL
>largely because it doesn't suffer under any such philosophical pretense
>that everyone feels the same way the FSF does.

The BSD licence is freer, no doubt. It's also a licence for angels, the 
same way as communism is a political system for angels. Both things have a 
flaw -- the don't fit in with human nature and require people to act like 
angels for them to work.

The GPL and LGPL, for all their flaws, are more pragmatic. They don't 
presume that people are angels. This is why, even though dictatorships are 
the most efficent system of government, we live in democracies -- you can't 
be assured that your dictator will be benevolent (an angel) or malevolent 
(a devil).

The GPL's pragmatism comes from how it gives up some of the freedom to make 
sure it stays free. We could live under efficient dictatorships, but we 
choose not to because in an inefficent democracy you're somewhat assured 
that you won't be able to be pushed around by a despot.

The BSD licence is a licence of a perfect world. This is not a perfect 
world. That's the advantage of the GPL. Cut away all the philosophical 
pretense and that's what you're left with.

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Thu, 05 Jul 2001 18:44:20 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: re: intellectual property

At 09:37  05/07/2001 +0200, Markus Kliegl wrote:
>Companies are reluctant to use free software, because it usually isn't
>supported by an organization. "No warranty" is scary if there's a bug that
>won't let them do whatever they want to do after they've written 90 % of
>whatever they want to do.

It's worth noting that virtually all software is provided without warranty. 
It's not just something which occurs in Free Software.

>Then there's of course the problem of the free software
>sometimes requiring its output to be free as well, which I believe is the
>case with GCC. (Bison and Flex I think allow people to do whatever they
>want with generated code.)

That's why there's licences like the LGPL (so that the likes of Bison, 
which needs to have  specific libraries attached to use it's output) exist.

As a sidenote, the output of a program is never covered by the licence of 
the generating software, that's why you could write as much proprietary 
software as you wanted, using gcc as your compiler. If this was not the 
case, every MSWord file on the planet would be covered by a MS EULA -- 
scary! Software is a process, not it's input or output.

>Other than that, who knows what companies use what free software?
>
>The reason Perl and Linux are used commercially so much is that they are
>a) marketed quite well, i.e. are a "buzzword" in relation to eBusiness
>b) there are lots of books available
>c) they can get commercial support (from vendors, etc.)

Don't forget Apache!


>GNU wants Linux to be called GNU/Linux... how about 'Linux' in relation to
>eBuiseness uses and 'GNU/Linux' in relation to the open-source
>programmer/idealist/hobbyist community that surrounds GNU/Linux?

Hmmm... ugly. The kernel is called Linux, the GNU part is just bundled 
software. There's much more than the GPL'd software in there, remember.

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Thu, 05 Jul 2001 19:18:00 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: intellectual property (was Re: various)

I think this should have gone to the list...

At 11:02  05/07/2001 -0700, Brian Connors wrote:

>--- Keith Gaughan <keith@digital-crew.com> wrote:
> > At 11:24  05/07/2001 -0500, Chris Pressey wrote:
> >
> > >The point I'm trying to make here is that BSD is
> > "freer" than GPL
> > >largely because it doesn't suffer under any such
> > philosophical pretense
> > >that everyone feels the same way the FSF does.
> >
> > The BSD licence is freer, no doubt. It's also a
> > licence for angels, the
> > same way as communism is a political system for
> > angels. Both things have a
> > flaw -- the don't fit in with human nature and
> > require people to act like
> > angels for them to work.
>
>I don't see the BSD license as having been concieved
>with any particular ideals at all, actually.

The BSD licence predates the GPL, the FSF and the OSI. It's essentially a 
college licence. The need for people to be angels only arose when the 
copyright clause was removed. By itself, code released under the the BSD 
licence (note that I like the BSD licence and wish I could always use it) 
isn't protected from individuals and groups who wish to take the code as 
their own. This is it's flaw.

The GPL seeks to correct this flaw by including terms which oblige those 
who change code covered by the GPL to release the source code of any 
changed versions to the public if these changed versions are distributed. 
This ensures that nobody can take code written under the GPL and make it 
proprietary. That's what makes it more pragmatic.

>The way
>it's written, it simply asks that credit be given
>where credit is due, and chooses to leave well enough
>alone otherwise. Anyone arguing BSD licensing from a
>moral standpoint higher than that is missing the
>point.

I'm not arguing from a moral POV, I'm just saying that if one releases 
software under the BSD licence and expects it to remain Free, then one is 
presuming that people act like angels.

> > The GPL and LGPL, for all their flaws, are more
> > pragmatic. They don't
> > presume that people are angels. This is why, even
> > though dictatorships are
> > the most efficent system of government, we live in
> > democracies -- you can't
> > be assured that your dictator will be benevolent (an
> > angel) or malevolent
> > (a devil).
>
>This is entirely true -- the GPL is an entirely
>different animal from the BSD license for precisely
>that reason.
>
> > The GPL's pragmatism comes from how it gives up some
> > of the freedom to make
> > sure it stays free. We could live under efficient
> > dictatorships, but we
> > choose not to because in an inefficent democracy
> > you're somewhat assured
> > that you won't be able to be pushed around by a
> > despot.
> >
> > The BSD licence is a licence of a perfect world.
> > This is not a perfect
> > world. That's the advantage of the GPL. Cut away all
> > the philosophical
> > pretense and that's what you're left with.
>
>I personally favor MozPL/NPL because MozPL/NPL gives
>me privileges as the creator of the work that maybe I
>don't want extended to others using it (in other
>words, you're free to use my toys in any way you want
>as long as you don't lock things up, but I'm not bound
>by the same rules nyah nyah nyah). (I consider it a
>CYA policy in case I ever have to pull some code out
>of, say, var'aq for a consulting project.) I am not,
>however, inherently averse to the GPL -- I'm more than
>happy to slap GPL on anything I feel is too important
>to be locked up by anybody (not that I've ever written
>anything quite that earthshattering).


K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Thu, 05 Jul 2001 19:25:16 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: IRC Channel

It just popped into my head -- wouldn't it be great if we had an IRC channel...

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

From: Steve Mosher <goat@isn.net>
Subject: Re: IRC Channel
Date: Thu, 5 Jul 2001 15:38:38 -0300

On Thu, 05 Jul 2001, Keith Gaughan pressed some keys and this came out:
> It just popped into my head -- wouldn't it be great if we had an IRC channel...
> 
> K.
> 
> -- 
> Keith Gaughan <keith@digital-crew.com>
> Software Developer, Digital Crew Ltd.
> Take off every '.sig'!!

	That would be neat. It would be even neater if it were on slashnet,
'cause that's the IRC network I use (because #kuro5hin is there.) ;)

-- 
Steve Mosher,
Mad Scientist

Be brave, all must face their soul, but keep the mirror close to the youth.
Sometimes, the other becomes insane, you must keep the clarity close to the friend of strength.



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: Google 4 language HAXORS
Date: Thu, 5 Jul 2001 20:51:07 +0100

Try out the language box on the google preferences page
(http://www.google.com/preferences). Includes the languages

- Hacker
- Bork ! Bork ! Bork !
- Elmer Fudd
- Tagalog (I think Intercal knows this one, too)




------------------------------

From: "Chris Pressey" <cpressey@catseye.mb.ca>
Subject: Re: intellectual property (was Re: various)
Date: Thu, 5 Jul 2001 13:53:38 -0500

Keith Gaughan wrote:
>The BSD licence predates the GPL, the FSF and the OSI. It's essentially a
>college licence. The need for people to be angels only arose when the
>copyright clause was removed.

I'm not sure what you mean by that.  All BSD-licensed software (in fact all
O.S.S.) is copyrighted.  The only thing rescinded about the BSD license was
the advertising clause.

>By itself, code released under the the BSD
>licence (note that I like the BSD licence and wish I could always use it)
>isn't protected from individuals and groups who wish to take the code as
>their own. This is it's flaw.

How is this a flaw?

>I'm not arguing from a moral POV, I'm just saying that if one releases
>software under the BSD licence and expects it to remain Free,

If someone copies a BSD-licensed product, relicenses it, and sells it as
proprietary software, that doesn't affect the original product.  The
original product remains free.

>then one is
>presuming that people act like angels.

Just curious... if you're not talking about morals, then why the Christian
terminology?

Chris







------------------------------

Date: Thu, 05 Jul 2001 20:33:40 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: intellectual property (was Re: various)

At 01:53  05/07/2001 -0500, Chris Pressey wrote:
>Keith Gaughan wrote:
> >The BSD licence predates the GPL, the FSF and the OSI. It's essentially a
> >college licence. The need for people to be angels only arose when the
> >copyright clause was removed.
>
>I'm not sure what you mean by that.  All BSD-licensed software (in fact all
>O.S.S.) is copyrighted.  The only thing rescinded about the BSD license was
>the advertising clause.

Um, that's sort of what I meant. I said that because the original licence 
stated that that Berkeley had copyright on the software.

> >By itself, code released under the the BSD
> >licence (note that I like the BSD licence and wish I could always use it)
> >isn't protected from individuals and groups who wish to take the code as
> >their own. This is it's flaw.
>
>How is this a flaw?

It's a flaw if you don't want the code to be made proprietary.

> >I'm not arguing from a moral POV, I'm just saying that if one releases
> >software under the BSD licence and expects it to remain Free,
>
>If someone copies a BSD-licensed product, relicenses it, and sells it as
>proprietary software, that doesn't affect the original product.  The
>original product remains free.

But the original product doesn't benefit from this and it also introduces a 
fork, which isn't healthy. The Free Software can't avail from any 
improvements in the proprietary software, but the proprietary software can 
sponge off improvements to the Free one.

> >then one is
> >presuming that people act like angels.
>
>Just curious... if you're not talking about morals, then why the Christian
>terminology?

I'm not talking about morality at all. I'm using the word 'angel' to refer 
to a behaviour pattern that people just don't have--being nice all the time 
& not taking advantage of others. We've all been stung by this enough to 
know that 'angels' like this don't exist. The supposed 
Judeochristian/Islamic/Blah-de-blah terminology was used because it has 
other meanings besides denoting a lesser kind of divine being.

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Thu, 05 Jul 2001 20:49:45 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: intellectual property (was Re: various)

If you want a licence which is even more free than the BSD licence, take a 
look at the one Peter Hartley uses for his software: 
http://www.chaos.org.uk/~pdh/software/

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Thu, 5 Jul 2001 23:24:26 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: Re: intellectual property



On Thu, 5 Jul 2001, Russell Bornschlegel wrote:

> Markus Kliegl wrote:
>  
> > Then there's of course the problem of the free software
> > sometimes requiring its output to be free as well, which I believe is the
> > case with GCC. (Bison and Flex I think allow people to do whatever they
> > want with generated code.)
> 
> I don't believe that's the case with gcc. I've used gcc for game 
> development in the past, with support from Cygnus arranged through
> Sega of America. Believe me, there have been times when I've 
> wished I could point at something like a licensing issue to avoid 
> having to use it... :) 

I think I confused something here, but I'm sure I remember having read
something about bison explicitly having to allow unrestricted use of code
generated by it.

> 
> Can anyone here cite a license that explicitly says that program 
> output is covered by the same license as the program itself?

From the GPL:
'The act of running the Program is not restricted, and the output from the
Program is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program). Whether
that is true depends on what the Program does.'

Which seems very ambiguous to me.

> 
> > GNU wants Linux to be called GNU/Linux... how about 'Linux' in relation to
> > eBuiseness uses and 'GNU/Linux' in relation to the open-source
> > programmer/idealist/hobbyist community that surrounds GNU/Linux?
> 
> Okay, this is one of _my_ hot button issues. Does the GPL address
> naming? Is there anything in the license which prevents one from 
> messing with some internal details of the Linux kernel and re-
> releasing the product as "Foonix", "Narcissux", or "I Am Jack's 
> Operating System"? If not, then GNU can release their own damn 
> distribution, and call it GNU/Linux or LiGNUx or GNUX -- or 
> GNU/Hurd for that matter. But if it isn't in the license, don't
> even try to tell me what I can call _my_ product.

I was trying to point out the differences between the two communities that
surround Linux (the programmers/open-source idealists and the "be
pragmatic and use this Linux software for our business" people).

> 
> -R
> 

Markus



------------------------------

Date: Thu, 5 Jul 2001 23:49:48 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: Re: intellectual property (was Re: various)


On Thu, 5 Jul 2001, Chris Pressey wrote:

> "markus.kliegl" wrote:
> > On Wed, 4 Jul 2001, Chris Pressey wrote:
> > > "markus.kliegl" wrote: [...]
> > > See, that's just idiotic.  Especially considering it's *L*GPL, that's
> > > supposed to relieve problems like this.
> > I don't know why the LGPL exists.
> 
> My understanding is that it exists because of the 'virulent' nature of
> the GPL.  If the code in, say, gcc's crt1.o was GPL'ed, then every C
> program compiled with gcc would (apparently) suddenly become GPL'ed too.

I just saw this:
http://www.gnu.org/copyleft/gpl-faq.html#TOCCanIUseGPLToolsForNF

It explains the bison thing, too.

> 
> > It goes against the philosophical ideal
> > of the FSF and still isn't all too helpful, but I'm not one to decide
> > that.
> 
> It's pretty silly that they simultaneously provide the LGPL and
> discourage it's use.  If they're serious about their philosophy, then
> why not just refuse to make an "L" version of their license, and tell
> everyone who uses gcc to just "put up and shut up?"

Agreed. If they're going to make compromises that hurt the ideal like
that, why not get rid of all of those restrictions causing problems?

> 
> > > "If you develop a new program, and you want it to be of the *greatest*
> > > possible use to the public, the *best* way to achieve this is to make it
> > > free software which everyone can redistribute and change under *these*
> > No, not "of the greatest use to the public", but "of the greatest use to
> > those that play along and *only* those that play along",
> 
> That's what I don't like.  Don't confuse the two.  That's no better than
> Microso~1.

I think that would be Micros~1 :-)

I can't see where you draw up the connection to Microsoft.

> 
> The point I'm trying to make here is that BSD is "freer" than GPL
> largely because it doesn't suffer under any such philosophical pretense
> that everyone feels the same way the FSF does.

The way I understand the BSD license, it's a sort of public-domain
with the addition of the software being copyrighted and the requirement of
mentioning that it's copyrighted. Sort of like: "Do what you want, but
give me credit".

> 
> > which leads back
> > to the philosophical ideal, which I approve of.
> 
> And I think it's silly in it's idealism.  Open source is about
> licensing, not philosophy.

I look at it the other way around: Open-source is about philosophy
concerning what software is like. The licenses are what we use to ensure
our philosophy in relation to _our_ work, i.e. _our_ work, which we decide
should follow this philosophy.

Pragmatic vs. Pure

BSD       vs. GPL
ML        vs. Haskell
Prolog    vs. Mercury
Common Lisp vs. Scheme (well, sort of)

> > > > So please, go on with your "utterly silly" rant... but give me an example
> > > > where you actually had a problem.
> > I was asking for a problem you had with using GPL'd software, not what
> > you find utterly silly about the text of the license.
> 
> I wasn't trying to say that I have a problem using GPL'd software, I
> hope I didn't give you that impression.  I was trying to say that the
> license, moreso the philosophy, strikes me as a silly way to go about
> it.
> 
> > > "Also add information on how to contact you by electronic and paper
> > > mail."
> > > Mmm hmm, right, paper mail.  I see the author's home address on a *lot*
> > > of free software, I do I do :)
> > That's in the 'Appendix: How to Apply These Terms to Your New Programs'.
> > So it's more of a guideline.
> 
> If you have a license, why do you need guidelines too?  To me, it just
> runs the danger of people confusing the two.  When you put
> legally-binding rules together with non-legally-binding suggestions,
> you're sending an inconsistent message.

It's guidelines on what to do if you want to be absolutely sure your
software is safe.

> > > So, I like putting stuff under the *BSD* license for the sake of
> > > simplicity.  It does "the same thing" as the GPL, but:
> > > - it's way shorter
> > > - it avoids the "you should have received a copy" problem entirely
> > > - it's written in legal language instead of the vague idealistic prattle
> > > found in the GPL and the Artistic license
> > It doesn't do the same thing. Someone can take the software and relicense
> > it... [...]
> > Thus the software can be used in proprietary products... this is
> > completely contradictory of the GNU ideal.
> 
> Yeah, but what's *wrong* with it?  If someone makes a proprietary
> version of gcc, how does that hurt the "community"?

Making a verbatim proprietary copy of something wouldn't make much sense.
The software will get modified and if it's proprietary the original
software doesn't get anything in return for allowing you to use and
modify, improve, etc. it.

> 
> > > I mean, face it, if you hired a lawyer to come up with a license for
> > > your product, and what they gave you looked like the GPL or the Artistic
> > > license... would *you* pay the guy? :)
> > >From a legal standpoint the GPL has been checked by several lawyers. The
> > whole point of the FSF being founded (it's an official organization) was
> > to protect software and sue any companies trying to steal any of it.
> 
> Not unlike Microso~1.

Let me rephrase: "to protect the software from losing the philosophy under
which it was intended to be".

> 
> Chris
> 
> -- 
> This sentence will self-destruct in five... four... three... Tuesday...
> 
> 

Markus



------------------------------

Date: Thu, 05 Jul 2001 23:54:23 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: intellectual property (was Re: various)

At 11:49  05/07/2001 +0200, Markus Kliegl wrote:
>Pragmatic vs. Pure
>
>BSD       vs. GPL

My god, no! That's backwards! The BSD licence is the pure licence. The GPL 
has clauses in it to make sure the software stays Free. The BSD licence is 
the licence of idealists, but this kind of idealism belies a certain 
naivety, but only if you want your code to stay Free. On the other hand, 
the GPL is a *puritan* licence. It demands that the code covered by it 
stays free. It's pragmatic because it requires a certain loss of freedom 
(the freedom to make the code proprietary) in order to keep it free.

Granted, the GPL is too complicated. It could be vastly simplified. My 
perfect licence would be one based on the BSD licence which required that 
changes be released back to the public in the form of source, just as the 
GPL does. I wouldn't use it for everything, but I'd use this for software 
which I'd usually put under the GPL.

You know, the Nokia licence is quite a nice one. It's worth a look if you 
don't like the others.

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.
Take off every '.sig'!!



------------------------------

Date: Thu, 5 Jul 2001 21:15:18 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: [lang] Re: [BF] Common Repository


Yes I would really love this!

I have lots of BF code just hanging out, some of it doesnt have proper
credit tho :(  I just surfed around one day and saved everything I could
find

It would also be great include interpreters and compilers too.

Jeff



On Thu, 5 Jul 2001, Markus Kliegl wrote:

>
> There doesn't seem to be a BF repository. I know this has been suggested
> several times, but I was thinking in terms of having a Wiki.
>
> It would make it a lot easier for anyone to add their interpreter,
> compiler, text, bf program, link, whatever and anyone could post ideas.
>
> A simple FTP repository wouldn't be bad, either.
>
> Or maybe a Common Brainfuck Archive Network.
>
> There's plenty of possibilities... does someone have a server they can use
> for this? (Panu, can you set up something on esoteric.sange.fi?)
>
> Markus
>
>
>
>
>





------------------------------

Date: Thu, 5 Jul 2001 21:31:39 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: IRC Channel


Yes!

I recommend EFNet.. its a large group of servers, which means a better
possiblity of getting on quickly.

I'll start hanging out on EFNet #esolang in the evenings

Some EFNet servers (more at www.efnet.org):
irc.prison.net
irc.ins.net.uk
irc.solidstreaming.net
irc.east.gblx.net
irc.mcs.net
irc.mindspring.com
irc.plur.net
irc.emory.edu
irc.light.se

Jeff (calamari)


On Thu, 5 Jul 2001, Keith Gaughan wrote:

> It just popped into my head -- wouldn't it be great if we had an IRC channel...
>
> K.
>
> --
> Keith Gaughan <keith@digital-crew.com>
> Software Developer, Digital Crew Ltd.
> Take off every '.sig'!!
>
>
>



------------------------------

Date: Thu, 05 Jul 2001 21:57:27 -0700
From: Robert <nrobert@pacbell.net>
Subject: Re: IRC Channel

I'd not recommend EFnet...it's very unstable, too many netsplits per day to
count.
The summer makes it even worse.  I can brag to my friends that I've been
connected to Emory for over 24 hours (that hasn't happened on any irc server
on efnet for months now with most of us)
IRCnet or undernet would be a better choice, since they are far more stable.
IRCnet most likely won't be a choice since it doesn't really have American
servers (I connect to a Japanese one)
So I'd recommend Undernet...we have a network but it has like 20 users so I
figure that wouldn't be a place you'd want to go to hahaha.
*kicks efnet* packeters take all the fun out of it hehe.
Robert

(Most of those efnet servers won't just let anyone on.)
----- Original Message -----
From: "Jeff Johnston" <jeffryj@azstarnet.com>
To: "Keith Gaughan" <keith@digital-crew.com>
Cc: <misc@esoteric.sange.fi>
Sent: Thursday, July 05, 2001 9:31 PM
Subject: Re: IRC Channel


>
> Yes!
>
> I recommend EFNet.. its a large group of servers, which means a better
> possiblity of getting on quickly.
>
> I'll start hanging out on EFNet #esolang in the evenings
>
> Some EFNet servers (more at www.efnet.org):
> irc.prison.net
> irc.ins.net.uk
> irc.solidstreaming.net
> irc.east.gblx.net
> irc.mcs.net
> irc.mindspring.com
> irc.plur.net
> irc.emory.edu
> irc.light.se
>
> Jeff (calamari)
>
>
> On Thu, 5 Jul 2001, Keith Gaughan wrote:
>
> > It just popped into my head -- wouldn't it be great if we had an IRC
channel...
> >
> > K.
> >
> > --
> > Keith Gaughan <keith@digital-crew.com>
> > Software Developer, Digital Crew Ltd.
> > Take off every '.sig'!!
> >
> >
> >
>
>
>



------------------------------

Date: Thu, 5 Jul 2001 22:04:29 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: IRC Channel



Just been on undernet for a few months.. its just as bad as efnet, and the
servers never let you on :)

But yeah either one.. lets choose one and go with it.

Jeff, now on undernet #esolang too, but no one's there! (irc.undernet.org)


On Thu, 5 Jul 2001, Robert wrote:

> I'd not recommend EFnet...it's very unstable, too many netsplits per day to
> count.
> The summer makes it even worse.  I can brag to my friends that I've been
> connected to Emory for over 24 hours (that hasn't happened on any irc server
> on efnet for months now with most of us)
> IRCnet or undernet would be a better choice, since they are far more stable.
> IRCnet most likely won't be a choice since it doesn't really have American
> servers (I connect to a Japanese one)
> So I'd recommend Undernet...we have a network but it has like 20 users so I
> figure that wouldn't be a place you'd want to go to hahaha.
> *kicks efnet* packeters take all the fun out of it hehe.
> Robert
>
> (Most of those efnet servers won't just let anyone on.)
> ----- Original Message -----
> From: "Jeff Johnston" <jeffryj@azstarnet.com>
> To: "Keith Gaughan" <keith@digital-crew.com>
> Cc: <misc@esoteric.sange.fi>
> Sent: Thursday, July 05, 2001 9:31 PM
> Subject: Re: IRC Channel
>
>
> >
> > Yes!
> >
> > I recommend EFNet.. its a large group of servers, which means a better
> > possiblity of getting on quickly.
> >
> > I'll start hanging out on EFNet #esolang in the evenings
> >
> > Some EFNet servers (more at www.efnet.org):
> > irc.prison.net
> > irc.ins.net.uk
> > irc.solidstreaming.net
> > irc.east.gblx.net
> > irc.mcs.net
> > irc.mindspring.com
> > irc.plur.net
> > irc.emory.edu
> > irc.light.se
> >
> > Jeff (calamari)
> >
> >
> > On Thu, 5 Jul 2001, Keith Gaughan wrote:
> >
> > > It just popped into my head -- wouldn't it be great if we had an IRC
> channel...
> > >
> > > K.
> > >
> > > --
> > > Keith Gaughan <keith@digital-crew.com>
> > > Software Developer, Digital Crew Ltd.
> > > Take off every '.sig'!!
> > >
> > >
> > >
> >
> >
> >
>
>
>



------------------------------

Date: Thu, 05 Jul 2001 22:23:41 -0700
From: Robert <nrobert@pacbell.net>
Subject: RE: IRC Channel


That's why I like IRCnet hehe
Only one problem with that network, you cannot /list on any server really.
It has more clients then efnet though...
Most irc networks have gone to hell, wonder if M$ and Aol could be up to it to promote their messenger clients </joking>
Robert


------------------------------

Date: Fri, 06 Jul 2001 09:37:46 +0200
From: =?iso-8859-1?Q?Fr=E9d=E9ric?= van der Plancke <fvdp@decis.be>
Subject: Re: Google 4 language HAXORS



Gerson Kurz wrote:
> 
> Try out the language box on the google preferences page
> (http://www.google.com/preferences). Includes the languages
> 
> - Hacker
> - Bork ! Bork ! Bork !
> - Elmer Fudd
> - Tagalog (I think Intercal knows this one, too)

and "Pig Latin" ...

Note that Tagalog is a real human language spoken
in the Philippines. (search for "tagalog language").

Frederic vdP



------------------------------

Date: Fri, 6 Jul 2001 11:32:00 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [list-meta] Bloody Listar!

On Mon, 2 Jul 2001, Keith Gaughan wrote:

> Ok, every time I've posted stuff to the list, it's gone back to the sender.
> Why? Listar doesn't seem to include something as simple as a Reply-To: in
> the email header when it forwards on mail. Is this just happening to me?
> Could it be Eudora that's causing the problems? Panu, if it really is
> Listar, could you please fix this?

I have the feeling that I've explained this a hundred of times, but here
it goes again:

1) The lists are chained, ie every posting to lang or sci gets forwarded
to misc. Listar is totally unaware of this chaining: it's made by
subscribing the misc list as recipient to the other lists.

2) Because I (we?) don't want lang & sci threads to accidentally move to
misc (so that lang-only subscribers won't be able to participate), lang &
sci insert a reply-to header, whereas misc does not (so that it won't
overwrite the lang/sci -inserted reply-to header).

3) The side-effect of this configuration is that when some message gets
posted to misc directly, it won't get a reply-to header at all.

4a) The solution to this is using the "reply to all" feature which every
mailer I know of supports. The feature sends the reply to the original's
recipients as well as its sender.

4b) Another solution would be to make still another list, say
chat@esoteric.sange.fi, and require people to send their misc postings via
that list. But it would probably just add to the overall confusion.

4c) The ultimate solution would be to check if Listar supports list
chaining internally, or some other feature, like reply-to appending
instead of overwriting. However, Listar is very badly documented, though
good piece of software, so I'm not sure if I'll ever find how to make
those settings even if they exist. Besides, I'm very busy in my personal
life just now.

I hope this explains the matter a bit; if it does not, feel free to ask
more.

Panu




------------------------------

Date: Fri, 6 Jul 2001 11:38:48 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [SPAM?] Re: Bloody Listar!

On Mon, 2 Jul 2001, Jeff  Johnston wrote:

> I'm using unix Pine.. and from what I can see, basically what is going on
> is the To: and Cc: are switched around the wrong way.  To: should be
> misc@esoteric.sange.fi and Cc: should be whoever we are repling to.  That

True. If I can find a way to swap the headers in Listar (it's the mail
clients that put misc@esoteric into Cc:), I'll do that. But definitely not
today.

Panu



------------------------------

Date: Fri, 6 Jul 2001 11:47:58 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [list-meta] various

On Tue, 3 Jul 2001, Chris Pressey wrote:
> But... the strange thing is... me, being the poster of one of those e-mails,
> should have received the single-replies that some people sent.... but, I

Um... what do you mean?

> didn't.  And I have no idea what "misc-bounce" is all about.  So I don't
> have the whole story, here...

It's Listar's way to try to ensure that the error reports MTA's send on
expired / bad addresses won't get posted to the list.

Panu




------------------------------

Date: Fri, 6 Jul 2001 11:52:25 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [www] Re: various

On Tue, 3 Jul 2001, Russell Bornschlegel wrote:
> Chris Pressey wrote:
> > I've said it before, I'll say it again: web pages are *documents*, and
> > documents should *not* crash.  The idea of embedding "scripting" languages
> > and such in documents is just... shall we say conceptually flawed, perhaps
> > even doomed but no one has noticed yet :)
>
> It may be conceptually flawed, but in the same way as the idea that
> "normal" people should be expected to use computers, it's an idea
> that's here to stay. You could have fought this in 1993, but not
> in 2001.

I'd say "normal" people should be expected to learn to program, at least
in a deterministic language. Am I conceptually flawed?

> Some web pages are documents. Some are active, dynamic environments.
> I will meet you halfway on this and say that there should be a
> clearer distinction between the two -- different protocols or
> something (dhttp: for dynamic), but it's just pissing into the tide
> [sic] to try and complain about this now.

How very true. http is one of the worst protocols to be used as a base for
interactive environments. I'm looking forward for something chat-type
(IRCD kind of protocols, but meant for all kinds of interaction, not only
talk) to appear as the base of dynamic services.

Panu




------------------------------

Date: Fri, 06 Jul 2001 11:48:31 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [list-meta] various

Panu A Kalliokoski wrote:
> On Tue, 3 Jul 2001, Chris Pressey wrote:
> > But... the strange thing is... me, being the poster of one of those e-mails,
> > should have received the single-replies that some people sent.... but, I
> Um... what do you mean?

Well, if I post a message, and someone else replies to it without
Replying to All like they probably should, I get their message but the
list doesn't.

But, there seemed to be some replies to one of my posts, that I didn't
get, and that didn't appear on the list either, AFAICT.  But, I could
have been mistaken.

Chris

-- 
"Security holes can't show up in features that don't exist." -- DJB


------------------------------

Date: Fri, 06 Jul 2001 12:06:08 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: intellectual property (was Re: various)

Keith Gaughan wrote:
> At 01:53  05/07/2001 -0500, Chris Pressey wrote:
> >Keith Gaughan wrote:
> > >The BSD licence predates the GPL, the FSF and the OSI. It's essentially a
> > >college licence. The need for people to be angels only arose when the
> > >copyright clause was removed.
> >I'm not sure what you mean by that.  All BSD-licensed software (in fact all
> >O.S.S.) is copyrighted.  The only thing rescinded about the BSD license was
> >the advertising clause.
> Um, that's sort of what I meant. I said that because the original licence
> stated that that Berkeley had copyright on the software.

Well - that's only because Berkeley was the party using the license. 
Just like the original GPL stated that the FSF had copyright on their
software, right?

> > >By itself, code released under the the BSD
> > >licence (note that I like the BSD licence and wish I could always use it)
> > >isn't protected from individuals and groups who wish to take the code as
> > >their own. This is it's flaw.
> >How is this a flaw?
> It's a flaw if you don't want the code to be made proprietary.

Yeah, but that's obviously not a requirement of open-sourcing, or BSD,
MIT et al wouldn't qualify.

> > >I'm not arguing from a moral POV, I'm just saying that if one releases
> > >software under the BSD licence and expects it to remain Free,
> >If someone copies a BSD-licensed product, relicenses it, and sells it as
> >proprietary software, that doesn't affect the original product.  The
> >original product remains free.
> But the original product doesn't benefit from this

Hypothetical scenario: Micros~1 takes FreeBSD, makes it proprietary,
calls it DearMSD, and sells it.  The result: people who are exposed to
DearMSD (which, naturally, would be advertised heavily by Redmond) learn
of it's history, and they learn they can get essentially the same
product for free.  The outcome: the original product benefits from what
is essentially free advertising.

> and it also introduces a fork, which isn't healthy.

GPL doesn't prohibit forks either.

I'd also be more apt to believe this bit of "conventional wisdom"
("forks aren't healthy") if someone could point out a project which was
actually hurt by forking.

For that matter, I'd be more apt to believe that BSD is an 'unsafe'
license if someone could refer me to a project which was hurt by someone
using BSD'ed software to make proprietary software.  We can talk theory
all we like, but where's the evidence?

> The Free Software can't avail from any
> improvements in the proprietary software, but the proprietary software can
> sponge off improvements to the Free one.

Hmm... under that logic, every user of GPL'ed software has an
*obligation* to give something back?  If that's the case, then a friend
of mine, who uses RedHat at work but doesn't know how to program, had
better start learning Perl or something, or she's "sponging" off Linus
and the OS community at large.

> > >then one is
> > >presuming that people act like angels.
> >Just curious... if you're not talking about morals, then why the Christian
> >terminology?
> I'm not talking about morality at all. I'm using the word 'angel' to refer
> to a behaviour pattern that people just don't have--being nice all the time
> & not taking advantage of others.

Oh.  In Canada, we have the word 'selfless' to describe that sort of
behaviour.

> We've all been stung by this enough to
> know that 'angels' like this don't exist.

Heh... speak for yourself :)

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Fri, 06 Jul 2001 12:12:47 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: intellectual property (was Re: various)

Keith Gaughan wrote:
> 
> If you want a licence which is even more free than the BSD licence, take a
> look at the one Peter Hartley uses for his software:
> http://www.chaos.org.uk/~pdh/software/

He could have saved himself a lot of typing by resorting to this simple
eight-word phrase:

  "These works are part of the public domain."

Or, if you want a license which is even more Erisian than Hartley's:
http://www.catseye.mb.ca/gwadfc/epl.cgi

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Fri, 6 Jul 2001 10:19:57 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: intellectual property (was Re: various)


> MS-DOS 6 runs
> around $10. If I had to get a kid set up with a system where he
> could learn to program, this might be a viable alternative to
> a free Unixoid OS -- particularly if I wanted to keep him off the
> internet ("Here's the RFCs. Let me know when you've written a
> TCP/IP stack.").

There are several free TCP/IP stacks for MS-DOS.. and PPPD seems to work
pretty good.  I have my dad set up on it (and MS-DOS 6.22) because he
refuses to learn Windows and hates the mouse :)

Of course its really handy to have a shell account for that.

Jeff



------------------------------

Date: Fri, 06 Jul 2001 10:25:15 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: [www] Re: various



Panu A Kalliokoski wrote:
> 
> On Tue, 3 Jul 2001, Russell Bornschlegel wrote:
> > It may be conceptually flawed, but in the same way as the idea that
> > "normal" people should be expected to use computers, it's an idea
> > that's here to stay. You could have fought this in 1993, but not
> > in 2001.
> 
> I'd say "normal" people should be expected to learn to program, at least
> in a deterministic language. Am I conceptually flawed?

Depends on what you mean by "expect". I see lots of people who are 
endlessly frustrated with computers, who spend hours and hours for 
very little apparent benefit. If people are comfortable with 
typewriters and filing cabinets, I say let 'em use typewriters and 
filing cabinets. 

(Hey, when did the word "file" in reference to a collection of bits
attached to a computer come into use?) 

As for programming, I've been screening people who claim to be 
programmers who can't seem to learn to program, despite what 
expectations you or I might have. :)

-RB


------------------------------

Date: Fri, 06 Jul 2001 10:31:24 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: [list-meta] various

Chris Pressey wrote:
> "Security holes can't show up in features that don't exist." -- DJB

This puts me in mind of the brilliant piece of programming advice I 
got from the head of the SCSI system software company that I fled to 
get into the game industry. Really, it's a corollary of St-Exupery's 
statement on design perfection:

"If there's no code there, it's really easy to debug." 
                                      -- Clint Ballard


-RB


------------------------------

Date: Fri, 06 Jul 2001 10:35:51 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: intellectual property (was Re: various)

Aaargh. Remembered reply-all two outta three times.

Jeff Johnston wrote:
> 
> > MS-DOS 6 runs
> > around $10. If I had to get a kid set up with a system where he
> > could learn to program, this might be a viable alternative to
> > a free Unixoid OS -- particularly if I wanted to keep him off the
> > internet ("Here's the RFCs. Let me know when you've written a
> > TCP/IP stack.").
> 
> There are several free TCP/IP stacks for MS-DOS.. and PPPD seems to work
> pretty good.  I have my dad set up on it (and MS-DOS 6.22) because he
> refuses to learn Windows and hates the mouse :)
> 
> Of course its really handy to have a shell account for that.

Yes, but the goal was to keep the kid off the internet, not to get 
him on. Besides, where do you _get_ a TCP/IP stack if you don't 
_have_ a TCP/IP stack? :) 


-RB


------------------------------

Date: Fri, 06 Jul 2001 12:34:47 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [www] Re: various

Russell Bornschlegel wrote:
> Panu A Kalliokoski wrote:
> > On Tue, 3 Jul 2001, Russell Bornschlegel wrote:
> > > It may be conceptually flawed, but in the same way as the idea that
> > > "normal" people should be expected to use computers, it's an idea
> > > that's here to stay. You could have fought this in 1993, but not
> > > in 2001.
> > I'd say "normal" people should be expected to learn to program, at least
> > in a deterministic language. Am I conceptually flawed?
> Depends on what you mean by "expect". I see lots of people who are
> endlessly frustrated with computers, who spend hours and hours for
> very little apparent benefit. If people are comfortable with
> typewriters and filing cabinets, I say let 'em use typewriters and
> filing cabinets.

Indeed.  Obsolescence doesn't really exist.  Typewriters still *work*...

It's not "good for the economy," though.  It's really amazing how
pie-in-the-sky a lot of this technology is.  It's not crucial, just
"nifty."

> (Hey, when did the word "file" in reference to a collection of bits
> attached to a computer come into use?)

May 3, 1967, at 4:14 pm. :)

> As for programming, I've been screening people who claim to be
> programmers who can't seem to learn to program, despite what
> expectations you or I might have. :)

I'd like to refine Panu's proposal, then, and suggest that "normal"
people should be expected to program - IF they want to call themselves
"programmers".

There's a world of difference between programming and software
engineering, too.  It doesn't take a genius to figure out what this is
supposed to do:

  10 PRINT "BIG BROTHER 2 SUCKS ROCKS"
  20 GOTO 10

On the other hand, just because you've got a grip on that idea doesn't
mean you have a clue about how to handle a binary tree or what makes a
good design for a maintainable piece of software.

Oh yeah, just because you know what twenty obscure acronyms stand for
doesn't mean you know what's going on either...

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Fri, 06 Jul 2001 10:59:17 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: [www] Re: various

Chris Pressey wrote:
> 
> Russell Bornschlegel wrote:
> > (Hey, when did the word "file" in reference to a collection of bits
> > attached to a computer come into use?)
> 
> May 3, 1967, at 4:14 pm. :)

*ahem*

Cite?

-R


------------------------------

Date: Fri, 06 Jul 2001 14:32:10 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [www] Re: various

Russell Bornschlegel wrote:
> Chris Pressey wrote:
> > Russell Bornschlegel wrote:
> > > (Hey, when did the word "file" in reference to a collection of bits
> > > attached to a computer come into use?)
> > May 3, 1967, at 4:14 pm. :)
> *ahem*
> Cite?

_Ambrose Bierce's Great Big Wonderful Guide to the Precise Date and Time
of when Different Words were Introduced into Technical Vocabulary_, 1911
edition.

Seriously, as soon as someone had the brilliant idea of storing data on
magtape, they must have needed a word to describe any such discrete
unit.  The office analogy must have presented itself easily, as it has
with so many other computer terms ("desktop", etc.)

_The Penguin Dictionary of Computers_ (1970) defines a file as "An
organized collection of records.  The relationship of records on a file
may be that of common purpose, format, or data source, and the records
may or may not be sequenced."

I'd be more curious as to how to word "file" came to mean "to store
documents" -  prior to that, it would have meant "wearing down or
smoothing of a material with a rough flat metal thingy." :)

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Fri, 6 Jul 2001 22:42:09 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: intellectual property (was Re: various)

On Wed, 4 Jul 2001, Chris Pressey wrote:
> law...")  Laws are trying in some imperfect way to reflect ethics rather
> than the other way around...

Better still, laws are trying to reflect "common agreement" on ethics in a
bit "sophisticated" way. (Like, if you were a good person, what would you
do?) Anyway, any society has its mostly-unspoken agreements on ethical
values, be they written in law or not. So actually law is kind of a
reflection of a reflection.

> I agree that recent "extensions" to copyright law have been contrived to
> protect companies like Disney from having to release 70-some-yr-old
> material into the public domain... to me this goes against the spirit of
> copyright, regardless of their nonsensical arguments of "oh, if we don't

I'm one of those who claim that all patents and copyrights should be
deprived of their legal status. They add a level of possible cheating in
the world of innovation which is already wicked enough. They add totally
counterproductive factors into innovative competition, such as competing
standards, capital gathering capital, and making money by "selling" and
"buying" rights.

> Which strikes me as canny.  Being paranoid about people "stealing the
> code" is falling prey to the same thought patterns that keep code closed
> in the first place!

True. Anyway, if your code is not brilliant or coming to an actual need,
the only way you can get money for it is to advertise it. If it is
brilliant or fulfills some need, you get your profits irrespective of
whether you keep it closed.

Panu




------------------------------

Date: Fri, 6 Jul 2001 22:53:07 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: re: intellectual property

On Thu, 5 Jul 2001, Markus Kliegl wrote:

> Companies are reluctant to use free software, because it usually isn't
> supported by an organization. "No warranty" is scary if there's a bug that

I've been in a company, and usually this was the reason. However, most
open source products are better supported than their commercial
counterparts. The "real" reason seems to be that if some system does not
work and you can prove your customer the problem is not in your company's
code, it's still your problem if the problem is in open source code but
not if it's some other company's closed code. This goes along with the
fact that commercial programming does not walk the line of "if we make a
bug, it's a mistake" but instead "if somebody notices a bug, it's a
mistake." See why I abhor commercial products? (Take Oracle, for example.
Once you get a working Oracle server you _don't_ want to upgrade it.)

> available. Then there's of course the problem of the free software
> sometimes requiring its output to be free as well, which I believe is the
> case with GCC. (Bison and Flex I think allow people to do whatever they
> want with generated code.)

GCC does too. GPL takes this into account. GCC is probably the most
wide-spread compiler in the commercial world, so it wouldn't make much
sense if it had such restrictions.

> The reason Perl and Linux are used commercially so much is that they are
> a) marketed quite well, i.e. are a "buzzword" in relation to eBusiness
> b) there are lots of books available
> c) they can get commercial support (from vendors, etc.)

Snowball effect. If somebody uses it, we can use it. And most other free
OS's are plain unknown to the commercial world. Besides, Linux is a
wonderful development platform for e.g. using experimental hardware (been
there, done that).

Panu




------------------------------

Date: Fri, 6 Jul 2001 22:55:37 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [BF] Common Repository

On Thu, 5 Jul 2001, Markus Kliegl wrote:

> There's plenty of possibilities... does someone have a server they can use
> for this? (Panu, can you set up something on esoteric.sange.fi?)

I could. But I have no time to write upload scripts and I won't give user
accounts to the machine just to enable you to use ftp. So if somebody
cares to make an upload script, I can make a http-based repository; or you
can simply send your bf stuff to me, and I'll put it there.

Panu






------------------------------

Date: Fri, 06 Jul 2001 13:00:08 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: [www] Re: various

Chris Pressey wrote:
> I'd be more curious as to how to word "file" came to mean "to store
> documents" -  prior to that, it would have meant "wearing down or
> smoothing of a material with a rough flat metal thingy." :)

http://www.everything2.com/index.pl?node_id=239339

According to Webster, it's two separate words; soldiers and documents 
are in files derived from the French "file", row <- Latin "filum", 
thread. The metal thing is Anglo-Saxon "feol" <- various german and 
northern european forms.

"It is upon a file with the duke's other letters." -- Shakespeare

-R


------------------------------

Date: Fri, 06 Jul 2001 13:05:15 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: intellectual property (was Re: various)

Panu A Kalliokoski wrote:
> I'm one of those who claim that all patents and copyrights should be
> deprived of their legal status. They add a level of possible cheating in
> the world of innovation which is already wicked enough. They add totally
> counterproductive factors into innovative competition, such as competing
> standards, capital gathering capital, and making money by "selling" and
> "buying" rights.

And you're okay with the side-effect that any author's work can be 
pirated by unauthorized publishers? Or do you see all the publishers 
collapsing for lack of IP, so everyone has to self-publish? 

-RB


------------------------------

Date: Fri, 6 Jul 2001 23:22:06 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [licences] BSD vs GPL war

On Thu, 5 Jul 2001, Keith Gaughan wrote:

> The BSD licence is freer, no doubt. It's also a licence for angels, the
> same way as communism is a political system for angels. Both things have a
> flaw -- the don't fit in with human nature and require people to act like
> angels for them to work.

Urg. Somehow I seem to disagree with most everything here. Okay, BSDL is
freer, but I don't think it's a licence for angels, because you can't
break it anyway (angels are those that _do_ have restrictions but won't
break them). And communism is not the system for angels, because it's a
measure in cooperation, and angels don't need cooperation. Anarchy is
probably the system of angels.

Okay, that was way too symbolistic to be taken as an argument, but my
point about BSDL is this: there is no such thing one should deny but BSDL
does not. There's absolutely _no harm_ somebody can do you by stealing
your source, if it's open. And if it's closed, the only harm you can get
is commercial damage.

> The GPL and LGPL, for all their flaws, are more pragmatic. They don't
> presume that people are angels.

Erm? What they do seem to presume is that it creates more common good to
be jammed in endless licence incompatibilities like QPL/GPL than to give
your code to people who want to close it after modifications. Does not
make much sense to me.

> This is why, even though dictatorships are
> the most efficent system of government, we live in democracies -- you can't

Most efficient? I always thought the only reason why we don't live in
dictatorships is that it's not an efficient enough system to use in a big
state. Bad governers are killed or kill their state and themselves with
it, whereas democracy makes the will of the masses a common law, _really_
digging up the devilish nature of human beings.

> The GPL's pragmatism comes from how it gives up some of the freedom to make
> sure it stays free.

No piece of open source software can be deprived of its freedom (it's
already released, so what's the big deal?). What GPL denies is closing
your changes to GPL'd software. That does not make sense to me, because
they're your modifications and undoubtedly somebody is willing to remake
those changes if they're useful. (Of course, I don't see why anybody would
close their changes anyway.)

> The BSD licence is a licence of a perfect world. This is not a perfect
> world. That's the advantage of the GPL. Cut away all the philosophical
> pretense and that's what you're left with.

Interestingly, I see it exactly the other way around. GPL as a
philosophical licence, BSDL as a practical one.

Panu




------------------------------

Date: Fri, 6 Jul 2001 23:26:54 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: intellectual property (was Re: various)

On Thu, 5 Jul 2001, Keith Gaughan wrote:
> >How is this a flaw?
>
> It's a flaw if you don't want the code to be made proprietary.

I don't understand this at all. If my web page has a BSDL'd piece of
software, how can you make that proprietary? I mean that specific code
there. How do you make it proprietary?

> But the original product doesn't benefit from this and it also introduces a
> fork, which isn't healthy. The Free Software can't avail from any

I'd say forks are very healthy. But they don't naturally really happen
that often.

Panu




------------------------------

Date: Fri, 06 Jul 2001 15:48:38 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Open Sores Illgol##: Upgrade now!!!

Just lettin' y'all know that the Next Generation Product of the
venerable ILLGOL line is now available: Open Sores Illgol## deprecates
ILLGOL, Illgola-2, and Illberon, and as such those OBSOLETE products are
now DISCONTINUED.  Upgrade now!!!

  http://www.catseye.mb.ca/esoteric/illgol/%23%23/

To try to keep everyone happy, Illgol## (pronounced either "Illgol Pound
Pound" or "Illgol double-sharp"... I'm not sure which) has been licensed
under eight, count'em eight, open-source licenses:
 I.    Artistic License
 II.   BSD License
 III.  GPL
 IV.   LGPL
 V.    MIT License
 VI.   Mozilla Public License
 VII.  Q Public License
 VIII. zlib/libpng License

Pick one.

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Fri, 6 Jul 2001 23:55:16 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [

On Fri, 6 Jul 2001, Russell Bornschlegel wrote:

> > I'd say "normal" people should be expected to learn to program, at least
> > in a deterministic language. Am I conceptually flawed?
>
> Depends on what you mean by "expect". I see lots of people who are
> endlessly frustrated with computers, who spend hours and hours for
> very little apparent benefit. If people are comfortable with
> typewriters and filing cabinets, I say let 'em use typewriters and
> filing cabinets.

Well, they shouldn't do their typewriting by learning to program, I can
say that much... more like, being able to program is a basic ability of
overall use, much like basic arithmetic, reading and writing, and good
manners.

> As for programming, I've been screening people who claim to be
> programmers who can't seem to learn to program, despite what
> expectations you or I might have. :)

You should begin the upbringing very early. :)

Panu




------------------------------

Date: Sat, 7 Jul 2001 00:04:22 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: intellectual property (was Re: various)

On Fri, 6 Jul 2001, Russell Bornschlegel wrote:

> Panu A Kalliokoski wrote:
> > I'm one of those who claim that all patents and copyrights should be
> > deprived of their legal status. They add a level of possible cheating in
> > the world of innovation which is already wicked enough. They add totally
> > counterproductive factors into innovative competition, such as competing
> > standards, capital gathering capital, and making money by "selling" and
> > "buying" rights.
>
> And you're okay with the side-effect that any author's work can be
> pirated by unauthorized publishers? Or do you see all the publishers
> collapsing for lack of IP, so everyone has to self-publish?

My god, this would be a dream world. Because if everyone "had to"
(could!) self-publish, the buying audience would be forced to find those
self-publishers that meet their interests, instead of relying on
commercial publishers. Besides, if you don't want to play with
law-granted, unnatural rights of IP, there is no such thing as "piratism"
and "unauthorised" publishers. Which is a huge advantage: every publisher
is an authorised publisher. Think about that!

If what you mean is "are you okay with the fact that you can't control how
your work is used", I answer in the positive.

Panu




------------------------------

Date: Fri, 6 Jul 2001 23:18:54 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: Re: intellectual property (was Re: various)


On Thu, 5 Jul 2001, Keith Gaughan wrote:

> At 11:49  05/07/2001 +0200, Markus Kliegl wrote:
> >Pragmatic vs. Pure
> >
> >BSD       vs. GPL
> 
> My god, no! That's backwards! The BSD licence is the pure licence. The GPL 
> has clauses in it to make sure the software stays Free. The BSD licence is 
> the licence of idealists, but this kind of idealism belies a certain 
> naivety, but only if you want your code to stay Free. On the other hand, 
> the GPL is a *puritan* licence. It demands that the code covered by it 
> stays free. It's pragmatic because it requires a certain loss of freedom 
> (the freedom to make the code proprietary) in order to keep it free.

I see it the other way around:
the GPL enforces that the software be used in its philosophical pure
manner, while the BSD license is more pragmatic and allows using the
software for impure, i.e. proprietary, commercial, uses.

> 
> Granted, the GPL is too complicated. It could be vastly simplified. My 
> perfect licence would be one based on the BSD licence which required that 
> changes be released back to the public in the form of source, just as the 
> GPL does. I wouldn't use it for everything, but I'd use this for software 
> which I'd usually put under the GPL.

I'm sure something like that exists with all the licenses around these
days.

All this license, copyright, patent, etc. stuff is really getting on my
nerves. I think I'll just put everything in the public domain, or under
the Erisian Public License, for that matter. People can generally be
trusted to give credit where credit is to be given.

The philosophy of the FSF is what I believe in and it would be great if
that would be the way things are. The GPL just causes too many problems
with other people with the same intent, i.e. all those FreeBSD problems.
I find the BSD license even worse, though. So, back to the way "things
might be and ought to be [and once were]"... public domain.

> 
> You know, the Nokia licence is quite a nice one. It's worth a look if you 
> don't like the others.

It's even longer than the GPL!

The Nethack General Public License seems to basically be the same as the
GPL, but about two and a half times shorter (the OSI seems to have gotten
the title of that document mixed up with another license).
http://www.opensource.org/licenses/nethack.html

> 
> K.
> 
> -- 
> Keith Gaughan <keith@digital-crew.com>
> Software Developer, Digital Crew Ltd.
> Take off every '.sig'!!

Markus



------------------------------

Date: Fri, 6 Jul 2001 23:22:06 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: Re: intellectual property (was Re: various)



On Fri, 6 Jul 2001, Chris Pressey wrote:

> Keith Gaughan wrote:
> > 
> > If you want a licence which is even more free than the BSD licence, take a
> > look at the one Peter Hartley uses for his software:
> > http://www.chaos.org.uk/~pdh/software/
> 
> He could have saved himself a lot of typing by resorting to this simple
> eight-word phrase:
> 
>   "These works are part of the public domain."
> 
> Or, if you want a license which is even more Erisian than Hartley's:
> http://www.catseye.mb.ca/gwadfc/epl.cgi

I think I'll start using the Erisian Public License... or I'll write up an
own static license that states about the same :-)

> 
> Chris
> 
> -- 
> This sentence will be false in 20 seconds starting..... NOW!
> 

Markus



------------------------------

Date: Sat, 7 Jul 2001 00:22:25 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [licences] some examples

On Fri, 6 Jul 2001, Markus Kliegl wrote:

> I think I'll start using the Erisian Public License... or I'll write up an
> own static license that states about the same :-)

Self-referential:

This licence follows the conditions stated in this licence. Otherwise, see
this licence for the details.

Negative self-referential:

This software can be used as is, without any warranty, as you will, except
in the ways stated in this licence.

Collective self-referential:

This licence follows the conditions stated in all licences that are
compatible with themselves.

Null licence:



"Basic set" licence:

This licence explicitly follows all conditions not stated in the null
licence.

And so on...

Panu



------------------------------

Date: Fri, 06 Jul 2001 15:02:04 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: intellectual property and silly licenses

Panu A Kalliokoski wrote:
> 
> On Fri, 6 Jul 2001, Russell Bornschlegel wrote:
> 
> > Panu A Kalliokoski wrote:
> > > I'm one of those who claim that all patents and copyrights should be
> > > deprived of their legal status... [snip]
> >
> > And you're okay with the side-effect that any author's work can be
> > pirated by unauthorized publishers? Or do you see all the publishers
> > collapsing for lack of IP, so everyone has to self-publish?
> 
> My god, this would be a dream world. Because if everyone "had to"
> (could!) self-publish, the buying audience would be forced to find those
> self-publishers that meet their interests, instead of relying on
> commercial publishers.

Yeah, that suddenly does seem to level the playing field. I'm not
trying to claim it wouldn't have advantages; I'm just concerned 
with the costs.

> Besides, if you don't want to play with
> law-granted, unnatural rights of IP, there is no such thing as "piratism"
> and "unauthorised" publishers. Which is a huge advantage: every publisher
> is an authorised publisher. Think about that!
> 
> If what you mean is "are you okay with the fact that you can't control how
> your work is used", I answer in the positive.

Are you okay with someone else taking your work -- source code or 
popular novel -- and making money off it? Someone else taking your
novel, putting their name on it, and selling it as their own? 
Someone else taking your serious philosophical novel, adding more 
sex scenes to it, leaving your name on it, and selling it as the 
"unexpurgated version"? We've been there before, and that's why 
copyright law now exists. 

Panu also wrote:
> Self-referential:
> 
> This licence follows the conditions stated in this licence. Otherwise, see
> this licence for the details.
> [snip]

Another Paradoxical License: 
This license covers all software which is not covered by any software 
license.

Dirty Harry License:
So you have to ask yourself -- does the holder of this copyright 
have the resources to enforce his copyright, or doesn't he? Can he 
afford a lawyer, or not? Do you feel lucky, pirate? Do you? Go ahead, 
make my day.

Fear, Uncertainty, and Doubt License:
You know The Company can enforce this copyright. You know The Company 
can afford a whole flotilla of lawyers. You know The Company could 
probably buy the judge if it came to a court of law. You know they've
got black helicopters and wiretaps and parabolic mikes and Men In Black.
You should just give yourself up right now.

Chain Letter License:
When you receive this software, you should immediately mail it to 
five other people. Markus Kliegl didn't pass the software along, and 
he stubbed his toe. Chris Pressey did pass the software along, and 
the next day he received a check for 50,000 Zorkmids from Bill Gates
along with a note of apology. 

Nondeterministic Chain Letter License:
When you receive this software, you must immediately select one of the 
following Illgol##-compatible licenses:
 I.    Artistic License
 II.   BSD License
 III.  GPL
 IV.   LGPL
 V.    MIT License
 VI.   Mozilla Public License
 VII.  Q Public License
 VIII. zlib/libpng License

...and remove that license from this license definition. The software
can then be redistributed according to any of the remaining licenses.

Schroedinger's License:
The first time you use this software, flip a coin. If it comes up 
heads, this software is covered by the BSD License. If it comes up
tails, this software is covered by the GPL. If it lands on edge, 
you must delete the software from your computer immediately and 
kill your cat.

Rascality License:
Sure, go ahead and copy this software, but don't let me catch you 
at it, you rascal.

The Counting License:
(As any other open source license of your choice, but with the 
additional clause:)
This is generation 0 of the license. Please increment the generation 
number immediately when you receive this software, before 
redistributing it. 

Delegation License:
Please compose your own open-source license in this space. Licenses 
should be pragmatic yet idealistic, should not infringe on any 
freedoms including the freedoms of bad people, should be written 
in a form which is clearly understandable yet legally binding and
unambiguous.

The Local Maximum License:
This software may be freely redistributed only after you have 
modified it to either add at least one feature or to fix at least 
one bug. 

-RB


------------------------------

Date: Sat, 7 Jul 2001 00:51:18 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [Licenses] Contest


Inspired by all these wonderful licenses around, I am pleased to announce
the 'Software License Contest' (and I sure hope someone's going to submit
the GPL as an entry :-)... so, might as well waste this weekend.

Those licenses that Panu and Russell already sent are counted as entries.

Goal:
  To create the most unusable license (free or not) and to enforce usage
  of it.

Submitting:
  Submissions should be sent to misc@esoteric.sange.fi with CC to
  Bill Gates, Richard Stallman, Linus Torvalds, ET and Mickey Mouse.
  Submission deadline is this Sunday (23:50 whatever your local time zone
  is), giving you almost no time

Judging:
  The winners will be announced this Monday by me.

  Of course, anyone can judge and announce the winners according to their
  idea of how this contest should be run... the idea is having a billion
  license contests, but everyone only has to submit once.

  Invited judge is Jenny, though actually I never invited her to judge.

  Entries will be judged on the following criterias:
   * Unusability
   * Usability
   * Affecting of users of the software
   * Recursiveness
   * Paradoxicality (?)
   * anything else that comes to mind

Prizes:
  The authors of the three winning entries will receive a free copy of a
  special piece of software licensed under all entries and signed by Eris!
  These prizes will of course be sent to misc@esoteric.sange.fi

Markus



------------------------------

From: "Plant Kingdom" <pk@littleraven.com>
Date: Fri, 6 Jul 2001 23:13:17 -0400
Subject: Re: Google 4 language HAXORS

On Fri, 06 Jul 2001 09:37:46 +0200, Fr=E9d=E9ric van der Plancke 
<fvdp@decis.be> wrote:  

> Gerson Kurz wrote:
> > - Hacker
> > - Bork ! Bork ! Bork !
> > - Elmer Fudd
> > - Tagalog (I think Intercal knows this one, too)
> 
> and "Pig Latin" ...
> 
> Note that Tagalog is a real human language spoken
> in the Philippines. (search for "tagalog language").

And the correct name for the dialect spoken by the Swedish Chef 
is "Mock Swedish."  As all right-thinking, well-educated citizens of 
the world should know.



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: The worlds first python-written virus
Date: Sat, 7 Jul 2001 06:39:42 +0100

"In the Slovenian pavilion at the Venice Biennale a group of artists and
hackers, 0100101110101101.ORG and EpidemiC, is exhibiting a new  computer
virus called 'biennale.py'."

http://www.heise.de/tp/english/inhalt/sa/3642/1.html

The Virus:
http://www.0100101110101101.org/home/biennale_py/biennale.py.html



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: kalk
Date: Sun, 8 Jul 2001 15:01:39 +0100

kalk is a Qt GUI based Linux / Win32 calculator with a different approach.
It is somewhat similar to a language interpreter; while at the same time
continuously evaluating expressions, so you can model expressions to fit a
result (try it & you'll see).

Features of interest to this group:

- You can define functions on the fly, e.g.

f(x,y)=sin(x*x)+cos(y*y)
f(1,2)

- You can query truthtables, e.g. "TT(~p|~q)" will result in

p | q = ?
F | F = T
F | T = T
T | F = T
T | T = F

- Open Source.

kalk is available for both Win32 & Linux @ http://www.p-nand-q.com/kalk.htm

PS. Of course, I was screaming aloud during the Linux port. Here is why:

Problem: You want to use your IDE CD Burner as a CD Burner.

Solution:
Logon as root. Start yast. Go to System Administration. Goto Kernel & Boot
configuration. Goto Lilo configuration. Append a line hdX=ide-scsi where X
is the number of your CD Burner device. You can find the name by searching
thru /var/log/boot.msg.
Edit /etc/init.d/boot.local. Append a line "/sbin/modprobe ide-scsi".
Do a "ln -sf /dev/scd0 /dev/cdrecorder" from a xterm window.
Edit /etc/fstab, so that it contains a line "/dev/cdrecorder
/media/cdrecorder   auto   ro,noauto,user,exec  0  0"
Reboot.

Free translation from http://sdb.suse.de/de/sdb/html/tbraza_ide_brenner.html

So much for Linux on the Desktop.



------------------------------

Date: Sun, 8 Jul 2001 21:50:08 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: intellectual property and silly licenses

On Fri, 6 Jul 2001, Russell Bornschlegel wrote:
> > If what you mean is "are you okay with the fact that you can't control how
> > your work is used", I answer in the positive.
>
> Are you okay with someone else taking your work -- source code or
> popular novel -- and making money off it? Someone else taking your
> novel, putting their name on it, and selling it as their own?
> Someone else taking your serious philosophical novel, adding more
> sex scenes to it, leaving your name on it, and selling it as the
> "unexpurgated version"? We've been there before, and that's why
> copyright law now exists.

You ask for my opinions? There are different degrees in this thing. For
the first question, I'm okay with that. After all, anybody can write
something, and making money is the real trouble. As for the second one, I
consider that bad manners (because it's lying that it's their work) -- I
think I'd be okay with that, but I don't expect others to be. As for the
third one, it's a different scenario altogether. It's not only concerned
by copyright law, but also defamation law. Defamation is different,
because it can harm the original author, which the first two don't do. And
again, it's lying - lying about what the author said.

All in all, I see a big difference between "intellectual property" (which
I don't think should necessarily exist) and "correct reference". The first
one is counterproductive (IMO), the second one very useful.

> Another Paradoxical License:
> This license covers all software which is not covered by any software
> license.

... and, from now on, mote this be called "Russell's paradox".

Do you happen to know the way they rephrased the paradoxical axiom? It's
really quite interesting.

> Delegation License:
> Please compose your own open-source license in this space. Licenses
> should be pragmatic yet idealistic, should not infringe on any
> freedoms including the freedoms of bad people, should be written
> in a form which is clearly understandable yet legally binding and
> unambiguous.

Hey, good idea! But how come did you distribute the first copy? You're
breaking the licence...

> The Local Maximum License:
> This software may be freely redistributed only after you have
> modified it to either add at least one feature or to fix at least
> one bug.

... or to add one?

Panu




------------------------------

Date: Sun, 8 Jul 2001 22:02:33 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [Licenses] Contest


I'd like to add one entry, the One True Licence:

You may do with this piece of software whatever you damn please, as long
as you follow good manners, don't irritate anybody by your actions in an
unfair situation, ask the author for advice in unclear situations (such as
copying the software to a friend who, however, does not want it), take
others' feelings into account, think forward the consequences of your
deeds, and most important of all, don't tease or harm anybody.

The meaning of this software is to provide people with joy, enlightenment,
solved problems, fulfilled needs, and excited interest. All use of the
software should aim towards these goals.

THE SOFTWARE IS PROVIDED AS IS, WITHOUT ANY EVIL BACKTHOUGHTS, IMPLIED OR
EXPRESS, AND ABSOLUTELY NO HARM SHOULD EVER EMERGE FROM USING THE
SOFTWARE. IF SUCH A CASE APPEARS, LET EVERYBODY USE THEIR OWN BEST
JUDGEMENT TO DECIDE WHO IS AT FAULT AND HOW THE SITUATION WOULD BEST BE
CORRECTED.

Go into the world, fear nothing, and be nice to your surroundings (nice by
their standards, not yours).

Panu

Am fuar -> symb <- am fesh
atehwa@iki.fi





------------------------------

Date: Sun, 08 Jul 2001 19:58:05 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [Licenses] Contest

Markus Kliegl wrote:
> Goal:
>   To create the most unusable license (free or not) and to enforce usage
>   of it.

Software Lie Sense [courtesy of Wonk]
------------------

By installing this software the end user hereby agrees that it will, 
under no circumstances, be used as birth control, a paperweight, 
religion, a doorstop, a pencil sharpener, forceps, a means of killing 
Kenny, or as chewing gum remover.

The SEEKrit Erisian Girlscout Public License
--------------------------------------------

There is no SEEKrit Erisian Girlscout Public License, and it's a SEEKrit
besides, so shhhhhhhhhhhhhhhhhhhhhhhhhhh

The Feline Public License
-------------------------

Meow meow meow meow, meow meow meow meow, meow meow meow:
   Meow meow meow meow (meow meow meow);
   Meow meow meow, meow meow;
   Meow meow purrrrrrrrrrr.

MEOW MEOW MEOW MEOW NO WARRANTY MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW.

The Crowleyan Public License
----------------------------

Do as Thou Wilt Shall be the Whole of this License.

The Unconditional Assimilation Public License
---------------------------------------------

ALL YOUR BASE ARE BELONG TO US

Chris

--
"This administration is doing everything we can to end the stalemate 
in an efficient way. We're making the right decisions to bring the 
solution to an end." -- guess who, Washington, D.C., April 10, 2001


------------------------------

Date: Mon, 9 Jul 2001 11:29:28 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [lex/yacc] Stack-based prefix/"Forward Polish" syntax?

On Wed, 27 Jun 2001, Russell Bornschlegel wrote:

> Forth's "Reverse Polish"/postfix operator syntax just had to go
> for readability reasons[2]. How do you do a stack-based language
> without postfix operators? Simple, the parser reads each _line_
> backwards, so the programmer writes:

The other way to do this (and IMO better, as it gives more flexibility) is
to use an operator stack instead of an operand stack. For operators that
have got some of their operands but not all, you can use closures.

add add 2 3 4		stack at each stage
			-------------------
add			< add >
add			< add add >
2			< add (add 2) >
3			< add (add 2 3) > ==> < (add 5) >
4			< (add 5 4) > ==> < 9 >
			(probably to be further reduced)

You can use mixed FPN and RPN to make the language more powerful:

add 2 map ! mylist	stack at each stage
			-------------------
add			< add >
2			< (add 2) >
map			< (map (add 2)) > (map behaves in RPN fashion)
!			< (map (add 2)) ! >
mylist			< (map (add 2)) (conts. of mylist) > ==>
			< (conts. of mylist, each item incr'd by 2) >
			(probably to be further reduced)

> What's the best way to implement a prefix-notation language using
> lex and yacc? It seems like lex would need to find the tokens on a
> line, throw out comments, then reverse them before presenting them
> to yacc. Maybe a lex-to-lex preprocessor? I'm very new to lex and

If you use RPN (or if that's what the actual interpreter sees), you don't
need yacc at all. But if using yacc is OK, I propose you throw away the
reversing (because it's so uncertain a technique) and use proper yacc
rules, because that's just as easy:

prog :	expr
expr :	add_expr | sub_expr | neg_expr | const | var
add_expr : ADD expr expr
... and so on.

or even:
expr :  unary_expr | binary_expr | trinary_expr | term
unary_expr :  UN_OP expr
binary_expr : BIN_OP expr expr
trinary_expr : TRIN_OP expr expr expr
... and so on.

> yacc, so I don't know if they have any explicit features which
> would help with this kind of thing, or if there's a standard idiom
> for it...

lex and yacc are exactly designed for this kind of thing, but not the way
you want to do it. Instead, they do the stack and state tracking for you,
letting you specify whatever unambiguous grammar you please. FPN is always
unambiguous, so the grammar is very easy to make.

b5's grammar makes an excellent example of basic yacc usage. (However, it
does not execute the language straight in the parsing phase, but instead
makes a representation tree from it to be later evaluated.) It's available
at http://www.sange.fi/~atehwa-u/b5/b5-grammar.y

> [2] Do speakers of German and other at-the-end-of-the-sentence-
> the-verb-comes languages have more aptitude for Forth than do
> we 'merkins?

I don't think so. Besides, German is IMO very illogical as it comes to
word order; that the _first_ verb of main clause is not at the end and
that there are more prepositions than postpositions just doesn't make a
very coherent view for me. See word order of Japanese.

Panu






------------------------------

Date: Mon, 9 Jul 2001 11:21:40 +0200 (CEST)
From: "Rafal M. Sulejman" <rafal@engelsinfo.de>
Subject: [lang] Re: [lex/yacc] Stack-based prefix/"Forward Polish" syntax?

On Mon, 9 Jul 2001, Panu A Kalliokoski wrote:

> On Wed, 27 Jun 2001, Russell Bornschlegel wrote:
>
> > [2] Do speakers of German and other at-the-end-of-the-sentence-
> > the-verb-comes languages have more aptitude for Forth than do
> > we 'merkins?
>
> I don't think so. Besides, German is IMO very illogical as it
> comes to word order; that the _first_ verb of main clause is not
> at the end and that there are more prepositions than
> postpositions just doesn't make a very coherent view for me. See
> word order of Japanese.

Heh. Try Polish if you want something REALLY illogical ;) AFAIK
it's one of the hardest-to-parse natural languages...

But we use "normal" algebraic notation ;)

Few (many) years ago someone invented ENGLISH language for
database munching ("Yes! You CAN program in ENGLISH using our
tools..."). POLISH can be it's equivalent for spreadsheet macros
;)... (if you really hate s-sheet users)...

--
 # . . . | Rafal M. Sulejman                        /"\
 # . . . | rms@spam-haters.poczta.onet.pl>          \ /
 # . . . | ASCII Ribbon Campaign for HTML-free mail  X
 . . . # |                                          / \





------------------------------

From: Steve Mosher <goat@isn.net>
Subject: Re: [Licenses] Contest
Date: Mon, 9 Jul 2001 08:36:03 -0300

On Sun, 08 Jul 2001, Chris Pressey pressed some keys and this came out:
> The Unconditional Assimilation Public License
> ---------------------------------------------
> 
> ALL YOUR BASE ARE BELONG TO US

	That's "ALL YOUR BASE-CODE ARE BELONG TO US" (See GPL) ;)

-- 
Steve Mosher,
Mad Scientist

Never worry when you're strong, but keep the absurd absurdity close to the youth.
Your clarity is insane; a youth disturbs the strong heart.



------------------------------

Date: Tue, 10 Jul 2001 14:57:19 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [www] Re: various

Russell Bornschlegel wrote:
> Chris Pressey wrote:
> > I'd be more curious as to how to word "file" came to mean "to store
> > documents" [...]
> According to Webster, it's two separate words; soldiers and documents
> are in files derived from the French "file", row <- Latin "filum",
> thread.

Ah - phylum, filament, etc.  Gotcha.

> The metal thing is Anglo-Saxon "feol" <- various german and
> northern european forms.

OK... my point here, assuming I had one, which I didn't, was that,
whereas in computer programming languages we go to great lengths to
avoid namespace collisions, in spoken languages we actually encourage
them, presumably to reduce the number of "terminal tokens"
(phoneme-strings that you have to be able to pronounce and distinguish.)

I mean, there's no good reason Interlish couldn't still use the word
"feol", it's not like it's being used for something else now.

But, while that pronunciation was maybe natural in the Anglo-Saxon
tongue, it isn't really present in the Interlish phoneme-base, where it
could easily be confused with a word like "feel".

So instead Interlish makes up compound words and phrases.  For
specificity, we can distinguish a file from a file by calling one by
it's full name, calling it a handfile.

So I guess the question is, to what extent do filesystems and variable
namespaces benefit from such approaches of "applied ambiguity"?  On most
operating systems there is the relatively crude measure of a "search
path."  The thing I've found about the search path is that it's one of
the harder things for "non-techies" to understand.

But the obstacle seems to be that the basic structure of a typical
filesystem is hierarchical.  (Although symbolic links can turn it into a
graph, for better or worse.)  The search path is needed to tack another
"dimension" onto the hierarchy.  Perhaps if the basic structure had a
"higher dimensionality", it would be easier to handle in general.

For example, I might decide to put a hypothetical game, written in a
some hypothetical scripting language in a directory called
foolang/games.  Or, I might wnat to put it in a directory called
games/foolang.  Which one I choose is more or less arbitrary.  This, to
me, is a good argument for using *keywords* rather than "directory"
names in a filesystem; I'd put it in games&foolang, to which
foolang&games would also match.

Adding wildcards to this approach lets you specify "virtual
directories"; for example, asking to view the files for "games&*" would
list files in games&foolang, perl&games, whatever&games&stuff, etc. 
This obviates the need for a search path; you just look in
"executables&*" and lo and behold, there are all your executables.

It's also largely backwards-compatible.  Listing the files in
usr&local&share&whatever would list the same files as
/usr/local/share/whatever/ would in unix (assuming both filesystems had
copies of the same files, of course.) The point is, existing
filesystem-accessing code wouldn't break.

Chris

-- 
ERROR: Corrupt feolsystem.  Spinning silk, please wait...


------------------------------

Date: Tue, 10 Jul 2001 14:13:54 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: [www] Re: various

(Argh. Missed reply-all again)

Chris Pressey wrote:
> OK... my point here, assuming I had one, which I didn't, was that,
> whereas in computer programming languages we go to great lengths to
> avoid namespace collisions, in spoken languages we actually encourage
> them, presumably to reduce the number of "terminal tokens"
> (phoneme-strings that you have to be able to pronounce and distinguish.)

I'm not sure what the natural-linguistic _benefits_ are to allowing 
namespace collisions, but historically the _dangers_ of namespace 
collisions in spoken language haven't been very serious because of 
the usual speed with which humans do things. For example:

 X:  "Do we turn left here?"
 Y:  "Right."

Prior to the 20th century, there was plenty of time to note this
ambiguity and correct it before any damage was done. On the freeway
at 120kph, this is more dangerous than it once was, and people 
who are paranoid about ambiguity (like programmers) may go out 
of their way to say "Correct" or "No, turn right" instead of just
saying "Right".

Now, with computer performance being rated in billions of mistakes 
per second, ambiguity can be a dangerous thing indeed, so the usual 
computer-system strategy for dealing with ambiguity is to stop and 
complain.

But you knew all that.

> So I guess the question is, to what extent do filesystems and variable
> namespaces benefit from such approaches of "applied ambiguity"?  
> [...]
> 
> But the obstacle seems to be that the basic structure of a typical
> filesystem is hierarchical. [...]
> 
> For example, I might decide to put a hypothetical game, written in a
> some hypothetical scripting language in a directory called
> foolang/games.  Or, I might wnat to put it in a directory called
> games/foolang.  Which one I choose is more or less arbitrary.  This, to
> me, is a good argument for using *keywords* rather than "directory"
> names in a filesystem; I'd put it in games&foolang, to which
> foolang&games would also match.

There's some implicit support in modern OSes for what you're talking 
about here. Consider the increasing reliance on find-file capabilities 
on modern machines with big hard disks where it's easy to lose stuff. 
Consider web search engines and the integration of filesystem browsers 
with web browsers. Consider symbolic links and the desktop -> my 
computer -> filesystem -> desktop-file circularity you mentioned a 
while back, turning the filesystem tree into a cyclic graph. An 
underlying tree representation is kept mainly to provide start and 
end points for enumerations, and for compatibility. 

> Adding wildcards to this approach lets you specify "virtual
> directories"; for example, asking to view the files for "games&*" would
> list files in games&foolang, perl&games, whatever&games&stuff, etc.
> This obviates the need for a search path; you just look in
> "executables&*" and lo and behold, there are all your executables.

Yeah; dealing with the new ambiguities thus created, and keeping 
the system indexed efficiently, become the new problems to solve
in this case. 

-RB


------------------------------

Date: Tue, 10 Jul 2001 14:38:41 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: [www] Re: various

Chris Pressey wrote:
> But the obstacle seems to be that the basic structure of a typical
> filesystem is hierarchical.  (Although symbolic links can turn it into a
> graph, for better or worse.)  The search path is needed to tack another
> "dimension" onto the hierarchy.  Perhaps if the basic structure had a
> "higher dimensionality", it would be easier to handle in general.

Another thing about Everything2 that might be relevant to a filesystem
is that the act of going from any node in the system to any other node, 
no matter how that transition is made, forges what's called a "soft 
link" in the system, and the N most-travelled softlinks are available 
to click on. 

Applying this to the filesystem, consider a directory with a bunch of 
audio files in it; sometimes you're copying files to other directories 
for archive or export, other times you're bringing them into an editor 
to mess with them, other times you're just playing them back. Lots of 
OSes are keeping track of recently used applications and recently 
accessed documents, but they're keeping track of them on the system-
wide or per-user scale instead of on a per-directory basis. 

Essentially, I'm talking about the system evolving different 
"workspaces" (containing pointers/shortcuts/links to files, apps, 
and directories) as you use the system, so that in the "usability 
dimension", things that are frequently used together move closer 
together.

This is exactly analogous to the (legendary/mythical?) college
campus where they didn't put down any paths between buildings the 
first year, letting the students walk across the lawns as they 
wished, then later paved over the emergent paths where the grass 
had been stomped to death.

-RB


------------------------------

Date: Tue, 10 Jul 2001 18:38:56 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: ESO (was Re: [www] Re: various)

So I guess I wouldn't be griping about OSen and licenses unless I had it
in mind to do some project involving them.

So this raises the question, am I still interested in building ESO, the
esoteric operating system?  Well, what does that mean anyway?  Some
people want an obfuscated OS, some people want a small OS, some people
want something elegant, some people just want something strange.  All of
these things are honourable esoteric goals, of course, but I think we'd
have be more specific if we didn't want the thing to turn out to be
anything but a monstrosity (the bad kind).

I'd personally like to explore lots of little interrelated alternative
models - i.e. something simple and elegant.  But it might not always be
strange or obfuscated or small.  Of course, I wouldn't go out of my way
to make it normal or bloated, either :)

A few things are fairly apparent.  People won't be happy unless it's a
real OS, i.e. you can run it on your computer without running any other
OS under it.  (That doesn't mean it can't also be emulated, obviously.)

The big problem that presents itself there is that there are no runtime
libraries available that don't assume a certain OS is running under
them.  For example, every time you compile a C program, it links in crt1
and libc functions; those functions are specifically tailiored, usually
in asm, to the OS you're currently running (unix, windows, whatever.)

So we'd need to basically re-implement libc, or rather, the parts of
libc that we like/need, at a level that works under ESO.  Now this
raises a fairly interesting question to me, why not have the OS provide
all those common services as services, rather than as functions that are
linked statically into the executable?  That removes a layer of
abstraction, but that may not be a bad thing in an esoteric OS - it
would help keep it smaller and simpler.

So in this spirit I would propose a very simple virtual machine (that
doesn't really resemble the machine languages Befunge, Brainf*ck etc)
where essentially the only functionality that is exposed (besides
branching & stuff) is the ability to call an operating system function. 
That's right, even incrementation would be defined in an API somewhere. 
(Of course this could always be optimized [inlined] in a "serious"
implementation of ESO.)

Russell Bornschlegel wrote:
> (Argh. Missed reply-all again)
> Chris Pressey wrote:
> > OK... my point here, assuming I had one, which I didn't, was that,
> > whereas in computer programming languages we go to great lengths to
> > avoid namespace collisions, in spoken languages we actually encourage
> > them, presumably to reduce the number of "terminal tokens"
> > (phoneme-strings that you have to be able to pronounce and distinguish.)
> 
> I'm not sure what the natural-linguistic _benefits_ are to allowing
> namespace collisions, [...]

Fewer words.

I'm not sure why that's a benefit exactly  - fewer "keys in the
dictionary", I suppose.  Phonetic laziness?

> > [keywords instead of directories]
> There's some implicit support in modern OSes for what you're talking
> about here. Consider the increasing reliance on find-file capabilities
> on modern machines with big hard disks where it's easy to lose stuff.
> Consider web search engines and the integration of filesystem browsers
> with web browsers.

I know what you're getting at, but it just isn't quite the same to me. 
Searching for something (by name, or properties or content) is an
intensive process in comparison to simply locating a file by a "fully
qualified name".

> Consider symbolic links and the desktop -> my
> computer -> filesystem -> desktop-file circularity you mentioned a
> while back, turning the filesystem tree into a cyclic graph.

Yeah, but - yuck :)  For one thing, it's directed; (cd place ; cd ..)
could leave you in some unexpected, unexplored, mysterious part of the
filesystem, if place is a symbolic link.  That ain't none too good... it
would be nicer if there was something between a symbolic link and a
block-link, something that is consistently referred to so that the graph
isn't directed.  Anyway, that's a bit of a digression, 'cause with
keywords you don't really need symbolic links either, I don't think. :)

> An
> underlying tree representation is kept mainly to provide start and
> end points for enumerations, and for compatibility.

True; they're not very strong reasons to me, though, certainly not wrt
ESO.

> > Adding wildcards to this approach lets you specify "virtual
> > directories"; for example, asking to view the files for "games&*" would
> > list files in games&foolang, perl&games, whatever&games&stuff, etc.
> > This obviates the need for a search path; you just look in
> > "executables&*" and lo and behold, there are all your executables.
> Yeah; dealing with the new ambiguities thus created, and keeping
> the system indexed efficiently, become the new problems to solve
> in this case.

Yeah, efficient indexing might be a bit of a space-hog; each keyword is
a key in a multi-keyed database table.  With each key there was be an
additional index, and that's a lot more overhead than just a directory.

As for further ambiguities... well, files could be stored within their
"virtual directory" as a bag, so that usr&local&share&foo&READMEcould
point n>1 different files.  usr&local&share&foo&README would actually
point to the newest (by filedate) of the files named README with those
keywords, and a syntax like usr&local&share&foo&README#2 or
usr&local&share&foo&README@19990701 could be used to reference older
versions of README.

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Tue, 10 Jul 2001 17:16:29 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: ESO (was Re: [www] Re: various)



Chris Pressey wrote:
> Russell Bornschlegel wrote:
> > Consider symbolic links and the desktop -> my
> > computer -> filesystem -> desktop-file circularity you mentioned a
> > while back, turning the filesystem tree into a cyclic graph.
> 
> Yeah, but - yuck :)  For one thing, it's directed; (cd place ; cd ..)
> could leave you in some unexpected, unexplored, mysterious part of the
> filesystem, if place is a symbolic link.  That ain't none too good... 

In the world of the web browser, the back button takes care of 
this. You could also, whenever a symlink is created, create 
new bidirectional links between the directories/namespaces 
enclosing both ends of the symlink, somehow...

> As for further ambiguities... well, files could be stored within their
> "virtual directory" as a bag, so that usr&local&share&foo&READMEcould
> point n>1 different files.  usr&local&share&foo&README would actually
> point to the newest (by filedate) of the files named README with those
> keywords, and a syntax like usr&local&share&foo&README#2 or
> usr&local&share&foo&README@19990701 could be used to reference older
> versions of README.

Hmm, sorting by timestamp is the Right Thing in some cases; not sure
if it's the right general answer.

_R


------------------------------

Date: Tue, 10 Jul 2001 17:26:31 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: ESO (was Re: [www] Re: various)

Chris Pressey wrote:
> So this raises the question, am I still interested in building ESO, the
> esoteric operating system?  [...]
> 
> A few things are fairly apparent.  People won't be happy unless it's a
> real OS, i.e. you can run it on your computer without running any other
> OS under it.  (That doesn't mean it can't also be emulated, obviously.)
> 
> The big problem that presents itself there is that there are no runtime
> libraries available that don't assume a certain OS is running under
> them.  For example, every time you compile a C program, it links in crt1
> and libc functions; those functions are specifically tailiored, usually
> in asm, to the OS you're currently running (unix, windows, whatever.)

Actually, the C runtime library and the POSIX specification have co-
evolved in such a way as to minimize the amount of asm you need to 
write the CRTL, provided that you can write your own linker and that 
you have equivalent functionality in the OS to a POSIX subset. Almost 
all of the CRTL is normally written in C ("the portable assembler"). 
CRTL implementations typically has more code to deal with cross-CPU 
portability than with cross-OS portability, for example. (See 
Plauger's "The C Standard Library" for more details)

For a number of practical reasons, assuming that the OS supports a 
POSIX subset has a lot of advantages. Even if you think POSIX is a
bad OS API, it's a very useful one to bootstrap from, in much the 
same way as having a C compiler on a new platform is a useful 
precursor to porting your favorite language to it. 

-RB


------------------------------

Date: Thu, 12 Jul 2001 01:25:57 +0300 (EEST)
From: Esoteric languages community <esoteric@oiva.sange.fi>
Subject: Re: pretentious rant about operating systems (fwd)


Originator: fvdp@decis.be (Frederic)

Message-ID: <3B417CBD.DCE90183@decis.be>
References: <3B3FA3E9.42C03905@catseye.mb.ca>
Content-Type: text/plain; charset=3Diso-8859-1
Content-Transfer-Encoding: 8bit
X-MDRemoteIP: 192.168.0.7
X-Return-Path: fvdp@decis.be
X-MDaemon-Deliver-To: misc-bounce@esoteric.sange.fi
Reply-To: fvdp@decis.be



Chris Pressey wrote:
>=20
> I'll get right to the point.  WHERE'S THE METADATA?
>=20
> The answer: when it is there, it is spread across umpteen configuration
> files that don't know about each other, OR, it is lumped willy-nilly
> into an obscure, convoluted centralized database... but it's usually not
> there.

Configuration management is a hard thing anyway.
I agree the current state of affairs is unsatisfying.

>=20
> The fact is that system objects (files, devices, etc) have relationships
> with each other.  Relationships are nothing new in computer science,
> we've been using relational databases for years.  So why hasn't the
> rather simple concept of "Object-A somehow-relates-to Object-B" filtered
> down to the operating system level yet?
>=20
> We have dependencies in 'make' scripts, and we have 'install' and
> 'uninstall' scripts, and we have 'file type detection' in the form of
> either file suffix or 'magic'... but these are all loose and scattered
> functions.  In the meantime, you can rename a file and none of these
> measures are the wiser. =20

Magics resist renaming. (So each binary format should contain a magic
IMO).

Relying on file extension is both bad and good: under Windows,
I rather like the way it works; if I want file F to be opened by=20
program X by default (=3D by double-clicking of F's entry), it suffices
to rename F with a suitable extension -- and I can define my own
extensions and the way they behave.

> (And when an OS does have enough seatbelts to
> warn you, the warning is seemingly never specific enough: "file may be
> required by some installed packages" - well I'd love to know which
> ones?!?)
>=20
> There are some other little things that are just shell/filesystem
> issues.  I'd love for a shell to be able to change to a directory just
> by typing its name.=20

In Windows you can already open a file just by typing "start myfile.ext"
or even "myfile.ext" (just tested !) (same extension -> program
association as described above.)

> It should be obvious that "enter" is the verb to be
> implied when you just name a directory.  I'd also love for the FS to be
> able to treat archive files (.tar, .tgz, .zip, .bz2 etc) as directories,
> so you could "enter" them and copy files in and out with the usual
> commands (not to mention having programs like "find" able to search
> within archives automatically :)

You can do that at least partially under Windows with a commercial program
like ZipMagic (http://www.ontrack.com/zipmagic/): .zip files appear as
ordinary folders in Windows Explorer.
(I never tried to "explore" them using the DOS command prompt or the "find"
command though. Apparently, things like that should work.)


Fr=E9d=E9ric vdP

"Windows is not an OS" -- but then I wonder what operates my system ?


--------------- Error message done -------------------------

---
Listar v0.129a - job execution complete.




------------------------------

Date: Thu, 12 Jul 2001 01:19:23 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: ESO (was Re: [www] Re: various)

Russell Bornschlegel wrote:
> Chris Pressey wrote:
> > Russell Bornschlegel wrote:
> > > Consider symbolic links and the desktop -> my
> > > computer -> filesystem -> desktop-file circularity you mentioned a
> > > while back, turning the filesystem tree into a cyclic graph.
> > Yeah, but - yuck :)  For one thing, it's directed; (cd place ; cd ..)
> > could leave you in some unexpected, unexplored, mysterious part of the
> > filesystem, if place is a symbolic link.  That ain't none too good...
> In the world of the web browser, the back button takes care of
> this.

Well, in the world of the shell shouldn't there be a 'bk' to complement
'cd'?

> > As for further ambiguities... well, files could be stored within their
> > "virtual directory" as a bag, so that usr&local&share&foo&READMEcould
> > point n>1 different files.  usr&local&share&foo&README would actually
> > point to the newest (by filedate) of the files named README with those
> > keywords, and a syntax like usr&local&share&foo&README#2 or
> > usr&local&share&foo&README@19990701 could be used to reference older
> > versions of README.
> Hmm, sorting by timestamp is the Right Thing in some cases; not sure
> if it's the right general answer.

Even better, save new files as diffs of old files.  And apply diffs to
make new diffs when old files are deleted.  Kinda complicated, and
probably a bit slow, but very, very cool :)

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Thu, 12 Jul 2001 09:10:42 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: ESO (was Re: [www] Re: various)



Chris Pressey wrote:
> 
> Russell Bornschlegel wrote:
> > In the world of the web browser, the back button takes care of
> > this.
> 
> Well, in the world of the shell shouldn't there be a 'bk' to complement
> 'cd'?

Sure. Get on it, man! 

Actually, historically, people have added push-cwd and pop-cwd 
functionality to shells, via aliases, batch files, and other such, 
then used push-and-cd instead of cd, which makes pop act like the
"back button" or "bk" command. Like other things I've brought up 
here, people have been putting this functionality into filesystems 
quietly, without talking about what it means in terms of topology.

> Even better, save new files as diffs of old files.  And apply diffs to
> make new diffs when old files are deleted.  Kinda complicated, and
> probably a bit slow, but very, very cool :)

Do "journaling filesystems" do this? I haven't had a chance to learn
about them.

-RB


------------------------------

Date: Thu, 12 Jul 2001 13:54:31 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: ESO (was Re: [www] Re: various)

Hmmm... sorta taking this all together... we have POSIX-based OS'es that
stemmed from a time when resources were expensive, so the most graceful
way to build them is to bootstrap them through C.  At the same time, we
have lots of resources these days, so we want to use them.  To do things
like support "undo" actions (undo cd, undo write-file, undo setenv, etc,
is what we're talking about here.)  And other stuff.

The result is sort of that these features have been added piecemeal -
they're not packaged, they're not in the core, and they're certainly not
standardized - I mean a piece of software like ZipMagic is pretty cool,
but what if you want to support the next big compression format (like
bz2?)  It would be nice if the OS "knew what compression was," i.e.
provided an API, so the functionality would be more general, and the
same could be said for the other features.

Russell Bornschlegel wrote:
> > Even better, save new files as diffs of old files.  And apply diffs to
> > make new diffs when old files are deleted.  Kinda complicated, and
> > probably a bit slow, but very, very cool :)
> Do "journaling filesystems" do this? I haven't had a chance to learn
> about them.

Possibly - I was thinking like CVS, although probably not as complicated
as CVS.  Actually, closer to Bluetail's Wikie, a wiki written in Erlang;
it saves all additions as diffs to existing entries (I don't know if
other wikis do that.)

Hmmm... come to think of it, CVS itself could be abused as a chat
protocol, with full history keeping no less :)

Although it has very little to do with what we're talking about here, I
have to say that telnet is RIDICULOUSLY complicated for what it does...
I don't know for sure, but I have to imagine that 90% of the negotiation
it does could be completely ignored by 90% of the present-day
implementations and it would still work fine.  Sometimes I think
linemode and character-at-a-time mode should be two entirely different
protocols.  Like, why don't more telnet clients allow you to force the
local echo on or off?  Oh well...

Chris

-- 
IAC DON'T WORRY IAC I WON'T BITE


------------------------------

Date: Thu, 12 Jul 2001 12:09:02 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: ESO (was Re: [www] Re: various)

Chris Pressey wrote:
> Although it has very little to do with what we're talking about here, I
> have to say that telnet is RIDICULOUSLY complicated for what it does...

Well, again, it wasn't designed that way, it "just growed." Like 
the whole TCP/IP suite and friends, it's big, unwieldy, starting
to fragment, relied on by many, and now becoming very hard to 
replace. And any possible replacement will suffer from second-system
syndrome...

But you knew that.

-R


------------------------------

Date: Thu, 12 Jul 2001 12:28:06 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: ESO (was Re: [www] Re: various)



Chris Pressey wrote:
> 
> Hmmm... sorta taking this all together... [snip]
> The result is sort of that these features have been added piecemeal -
> they're not packaged, they're not in the core, and they're certainly not
> standardized - I mean a piece of software like ZipMagic is pretty cool,
> but what if you want to support the next big compression format (like
> bz2?)  It would be nice if the OS "knew what compression was," i.e.
> provided an API, so the functionality would be more general, and the
> same could be said for the other features.

Well, let's see... you could write a filesystem driver that accepted 
compression systems as codecs in DLLs/shared libraries. If you write 
the APIs correctly, the codec DLL could support standalone use as 
well as in-filesystem use. (Since multimedia player software evolved 
long after filesystems did, they generally work this way already.) 
The default filesystem codec is essentially "memcpy".

The cool thing is you could, possibly, use the same API for 
filesystem compression and for network compression...

Same logic applies to many aspects of an OS; essentially you're 
moving to a sort of OOP model (encapsulating functionalities behind
DLL interfaces, treating plug-in features polymorphically). The 
overhead of the dynamic-link indirection is assumed to be affordable
on a modern system. 

Pretty soon, you're gonna find yourself arguing in favor of COM and
reinventing Win32.

-RB


------------------------------

Date: Thu, 12 Jul 2001 16:09:53 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: ESO (was Re: [www] Re: various)

Russell Bornschlegel wrote:
> Pretty soon, you're gonna find yourself arguing in favor of COM and
> reinventing Win32.

Well, let's not get carried away, here :)

In a sense, yes.  But with two qualifiers: such functions shouldn't
really be DLL's as much as they should be part of the kernel; and that
such linking shouldn't necessarily be dynamic.

Of course, "part of the kernel" is sort of a vague way to say it... in a
microkernel system, everything would be some sort of library, and Win32
is actually sort of close to that idea, assuming you can imagine win.dll
(or whatever it's called) as "the kernel".

And the linking need only be dynamic the first time - like a JIT
compiler.  Statically linked copies could be cached for subsequent use. 
I don't know how much this would improve system performance, but I think
it would be worth trying.

I guess I mean that these functions ("compress" and "undo" to take the
most overt examples) are so basic, they should actually exist somewhere
below the file system, rather than above it.  For example, what if you
store a DLL in a folder which is actually a compressed archive?  (Can
you store the compression codec DLL itself in such a place? :)  Making
them optional components might actually be a drawback on the entire
system, as for any given system you couldn't be guaranteed they'd
actually be there...

To tie this in with the licensing debate... I don't see proprietary
software as a big evil.  Not nearly as much as proprietary "standards"
(of course, with friends like telnet, who needs enemies? :)  And an OS
is essentially a bunch of standards rather than a bunch of software - it
doesn't matter how foo is implemented as long as foo does what foo is
documented to do.

I'm not sure about second-system syndrome.  I mean I'm sure it exists,
but to what extent it's unable to overcome the "barriers to entry"... I
don't know.  Desktop OSen certainly seem to be sloooowly merging towards
POSIX... I mentioned that Micros~1 could take FreeBSD and relicense it,
but I totally forgot that Apple has basically already done exactly that
for MacOS X.  POSIX is far better than nothing, but it's got it's own
problems.  I've seen software (I forget what exactly) that mentions in
it's docs that "This program complies with POSIX except where POSIX is
clearly brain-damaged," and that about sums up the usefulness of POSIX;
as nice as it is to have something like it, it's *still* a stopgap
measure pieced together by a committee... about as gracefully as HTML
3.2.  Mmmm nummy nummy yummmm.

It might be nice to know what the hell we want to use computers *for*,
though, instead of just exalting in the throes of "wow, that's neat"
hype.  The problem with these machines is that they're just too damned
general-purpose :)

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Thu, 12 Jul 2001 14:36:15 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: ESO (was Re: [www] Re: various)

Chris Pressey wrote:
> POSIX is far better than nothing, but it's got it's own
> problems.  I've seen software (I forget what exactly) that mentions in
> it's docs that "This program complies with POSIX except where POSIX is
> clearly brain-damaged," and that about sums up the usefulness of POSIX;
> as nice as it is to have something like it, it's *still* a stopgap
> measure pieced together by a committee... 

Yeah, which is why I kept saying "POSIX subset" the other day. Wasn't
it Linus who said that Linux was as POSIX-compliant as he could make
it without looking at a POSIX spec? 

> It might be nice to know what the hell we want to use computers *for*,
> though, instead of just exalting in the throes of "wow, that's neat"
> hype.  The problem with these machines is that they're just too damned
> general-purpose :)

Don't worry, the industry is very shortly going to tear away at 
least one purpose (media authoring). Pretty soon they'll have
these babies to a point where they're just as good as television.

-R


------------------------------

Date: Thu, 12 Jul 2001 16:52:48 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: ESO (was Re: [www] Re: various)

Russell Bornschlegel wrote:
> Don't worry, the industry is very shortly going to tear away at
> least one purpose (media authoring). 

Well, that Final Fantasy movie ought to demonstrate that well enough. 
Out of curiously, anyone know what kind of operating systems those
Hollywood effects-artists are running?

> Pretty soon they'll have
> these babies to a point where they're just as good as television.

But... where I come from, a television is not a piece of media authoring
equipment. :)

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Thu, 12 Jul 2001 15:23:29 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Media Authoring (was Re: ESO (was Re: [www] Re: various) 

Chris Pressey wrote:
> 
> Russell Bornschlegel wrote:
> > Don't worry, the industry is very shortly going to tear away at
> > least one purpose (media authoring).
> 
> Well, that Final Fantasy movie ought to demonstrate that well enough.
> Out of curiously, anyone know what kind of operating systems those
> Hollywood effects-artists are running?

I can't say for the people who did Final Fantasy, but I would guess
that on the whole, computer graphics for movies are done on NT and/
or IRIX (SiliconGraphics Un*x), the former gaining market share and 
the latter losing. I know that the mid-to-high-range 3D packages like
Maya are coming to Mac OS X as well.

> > Pretty soon they'll have
> > these babies to a point where they're just as good as television.
> 
> But... where I come from, a television is not a piece of media authoring
> equipment. :)

I think you misunderstood; I was dripping sarcasm and bile, saying 
that the computer industry is going to _remove_ the media-authoring 
functionality from our computers (as a side effect of increasing 
copy protections); the end result of this progression will be to 
make computers as useful as televisions. 

Because, of course, consumers have no need, desire, or ability to 
create. 

-RB


------------------------------

Date: Fri, 13 Jul 2001 02:40:02 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: ESO (was Re: [www] Re: various)

> Russell Bornschlegel wrote:
> > > Even better, save new files as diffs of old files.  And apply diffs to
> > > make new diffs when old files are deleted.  Kinda complicated, and
> > > probably a bit slow, but very, very cool :)
> > Do "journaling filesystems" do this? I haven't had a chance to learn
> > about them.
>
> Possibly - I was thinking like CVS, although probably not as complicated
> as CVS.  Actually, closer to Bluetail's Wikie, a wiki written in Erlang;
> it saves all additions as diffs to existing entries (I don't know if
> other wikis do that.)

CVS does not save new files as diffs of old files, but old files as diffs
of new ones. That's much more sensible. In a typical programming project,
where you save a file 100+ times before even making anything run, using
diffs from old to new soon becomes impractical.

> Hmmm... come to think of it, CVS itself could be abused as a chat
> protocol, with full history keeping no less :)

Well yes, except that CVS' locking is ill-suited for chatting. :)

> Although it has very little to do with what we're talking about here, I
> have to say that telnet is RIDICULOUSLY complicated for what it does...

<tss> Those are just add-ons; telnet is mostly a straight pipe over the
network. (Tough guys send their e-mail by telnet localhost 25)

Panu




------------------------------

Date: Fri, 13 Jul 2001 20:05:38 +0300
From: Mooz <mooz@welho.com>
Subject: [lang] [lang][Befunge] Dividing large numbers, floating point result

This has got to be the silliest and most inefficient way
I've seen division performed on a computer. Just as it is
done with pen and paper.

The program takes keyboard input in the form of two integers
and a forward slash in between eg. "17/7" or "31337/42". The
result is a floating point number, as accurate as it can fit
in funge-space. The fun part? Take a debugger that can show
the playfield, run it and laugh :)

-----BEGIN BEFUNGE CODE BLOCK-----

 >1+>:~::"0"-:v>$:v>>21p    :0#v_1-::::6g "0"-:0`!8v
p  +v_:#`0 #<_|_ " |-+77:+1g12_!v8!-"!":+gg12\+*+8<
6v 3>#$"9"-:v#<|_/ >$11g3+:6g4v->8+*+:"9"`"0"\-76*0p:v
\| p#_!:`"#0_ ^"|" vp3p04+1:g0<^+2g11p+1g12\-*+55`"9"<
^< ^6+1p11:\_!-6#<^>1+:6g:84*#^-#4 _$$40g:"+"\:"|"v
                          v59:+1p3+1\g6p12:<1:p2p3\<
                          >*\2p:21g1+:11g-#^_$$31p70p11gv
2x                  v06:g22p124 p42 -\p22+1:g04p00::-3-<
3x                  >p80p >22g::3g:" "-!88#v+#*<
4x                  v g42_^#!:-1p22+1pg12\+<>+90p650p11v
5x                  >:23p 3g60g:1+60p21ggv  ^77p08p06:<g
6x                  ^+1g32_v#!:- _v#-" ":<vg12\+*+88!<-2
7x                   >,:v# >0`!#v_22g:1+22p  :3g:" "-^++ >v
8x                   ^  _! @ >$$>#_       >    22g00g1^: 0g
9x                   $    v_v#`0_v#:-gg12g06 gg05 :    < 51
                    v_|#-* 48 :g <_v>60g1+60p1+:70g-   #^_^+
           >       #\    $^$ >50g1   +50p50g90g-1-  !#v_^  5
  >v>50p:!#^_50g:vv6 8-6g05<       #                  < !p0<
  :2^+1\-1\p1\"0"<>* +22g1-1p!#v_ :50g1-g>   80g:1+80p21g1+pv
  +1^g22:: <  v_ #` #g13g2$#2!#<^   #    ^_v#-" ":g-1g05: +1<
  1g >64*-#^_$| >$   60g21g2+p           v >$$80p22g>1-::60p:21v
  p2 ^p12:+2g12p 08p06:\-<v06gg09 :<$#   >#    #<   ^vg+1g12\gg<
  +>+g"0"-!#v_:22g\- 00g\^>g21gg-:!#^_0`90g\-90p^    >:" "-!#v_v
  ^2g12\" ":<$!_^#!-+88-gg12-1g06 :+"0"<   p080_v#<`0+1:-g08-  <
     > #2g#\1#<-:1g\>1-:31g-"."\#|_\:< ^++55p081< ^10     :$$<JJ

-----END BEFUNGE CODE BLOCK-----

-mooz





------------------------------

Date: Fri, 13 Jul 2001 16:15:25 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: Re: ESO (was Re: [www] Re: various)

On Thu, 12 Jul 2001, Chris Pressey wrote:
> Russell Bornschlegel wrote:
> > Pretty soon, you're gonna find yourself arguing in favor of COM and
> > reinventing Win32.
> Well, let's not get carried away, here :)
> In a sense, yes.  But with two qualifiers: such functions shouldn't
> really be DLL's as much as they should be part of the kernel; and that
> such linking shouldn't necessarily be dynamic.

If I may be so bold, it seems like the way to do this is to use "DLLs"
that are...how to phrase this...only dynamic on startup.  Kind of like
the OSF/1's "Pseudo-Static" runtime linker.  Basically, you've got
yourself a global lookup table.  If an API happens to be supplied by
the kernel, its address gets loaded into the lookup table at startup.
If not, it enters the table when linked.  Applications don't know the
difference, because external function calls are hashed into the table
and the link followed.

Of course, everyone knows what happened to OSF/1, I guess...

[...]
> And the linking need only be dynamic the first time - like a JIT
> compiler.  Statically linked copies could be cached for subsequent use. 
> I don't know how much this would improve system performance, but I think
> it would be worth trying.

If you mean "between sessions" caching, usually not worth it.  Caching
"to the end of the session" usually works well enough, though.

> I guess I mean that these functions ("compress" and "undo" to take the
> most overt examples) are so basic, they should actually exist somewhere
> below the file system, rather than above it.  For example, what if you
> store a DLL in a folder which is actually a compressed archive?  (Can
> you store the compression codec DLL itself in such a place? :)  Making
> them optional components might actually be a drawback on the entire
> system, as for any given system you couldn't be guaranteed they'd
> actually be there...

I suspect Russell described it that way, not for the purpose of not
installing codecs one doesn't want, but rather for future 
expandability.  Which is good, since it'd be inconvenient to have to
install a new version of the operating system every time some fool
publishes a new encryption algorithm.

> To tie this in with the licensing debate... I don't see proprietary
> software as a big evil.  Not nearly as much as proprietary "standards"
> (of course, with friends like telnet, who needs enemies? :) 

Quick aside:  Telnet is technically simple as one would imagine it
should be:  Send data, get reply.  However, there are a million and two
optimizations (for example, Nagle's Algorithm) that make it excessively
complicated.

[...]
> It might be nice to know what the hell we want to use computers *for*,
> though, instead of just exalting in the throes of "wow, that's neat"
> hype.  The problem with these machines is that they're just too damned
> general-purpose :)

It's always been my understanding that "wow, that's neat" *is* what
the things are for.  Well, that, and for convincing people to spend 
thousands of dollars to replace smaller, more convenient devices around
their desk and home...



------------------------------

Date: Fri, 13 Jul 2001 14:55:07 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: ESO (was Re: [www] Re: various)

John Colagioia wrote:
> Quick aside:  Telnet is technically simple as one would imagine it
> should be:  Send data, get reply.  However, there are a million and two
> optimizations (for example, Nagle's Algorithm) that make it excessively
> complicated.

It's not the optimizations that Chris was whinging about, it's the 
plethora of silly options. It's easy enough, of course, to implement
telnet in such a way that it says WON'T to all the DOs...

-R


------------------------------

Date: Sat, 14 Jul 2001 09:10:33 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: Re: ESO (was Re: [www] Re: various)

On Fri, 13 Jul 2001, Russell Bornschlegel wrote:
> John Colagioia wrote:
> > Quick aside:  Telnet is technically simple as one would imagine it
> > should be:  Send data, get reply.  However, there are a million and two
> > optimizations (for example, Nagle's Algorithm) that make it excessively
> > complicated.
> It's not the optimizations that Chris was whinging about, it's the 
> plethora of silly options. It's easy enough, of course, to implement
> telnet in such a way that it says WON'T to all the DOs...

Hmmm...Let's see...Telnet is RFC...854, which you can find at:
	http://www.graphcomp.com/info/rfc/rfc0854.html
for those that feel like reading along.

Blah, blah, blah, NVTs, skidah, skidah, skidah, half-duplex, yadda,
yadda, yadda, "Do, don't, will, won't" handshake, some technical
details that shouldn't be specified, ah.  Options.

Nope.  "Control characters."  IP, AO, AYT, EC, EL.  SYNC, DM, STOP
(for non-telnet interaction).  Character set specs (also not good in
the spec, in my opinion), BRK.

Command sequence for setting options:  "Interpret as Command"  (IAC=
255), command (240-254), optional third byte if command was one of
{DO/253, DON'T/254, WILL/251, WON'T/252}.  Options aren't listed here,
oddly enough, though.

OK, on to RFC855 (finding the webpage, based on the above data, is left
as an exercise for the reader).  "Telnet Options Specification."  That
seems promising.

Uhm...apparently, there ain't none at this time.

Conclusion:  All "silly options" are nonstandard, and no telnet
implementation is required to support the, except insofar as knowing
how to send a {IAC-WON'T-<option>} sequence when asked to use the
option.

Unless "erase last character sent," and "are you there" are the
aforementioned silly options, but I doubt it.



------------------------------

Date: Sat, 14 Jul 2001 17:06:43 +0300 (EEST)
From: Heikki Kallasjoki <fizban@iki.fi>
Subject: Re: ESO (was Re: [www] Re: various)

On 14.07.01, at 09:10, John Colagioia wrote with subject 'Re: ESO (was Re:...':
> > It's not the optimizations that Chris was whinging about, it's the
> > plethora of silly options. It's easy enough, of course, to implement
> > telnet in such a way that it says WON'T to all the DOs...

[clip]

> Conclusion:  All "silly options" are nonstandard, and no telnet
> implementation is required to support the, except insofar as knowing
> how to send a {IAC-WON'T-<option>} sequence when asked to use the
> option.

rfc-editor web page, when given the search string "telnet" produces at
least the following RFC:s:
STD0032 RFC0861 Telnet Extended Options: List Option
STD0031 RFC0860 Telnet Timing Mark Option
STD0030 RFC0859 Telnet Status Option
STD0029 RFC0858 Telnet Suppress Go Ahead Option
...
So there are options which are defined as "standards"
Moreover, there are ~10 authentication-related RFCs whose status is
'proposed standard', from year 2000.


-- 
Heikki Kallasjoki
fizban@iki.fi



------------------------------

Date: Sun, 15 Jul 2001 20:57:01 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Telnet

My problem with telnet is mainly that clients don't always support ways
to override the negotiation, for when connecting to nonstandard servers
- like Panu mentioned, using it to connect to SMTP and such non-telnet
services.  For these purposes it defaults to half-duplex linemode. 
Which for SMTP is fine, but not for certain other ports, like some MUDs.

While you can set character-at-a-time mode in the .terlnetrc file, there
is no way currently to forcibly turn off local echo (i.e. full duplex
instead of half-duplex) with FreeBSD's telnet client.  Well, no way
besides hacking the source, that is (edit
/usr/src/usr.bin/telnet/sys_bsd.c, replace "if (f&MODE_ECHO)" with "if
(0)", then recompile.)

RFCs 856 through 861 describe some of the standardized Telnet options.

Chris

-- 
This sentence will be false in 20 seconds starting..... NOW!


------------------------------

Date: Mon, 16 Jul 2001 09:28:59 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: Re: Telnet

On Sun, 15 Jul 2001, Chris Pressey wrote:
> My problem with telnet is mainly that clients don't always support ways
> to override the negotiation, for when connecting to nonstandard servers
> - like Panu mentioned, using it to connect to SMTP and such non-telnet
> services.  For these purposes it defaults to half-duplex linemode. 

Which, of course, is how (normal, "optionless") telnet is described.
And probably how it should most often be handled.

> Which for SMTP is fine, but not for certain other ports, like some MUDs.

Ah, well, there, I think is the problem.  Telnet as a "basic
technology" happened to be so useful that it was widely adopted as a
"null client," if you'll excuse the terminology, which--of course--
required bunches of additional layers to make it work "right" for
previously never-considered usage.

> While you can set character-at-a-time mode in the .terlnetrc file, there
> is no way currently to forcibly turn off local echo (i.e. full duplex
> instead of half-duplex) with FreeBSD's telnet client.  Well, no way
> besides hacking the source, that is (edit
> /usr/src/usr.bin/telnet/sys_bsd.c, replace "if (f&MODE_ECHO)" with "if
> (0)", then recompile.)

Yes.  Client-side programmers tend to be a bit...lax when it comes to
implementation, under the assumption, presumably, that the server takes
care of everything.

I actually have an FTP client that won't support hashmarks or multiple
gets and puts--all features that I thought were the exclusive domain of
the server.

> RFCs 856 through 861 describe some of the standardized Telnet options.

Found 'em.  Thanks.  Echo (857) is presumably the one fouling your
waters.

Oh, and thanks to the other person who posted, whose post I
accidentally deleted (though I remember it being a Finnish address, and
not Panu...).  rfc-editor is a pretty good supplement.



------------------------------

Date: Mon, 16 Jul 2001 17:56:38 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [b5] New release


I am happy to announce .. blahblah .. the new release of the world-leading
b5 technology .. blahblah .. which has been proven by many tests to be the
most efficient implementation of lambda calculus based macro processors on
the market .. blahblah .. and best of all, it's FREE!

I'm sure you all have been benchmarking b5 against "other" lambda calculus
based general purpose macro processors all the time and found out that
while b5 undoubtedly is the fastest one around it is however limited in
terms of efficiency as it comes to handling a large mass of closures. To
handle this weak point, I implemented copy-on-write for closures, based on
reference counting -- expressions already had this. The net result is that
b5 is much faster but hasn't changed externally in the slightest.

You may get the new version (I'm sure you're holding your breath!) to test
the new _lightning speed_ it has, from:

http://sange.fi/~atehwa-u/b5.tar.gz	(downloads)
http://sange.fi/~atehwa-u/b5/		(browsing)
http://sange.fi/~atehwa-u/b5/{b5-grammar.c,b5-scanner.c,y.tab.h}
	(for those who don't have proper lex/yacc on their machines)

By the way, if you want some computation where the difference shows, run

cd examples
../b5 algorithm.b5 church-number.b5

fact(6)(cat(foo))(bar)
[EOF]

May the force be with you!

Panu

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Mon, 16 Jul 2001 21:00:09 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [calculators] [bf&bf] request for resources


A while back, there was a short burst of brainfuck and befunge
implementations for different calculators. I'd like to put up a repository
for these pieces of software at esoteric.sange.fi. Would you be so nice as
to package the software reasonably and send it to me?

Another thing I'd be interested in is putting up a repository of brainfuck
resources. You don't have to send those to me, but instead just send
pointers where I can find some. I'll add them to esoteric.sange.fi too.

Panu

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: Esoteric Linux
Date: Mon, 16 Jul 2001 20:39:37 +0100

Goal: A new linux distro, that is as user-unfriendly as possible.

Since ESO seems to go nowhere, and since today I spend 7 hours on the train
being bored, I came up with the idea of a linux distro for the esoteric
community. The goal: to create something that is as difficult and awful to
use as possible. No, I don't mean to send everyone copies of my Suse 7.2 CD
7CD+DVD boxed set, I want to do the following:

- Step 1: Copy an existing linux distro. I'm tending towards slackware,
because it is pretty much there already. Debian is high on the list, too.
Rename it. (Don't know how to call this distro yet)

- Step 2: Modify glibc, and rebuild selected standard tools with it.

For example sprintf("%d") should be changed to output e.g. ESOGOTSCHI-style
numbers, with a random representation choosen each time (so that you cannot
easily detect same numbers). At the same time, atol / strtol etc. should be
changed to only accept those new literals. This should work with standard
code, but make the output of e.g. "du" hard to understand.

I am especially fond of this idea: make printf ToGGlE uppercase/LOWERCASE at
random. Think how nice it would be to use a thus modified ls on a system
that has a goddamn case-sensitive file system :)

- Step 3: Modify the files set up by the distro. Amongst the subgoals:

- Do not ship GCC; rather, include all esoteric languages known to mankind
*in the default install*. If you *must* compile C, use a cross-compiler.
- Ship a modified version of VI as the only editor. Of course VI should be
changed so that for each day, a new keyboard command set is choosen at
random. This should teach VI enthusiasts to be more passionate and
understanding with people that don't find "/" the most intuititve search
command imaginable.
- Ship with mudshell (http://www.xirium.com/tech/mud-shell/) as the one and
only shell available. Try to see if INTERCAL is a viable script language.

I have no sufficiently evil ideas to build into XFree yet, but arbitrary
resolution limits seem a good starting point.

So, the goals of this project are twofold:

- create a linux distro that can actually be installed on a machine and run
- at the same time, make it as user-unfriendly as possible to annoy as many
users as possible.

What do you think ?



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: Esoteric Linux Followup
Date: Mon, 16 Jul 2001 20:46:34 +0100

Oh, and I almost forget Step 4:

Set up an advocacy website for the distro that mainly consists of bitching
about other distros and goals like "usabilty" and how un-haxorlike that is,
vaguely in the style of REAL PROGRAMMERS DON'T USE PASCAL.



------------------------------

From: Steve Mosher <goat@isn.net>
Subject: Re: Esoteric Linux Followup
Date: Mon, 16 Jul 2001 16:18:48 -0300

On Mon, 16 Jul 2001, Gerson Kurz pressed some keys and this came out:
> Oh, and I almost forget Step 4:
> 
> Set up an advocacy website for the distro that mainly consists of bitching
> about other distros and goals like "usabilty" and how un-haxorlike that is,
> vaguely in the style of REAL PROGRAMMERS DON'T USE PASCAL.

Heh, afaik, "Real programmers don't really program." =)

-- 
Steve Mosher,
Mad Scientist

Be brave, all must face their other; an insanity takes the anxiety.
Sometimes, the youth becomes absurd; the soul hides a strength.



------------------------------

Date: Tue, 17 Jul 2001 02:19:10 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: Esoteric Linux


> So, the goals of this project are twofold:
>
> - create a linux distro that can actually be installed on a machine and run
> - at the same time, make it as user-unfriendly as possible to annoy as many
> users as possible.
>
> What do you think ?

I think normal linux is pretty crazy by itself.  I never got my sound card
to work, and my mouse would do this weird jitter every once in a while.
Of course that was Mandrake 7.1.. maybe it would be normal in 8.  I am not
too hopeful tho :)

BTW, how fast/good is wine at emulating Windows apps?  If I ever take the
plunge again, I won't go without the Pirch98 IRC client.  Could it handle
the WinSock calls?

Jeff



------------------------------

Date: Tue, 17 Jul 2001 17:21:29 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: Esoteric Linux

On Mon, 16 Jul 2001, Gerson Kurz wrote:

> Goal: A new linux distro, that is as user-unfriendly as possible.
[...]
> What do you think ?

Well, my opinion is probably not of much value, because I'm not all that
interested in working on ESO, but in my opinion the idea is not so good.
This is why:

Anything is esoteric as long as people are not used to it. Some people are
used to Linux, some are not, and nobody seems to really understand how
esoteric Linux would be if proposed at a situation where there was no
history of Unix/Multix/whatever. As would be Lisp machines, Turing
machines, Windoser and the Mac OS.

When customising Linux with the choice of programs you ship with it,
you're actually only voicing your opinions (which many others will not
agree on) about which _commonly used_ programs are unusable and which are
not.

It's not hard to make things unusable. Binding '/' to search in vi does
not make it unusable, because people get used to that. (What's so
intuitive in the emacs binding? It clashes with XOFF. What about the
Windows binding? Why do they use ctrl as the modifier?) Changing vi
keymaps every other day does make it unusable. It's all about what you're
used to.

It would probably be interesting to find the "minimal Linux" you can do
everything with. Such projects already seem to exist, however. So maybe
that's not worth doing, either.

If you really want to make Linux esoteric, I propose changing the shell.

Panu




------------------------------

Date: Thu, 19 Jul 2001 11:27:08 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [calculators] [bf&bf] request for resources


The current working version of the archive, with the resources given thus
far, is available at http://esoteric.sange.fi/brainfuck/

Jeff was just working on a similar project when I posted the announcement
of the founding of the archive. So most of the stuff there are from his
draft archive.

Panu






------------------------------

Date: Thu, 19 Jul 2001 02:12:09 -0700
From: Brian Raiter <breadbox@muppetlabs.com>
Subject: [lang] Re: [calculators] [bf&bf] request for resources

> The current working version of the archive, with the resources given
> thus far, is available at http://esoteric.sange.fi/brainfuck/

Two quick notes.

1. The file quine/QUINEBF1.BF is my creation -- it doesn't have a
proper attribution because I never included one, so as to keep it a
proper quine. I'd like it to have a 1-line comment at the top just to
identify myself as the author, though. "* written by Brian Raiter"
would be plenty.

2. My factor program appears twice -- at lib/FACTOR2.BF and
prog/FACTOR.BF. Also it contains a spurious comment at the top that I
never wrote -- looks like this copy of the program was the version
that someone (I-forget-who) embedded in a Windows bitmap file? In any
case, it may be best to just get a copy of the original. The URL is
http://www.muppetlabs.com/~breadbox/bf/factor.b.txt.

Anyway, it looks to be pretty complete. Are you going to include
(pointers to) non-BF programs, such as compilers/preprocessors?

b




------------------------------

Date: Thu, 19 Jul 2001 16:02:47 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [calculators] [bf&bf] request for resources

On Thu, 19 Jul 2001, Brian Raiter wrote:

> 1. The file quine/QUINEBF1.BF is my creation -- it doesn't have a
> proper attribution because I never included one, so as to keep it a
> proper quine. I'd like it to have a 1-line comment at the top just to
> identify myself as the author, though. "* written by Brian Raiter"
> would be plenty.

Yes. The programs there are not properly attributed, because for the most
part I don't know who wrote what. I can add these comments about
authorship in the directory description as soon as I get to know about
them. (Were all of the QUINEBF* written by you?)

> case, it may be best to just get a copy of the original. The URL is
> http://www.muppetlabs.com/~breadbox/bf/factor.b.txt.

OK. I'll fetch that.

> Anyway, it looks to be pretty complete. Are you going to include
> (pointers to) non-BF programs, such as compilers/preprocessors?

Probably. There already are some, and I'll add them as I get them.

Panu






------------------------------

Date: Thu, 19 Jul 2001 16:16:02 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [calculators] [bf&bf] request for resources

On Thu, 19 Jul 2001, Panu A Kalliokoski wrote:
> On Thu, 19 Jul 2001, Brian Raiter wrote:
> > identify myself as the author, though. "* written by Brian Raiter"
> > would be plenty.

> I can add these comments about authorship in the directory description
> as soon as I get to know about them. (Were all of the QUINEBF* written
> by you?)

Oh, I see, you were talking about an in-file comment. Well, done now, as
is the second point.

Panu






------------------------------

Date: Thu, 19 Jul 2001 06:41:03 -0700
From: Brian Raiter <breadbox@muppetlabs.com>
Subject: [lang] Re: [calculators] [bf&bf] request for resources

>> 1. The file quine/QUINEBF1.BF is my creation -- it doesn't have a
>> proper attribution because I never included one, so as to keep it a
>> proper quine. I'd like it to have a 1-line comment at the top just to
>> identify myself as the author, though. "* written by Brian Raiter"
>> would be plenty.
> 
> Yes. The programs there are not properly attributed, because for the most
> part I don't know who wrote what. I can add these comments about
> authorship in the directory description as soon as I get to know about
> them. (Were all of the QUINEBF* written by you?)

No, just that one -- much as I might like to take credit for the one
that's shorter than mine.

> Probably. There already are some, and I'll add them as I get them.

I have two compilers for Linux ELF, though the second one is a bit
large (as it's meant to be more of a tutorial on creating ELF files).
Pointers to both are on http://www.muppetlabs.com/~breadbox/bf/.

b




------------------------------

Date: Thu, 19 Jul 2001 07:51:18 -0600 (MDT)
From: Ben Olmstead <bolmstea@Mines.EDU>
Subject: [lang] Re: [calculators] [bf&bf] request for resources

On Thu, 19 Jul 2001, Panu A Kalliokoski wrote:

> On Thu, 19 Jul 2001, Brian Raiter wrote:
>
> > 1. The file quine/QUINEBF1.BF is my creation -- it doesn't have a
> > proper attribution because I never included one, so as to keep it a
> > proper quine. I'd like it to have a 1-line comment at the top just to
> > identify myself as the author, though. "* written by Brian Raiter"
> > would be plenty.
>
> Yes. The programs there are not properly attributed, because for the most
> part I don't know who wrote what. I can add these comments about
> authorship in the directory description as soon as I get to know about
> them. (Were all of the QUINEBF* written by you?)


BFC.BF was written by Ryan Kusnery, who I am 90% certain isn't
subscribed to this list.

I appear to have lost all of my BF stuff (every one of the five or six
compilers and interpreters I wrote, my own BF programs, such as 99BoB
(which Panu appears to have found the original version of, as opposed to
the creditless version on the 99BoB page).  Ah well.

Looking through some stuff, I do have a number of miscellaneous code
snippets & small programs, not all of which are available on the web,
and not all of which I wrote.  Is there an archive somewhere I could
dump them all?

                                          Ben Olmstead
                                          bem@mad.scientist.com

Inertia: Simple.  Addictive.  Free.
http://www.mines.edu/students/b/bolmstea/games/inertia/





------------------------------

Date: Fri, 20 Jul 2001 15:05:11 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [brainfuck] opened archive


I've now publicly opened the brainfuck resource archive. The archive is
available at http://esoteric.sange.fi/brainfuck/

Comments, entries, ideas and claims of authorship are welcome.

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Fri, 20 Jul 2001 18:14:58 +0200
From: Bertram Felgenhauer <bf3@mail.inf.tu-dresden.de>
Subject: [lang] Re: [calculators] [bf&bf] request for resources

Brian Raiter wrote:
> > Yes. The programs there are not properly attributed, because for the most
> > part I don't know who wrote what. I can add these comments about
> > authorship in the directory description as soon as I get to know about
> > them. (Were all of the QUINEBF* written by you?)
> 
> No, just that one -- much as I might like to take credit for the one
> that's shorter than mine.

Hmm, that one (quinebf.bf) was written by me; maybe you're interested in
the (more or less complete) history of that quine (the first version is
maybe 2 or 3 years old by now; from time to time I've made improvements)
at
   http://www.inf.tu-dresden.de/~bf3/quine/brainfxxx/

(The bootstraps require a brainf*** version where EOF is translated to -1
(which, I think, was the originally intended behaviour, judging from the
translation from brainf*** to C ( , --> a[p]=getchar(); )) and at least
some of them need a 16 bits bf variant to run.)

I also have this rot13 program:
,+[-->++++[>++++++++<-]<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>--[-[>
-<[-]]]>+[-<+++++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>[-]+>[<--
>-[<+>-]]<[<<<<+++++++++++++>>>>-]]<<[-]<<+.[-]<,+]

(http://www.inf.tu-dresden.de/~bf3/brainfxxx/rot13.bf includes a commented
version and some older versions)

and another implementation of SORT.BF (based on the one you already have:)
>,+[>,+]<[[[->>+>>-[<]<<<]>[<]<[->>>>+<<<<]>>[>+>+<<-]<<<]>>>>-.[-]>[>]<]

Finally,
  http://www.inf.tu-dresden.de/~bf3/brainfxxx/bfc2.zip
contains an 136 bytes large brainf*** compiler for DOS implementing
the 16 bit variant where EOF is translated to -1, and
  http://www.inf.tu-dresden.de/~bf3/brainfxxx/bfi.zip
a 98 bytes large interpreter for DOS, implementing the same variant.
These two implementations also do CR/LF <==> LF conversion (under
the assumptions that raw CRs do not occur [*]) (Note to self: I should
add an assembly time switch to disable that feature)

regards,

Bertram

[*] this has the effect that .+[.+] ends up in an infinite loop, printing
00 01 02 03 04 05 06 07 08 09 0D 0A 0B 0C 0D 0A 0B 0C etc.

-- 
          `\_`-._,._-'(           ,
._.-.      _,\   /__`--'c_.-;   .dP"  ,
    \`.__,',--) /' \`--._-<_, d8Bb."b, `
-bf- `-..-'  /-'   `/`   `--'  "oP"" `




------------------------------

Date: Mon, 23 Jul 2001 02:47:37 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: various (was Re: ESO (was Re: [www] Re: various))

Panu A Kalliokoski wrote:
> > Hmmm... come to think of it, CVS itself could be abused as a chat
> > protocol, with full history keeping no less :)
> Well yes, except that CVS' locking is ill-suited for chatting. :)

Heh... couldn't we use mergemaster to get around that? :)

btw, I agree that an esoteric shell is far more feasible than either
writing an esoteric operating system or making an esoteric Linux dist
(both are huge tasks; while I smile at the changes Gerson proposes, I
wonder how many of them could actually be made before everything starts
breaking big-time.)

But then it probably shouldn't be called an OS, 'cause that'd just be
lame.  It'd be, like, 'esosh, the esoteric shell,' or something.

John Colagioia wrote:
> > And the linking need only be dynamic the first time - like a JIT
> > compiler.  Statically linked copies could be cached for subsequent use.
> > I don't know how much this would improve system performance, but I think
> > it would be worth trying.
> If you mean "between sessions" caching, usually not worth it.  Caching
> "to the end of the session" usually works well enough, though.

The way I see it, there are only two times when it has to be cached;
when the program is first installed, and whenever the cache is cleared,
for whatever reason (e.g. the program has been changed in development,
or upgraded.)

> > I guess I mean that these functions ("compress" and "undo" to take the
> > most overt examples) are so basic, they should actually exist somewhere
> > below the file system, rather than above it.  For example, what if you
> > store a DLL in a folder which is actually a compressed archive?  (Can
> > you store the compression codec DLL itself in such a place? :)  Making
> > them optional components might actually be a drawback on the entire
> > system, as for any given system you couldn't be guaranteed they'd
> > actually be there...
> I suspect Russell described it that way, not for the purpose of not
> installing codecs one doesn't want, but rather for future
> expandability.  Which is good, since it'd be inconvenient to have to
> install a new version of the operating system every time some fool
> publishes a new encryption algorithm.

If that encryption algorithm is to become a *standard* part of the
operating system, that's essentially what has happened.  Operating
systems are really more like programming languages than programs: sets
of standards.  Modularity pulls both ways.

> > It might be nice to know what the hell we want to use computers *for*,
> > though, instead of just exalting in the throes of "wow, that's neat"
> > hype.  The problem with these machines is that they're just too damned
> > general-purpose :)
> It's always been my understanding that "wow, that's neat" *is* what
> the things are for.

I tend to see things such as GIS/GPS, fingerprint identification,
industrial automation, etc as more than just "neat."

Chris

-- 
A pentagon has four sides.


------------------------------

Date: Mon, 23 Jul 2001 22:48:46 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: [lang] [bf] [impl] [interp] [old junk] TI-99/4A

Hi!

When my brain runs out of juice I usually write an interpreter.. here's
one for the TI-99/4A.  It's kinda sloppy but gets the job done.

I have a few extra 99's collecting dust.  If anyone is interested in one,
let me know..say maybe, free? (plus shipping) :)

Jeff

---8<---CUT HERE----------------------------------------------------------
BF interpreter for the Texas Instruments TI-99/4A computer
Programmed by Jeffry Johnston
Press FCTN+4 to Break
To save on cassette type: SAVE CS1
To load type: OLD CS1

1 DIM M(1000)
2 IP=0
3 MP=0
4 Q=0
5 GOSUB 100
6 CALL CLEAR
7 IP=IP+1
8 IPV=ASC(SEG$(P$,IP,1))
9 MPV=M(MP)
10 IF IPV<>64 THEN 12
11 Q=1
12 IF IPV<>60 THEN 14
13 MP=MP-1
14 IF IPV<>62 THEN 16
15 MP=MP+1
16 IF IPV<>43 THEN 18
17 M(MP)=MPV-256*INT((MPV+1)/256)+1
18 IF IPV<>45 THEN 20
19 M(MP)=MPV-256*INT((MPV+255)/256)+255
20 IF IPV<>46 THEN 22
21 PRINT CHR$(MPV);
22 IF IPV<>44 THEN 25
23 CALL KEY(0,M(MP),STATUS)
24 IF STATUS=0 THEN 23
25 IF IPV<>93 THEN 30
26 DIR=-1
27 GOSUB 50
28 IP=IP-1
29 IPV=0
30 IF IPV<>91 THEN 34
31 IF MPV<>0 THEN 34
32 DIR=1
33 GOSUB 50
34 IF Q=0 THEN 7
35 END
50 LVL=1
51 IP=IP+DIR
52 IPV=ASC(SEG$(P$,IP,1))
53 IF IPV<>91 THEN 55
54 LVL=LVL+DIR
55 IF IPV<>93 THEN 57
56 LVL=LVL-DIR
57 IF LVL>0 THEN 51
58 RETURN
100 P$="++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------."
101 P$=P$&"--------.>+.>.@"
102 RETURN

The "Hello World!" test takes 1 minute 15 seconds to run with this
interpreter :)





------------------------------

Date: Tue, 24 Jul 2001 15:16:45 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: IRC etc

Has anyone organized an esoteric IRC meeting place yet?

What would everybody here think of using a MUSE instead?  I have several
reasons for suggesting it but suffice to say that it's a superset of
chat, so I don't see why not.

Chris

-- 
"Birthday Card...!  RETURN TO YOUR POWER CONFINED!!!"


------------------------------

Date: Wed, 25 Jul 2001 02:45:16 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Re: IRC etc

At 03:16  24/07/2001 -0500, Chris Pressey wrote:
>Has anyone organized an esoteric IRC meeting place yet?

Ok, being rather drunk and having been fobbed off by two women and being 
pretty depressed about it, I wish somebody had by now too. I'm sort of 
happy I mentioned the IRC thing. It'd be great. Especially, oh wait. I'm 
six hours ahead of half the people on the list and  2 hours behind the 
rest. Who else is on GMT, or up when I'd be at work? (11am GMT to 11pm GMT 
- long working hours, but I don't mind).

I'd be nice to know there was somebody around. That way I could whine like 
a pussy! :)

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.

"Reasonable people adapt themselves to the world. Unreasonable people 
attempt to adapt
  the world to themselves. All progress, therefore, depends on unreasonable 
people."
                                                                 -- George 
Bernard Shaw



------------------------------

Date: Wed, 25 Jul 2001 02:46:39 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Drunk and not caring...

Ok, big mailing coming up when I have time...

I know I'm going to feel embarrassed about this in the morning...

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.

"Reasonable people adapt themselves to the world. Unreasonable people 
attempt to adapt
  the world to themselves. All progress, therefore, depends on unreasonable 
people."
                                                                 -- George 
Bernard Shaw



------------------------------

Date: Wed, 25 Jul 2001 02:47:45 +0100
From: Keith Gaughan <keith@digital-crew.com>
Subject: Women

It's puzzled me up until now why there's no women on the list. Any thoughts?

K.

-- 
Keith Gaughan <keith@digital-crew.com>
Software Developer, Digital Crew Ltd.

"Reasonable people adapt themselves to the world. Unreasonable people 
attempt to adapt
  the world to themselves. All progress, therefore, depends on unreasonable 
people."
                                                                 -- George 
Bernard Shaw



------------------------------

Date: Tue, 24 Jul 2001 20:39:33 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: IRC etc


I hang out on EFNet when I am home, nick: calamari.

But, I can also stay in undernet
irc.undernet.org port 6667
channel #esolang

I'll see ya there

Jeff


On Wed, 25 Jul 2001, Keith Gaughan wrote:

> At 03:16  24/07/2001 -0500, Chris Pressey wrote:
> >Has anyone organized an esoteric IRC meeting place yet?
>
> Ok, being rather drunk and having been fobbed off by two women and being
> pretty depressed about it, I wish somebody had by now too. I'm sort of
> happy I mentioned the IRC thing. It'd be great. Especially, oh wait. I'm
> six hours ahead of half the people on the list and  2 hours behind the
> rest. Who else is on GMT, or up when I'd be at work? (11am GMT to 11pm GMT
> - long working hours, but I don't mind).
>
> I'd be nice to know there was somebody around. That way I could whine like
> a pussy! :)
>
> K.
>
> --
> Keith Gaughan <keith@digital-crew.com>
> Software Developer, Digital Crew Ltd.
>
> "Reasonable people adapt themselves to the world. Unreasonable people
> attempt to adapt
>   the world to themselves. All progress, therefore, depends on unreasonable
> people."
>                                                                  -- George
> Bernard Shaw
>
>
>



------------------------------

Date: Tue, 24 Jul 2001 23:57:54 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: Women

Keith Gaughan wrote:
> It's puzzled me up until now why there's no women on the list.

Errrr - do you mean by that, that it *did* puzzle you, but *now*, it
*doesn't* puzzle you?  If so please, elucidate the rest of us :)

> Any thoughts?

'Cause they're too busy being barefoot & pregnant in the kitchen, as
decreed by Society<tm>? :)

There used to be Galit, but I haven't heard anything from purists.org
for a long time now -- possibly they got (justifiably) frightened off
back when I exploded.

I dunno, man, going way back... the word "computer" used to refer to a
position of employment - a lot like a switchboard operator, except using
them wires to compute trig functions an' stuff instead of to coordinate
phonecalls.  And in those days of yore, most computers, like switchboard
operators, were women...

But apparently, when the electronic computer took over, in the early
days of computer science, the 1950's and such, there wasn't really any
sex bias.  No moreso than any other branch of "science"...

But shortly thereafter... computers began to be regarded as 'boy toys.' 
I don't know why.  Nor do I know why that would happen to coincide with
the Women's Lib movement -- seems backward.  Anyway, there was a sharp
drop-off around then, through the sixities seventies and eighties.

Lately it's seemed to spring back a bit - society seems to want to
orient itself towards sexual equality (knock on wood) - but when I was
in university back in the early nineties, the ratio was easily 90% male
to 10% female.  At least, maybe more like 95%/5%.

I don't know why it is.  Maybe because women are encouraged to be pretty
and vapid and complacent - qualities that are absent and in fact
discouraged in our neck of the woods, where things are ugly and involved
and where, if you don't have a critical mind you'll be swept up in the
hype, not to mention the outright lies.

There's that whole "men are better at spatial relationships, women are
better at thematic relationships" argument - but I don't buy that -
maybe as an excuse for why there are more male auto mechanics than
female - but computer programming isn't as much like auto repair. 
There's a lot more thematic connections going on here...

In conclusion... *shrug*.

Chris

-- 
"What do you know?  There's *dirt* under this grass!  I don't think
anyone's vacuumed this lawn in *years*!"


------------------------------

Date: Tue, 24 Jul 2001 22:17:52 -0700
From: Russell Bornschlegel <kaleja@estarcion.com>
Subject: Re: Women

Keith Gaughan wrote:
> 
> It's puzzled me up until now why there's no women on the list. Any thoughts?
> 

Well, there may be some lurking women -- hard to know for sure. And
I don't actually have a mental heuristic for predicting the gender of
the owner of, e.g., a Finnish name, so I can't even say with certainty
about, say, Panu. 

But, assuming there are in fact no women on the list, I'd guess that
the reasons are the same reasons women are relatively rare in 
programming in general, only more so. 

Fundamentally, I think that the problem is societal reinforcement of 
a "broken symmetry" -- at some point, more men than women had 
"tendencies toward the programming mindset", a vague and complex 
thing, whatever it is. I believe that geeks predated computers (e.g. 
Alan Turing) and that the programming mindset exists independenty 
of anything to program on, incidentally. Societal observations of 
more geek men than geek women lead to societal expectations of the 
same. Societal expectations of certain behavior patterns lead to 
societal pressure to fulfill those expectations - women with 
individual tendencies toward the programmer mindset get held back, 
ostracized, or discouraged from followng that path, while the same 
tendencies in men are at least tolerated. 

What broke the symmetry? Personally, I suspect a sex-linked innate
tendency that might itself be very very small, almost small enough
to be swamped by individual variation, but just large enough to 
break the symmetry. My fiancee, a bio major, thinks I don't know
enough about development, evolution, or neurology to back that
up, and she's right. In any case, no value judgement on such a 
tendency should be inferred. 

I estimate that you have to pass about twice as many "geek filters" 
to cope with this list as you do to simply be a programmer. Thus, 
to estimate the expected number of women on the list, take the ratio 
of male to female programmers in the real world, square the ratio, 
apply to the total number of people on the list. I think zero is 
well within a standard deviation of the result.

Anecdotal data yielding no conclusions: I'm on the periphery of 
something that sometimes calls itself the "Bay Area geek community" 
-- a nebula of people mainly in their 20s and early 30s, most of 
whom attend/attended University of California at Santa Cruz or UC 
Berkeley and now live and work in the San Francisco Bay Area. Almost 
all are college educated, all _by definition_ are comfortable using 
computers as social tools (chat, email, forums)[1]. All grew up in 
the golden age of personal computing, many near or in Silicon Valley. 
Most have jobs somewhere in the tech or web industries.

At a guess, I'd say that 50% of the the men are either professional
programmers or sysadmins. For the women, I'd say it's under 10%, 
maybe under 5%. However, many of the women outside of that minority 
are perfectly able to admin their own boxes or program casually or 
deal with CGI scripting in the course of their web-related jobs. 
They're intelligent and can and do go to their male geek friends 
to ask for "fishing lessons" rather than "gifts of fish". I can't
pin down any particular reason to explain why so few of the women 
go the hardcore programmer route. 

-RB

[1] The Jargon File entry "person of no account" claims UC Santa
Cruz as the point of origin. Besides being a brilliant pun, it 
says a lot about the geek scene.


------------------------------

Date: Tue, 24 Jul 2001 22:32:28 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: IRC etc


Well no one is there.. did I scare you all away?

:)

Jeff


On Tue, 24 Jul 2001, Jeff  Johnston wrote:

>
> I hang out on EFNet when I am home, nick: calamari.
>
> But, I can also stay in undernet
> irc.undernet.org port 6667
> channel #esolang
>
> I'll see ya there
>
> Jeff
>
>
> On Wed, 25 Jul 2001, Keith Gaughan wrote:
>
> > At 03:16  24/07/2001 -0500, Chris Pressey wrote:
> > >Has anyone organized an esoteric IRC meeting place yet?
> >
> > Ok, being rather drunk and having been fobbed off by two women and being
> > pretty depressed about it, I wish somebody had by now too. I'm sort of
> > happy I mentioned the IRC thing. It'd be great. Especially, oh wait. I'm
> > six hours ahead of half the people on the list and  2 hours behind the
> > rest. Who else is on GMT, or up when I'd be at work? (11am GMT to 11pm GMT
> > - long working hours, but I don't mind).
> >
> > I'd be nice to know there was somebody around. That way I could whine like
> > a pussy! :)
> >
> > K.
> >
> > --
> > Keith Gaughan <keith@digital-crew.com>
> > Software Developer, Digital Crew Ltd.
> >
> > "Reasonable people adapt themselves to the world. Unreasonable people
> > attempt to adapt
> >   the world to themselves. All progress, therefore, depends on unreasonable
> > people."
> >                                                                  -- George
> > Bernard Shaw
> >
> >
> >
>
>
>



------------------------------

Date: Wed, 25 Jul 2001 03:28:41 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: [lang] [bf] [utils] Text -> BF generator 

Hello!

I know I asked for a Text generator before, and I got a couple cool ones!
Unfortunately all my e-mails were lost along with them, even the commented
source files :( (maybe they are in the archive now?).

I decided to revamp my old one (pretty specialized before and the output
was horrible outside that specialty) and it seems pretty decent, although
I'd like to compare its output to the others if they are still around.
My "Hello World!"<LF> weighs in at 115 bytes compared to the nifty 111 in
HELLOUM.BF (that 111 is the smallest I've seen, maybe the smallest?).

Here is the hello world program (115 bytes):
++++++++++[>+++++++>++++++++++>+++++++++++>+++>+++++++++>+<<<<<<-]>++.>+.>-=
-..+++.>++.>---.<<.+++.------.<-.>>+.>>.

And here is the source to the Text generator, run it thru BF to make it
more clear :)

Enjoy,
Jeff

+++++++++++++[>+++>++++++>+++++++++>++++++++>++++++>++++<<<<<<-]>.>++.>---.=
---.>-.<+++.>------.<-----..>++++.-.<<<-------.>>>--.<++++++++++++.<<.>>>>-=
---.<+++.+..<-------.+++++++.<<.>>>>.<+++++++++.-------.++++++.+++++.+.----=
-.-.>>>+++++++++++++.---.<<<<<<+++++++.>>>>.<<----.>--.<++++.<<-------.>>>>=
>--.+++.---------.<<<<<.>>>>>++++++.--..+.>+++.---.<<----.<<<<++++.----.>>>=
>---------.<<<<.>>>>++++++.<<<-.--..>>>--.<<<+.>>>+++.<<<<++++.>>>>>+++++++=
++.<<<<<----.>>>>.<<<+.<.>++++++++.>>>++++.+.+++.-------.<<<<.>>>>+.<<<<+++=
+.----.>>>>>+++.<<<<<.++..>>>>>---.<<<<<--.>>>>+++.+++++.++.<<<--.-.<.++.>>=
>>----------.<---.+++.-------.+++++++++.-------------.++++++++++++.--------=
=2E>>.<<<<<--.++.++++++++++.------------.>>>>.<<<<++++.>>>>>.<<<<<----.>>>>=
++++++.+++..+.>>+++.---.<<-.+.-----------.<<<------.<.>>>>+.<<<<++++.----.>=
>>>.<<<+.+++.<.>>>>----.+++++++.<<<----.>>>>+++++++.<<<<++++.+++++++.<.>>>>=
>.<<<<------.<.+++.++++++++++++++.>>>>>-------.<<<<<-----------------.>>>>>=
+++++++.<<<<<++++.----.>>>>>----.<<<<<.>>>>.+++++.++.<<<++.-.<++++.++++.>>>=
>----.+++.---------.<<<<.+++++++++.--------.+++.------------.>>>>>---------=
---.--------.<------------.<<<<.>>>>+++++++++.<<<--------.+++.++++.>>>++.<<=
<<.+++.>>>>>++++++++.>+++.---.<<<<<----.+.>>>.<<<--.<---.++.>++++++.>>>.<<<=
++++.----.>>>>---.<---.++++.<<<<.--.>>>>.<<<-----.+++.<.>---.++++++.-.----.=
+++++.-.<.>>>>-----.<<<-.<.+++.>>>>>+++.>+++.---.<<+++.+.+.+++.+++++.<<<+.<=
---.>>>>-------------.>----.<<<<++++++.>>>>>+++.---.<<+++.+++++.++++.<<<<.>=
>>>+++++.>-----.++++++++++++++.<<<<<+++++++++.+++.------------.>>>>>+++++++=
++++.<<<<<++++++++.>>>>>-----------.<<<<<+.+++.------------.>>>>-----------=
-.<<<<++++++++.>>>>>.<<<<<+.+++.------------.>>>>++++++.<<<<++++++++.>>>>>+=
=2E<<<<<+.>>>>>+++.<<<<<---------.>>>>+++.<<<<.>>>>>+++.<<<<<.>>>>>--------=
-----.>+++.---.<<<<<<+++++++.>>>-.+.<-----.>.<--.-----.----.+++++.>.<<<----=
---.>>+++++++++.>+++.+.------.+++++.<<<.>>>-----.+++++.-------.<-----.>.++.=
<++.>++.<--.+.<<.>>.+.>----.<--.++.<<.>>>++++++++.+++++.<<<.>>>---------.--=
--.++.+++++.<<<.>>--.<+++++++.>----.>-.--.>>>+++.---.<<---------.+++++++++.=
+++.<<<<.>>>>-----------------.<<<<.>>>>----.<<<<.>>>>>+.<<<<<.>-----------=
--.-----.<.>---.-------.+++++++++.<++++++++.>>>>++++.<<<<----.+++++.>>>>>>+=
++.---.<<<<<<---------..>>>>+.<<<<.>>>>-----.<<<<.>>>>++++.<<<+++++.>>>++.<=
<<<++++++++.>------.----.>>>+.<<<<----.++++.>>>>---.<<<<----.>>>>>-----.<<<=
<<----.>>>>.>.<<<<<.>>>>>+++++.--------..>+++.---.<<<<<<..>+++++++++.>>>+++=
+.<<<+.+.-----.+++.>>>.>>+++.---.<<<<<<..>>>>+.<<<---.+++.<.>>>>---.<<<<.>>=
>>------.<<<<.>>>>>+++++++.<<<<<.>++.-----.<.>>>>>++++++.>+++.---.<<<<<<...=
=2E>+++.>>>++++++++.----.+++.<<<<.>+.>>>>----------.<<<<<.>>>>+.>>+++.---.<=
<<<<<....>>>>++++.---.<<<<.>-.>>>>----.<---.>+.<<<<<.>>>>------.<<<<.>>>>>+=
++++++.<<<<<.>>>>++++.<<<----.>>>+++.<<<<.>>>>--.<<<<.>>>>----.-.<<<<.>++++=
+.<.>>>>++++.<<<-----.>>>+++.<<<<.>>>>--.<<<<.>>>>------.+.<<<<.>>>>+++++++=
+.<<<<.>++++++.>>>+++.---.<<<------.<.>++++.<++++++++.>>>>--.<<<<+.--------=
-.>>>>------.<<<<.>>>>>+.<---.<<<<.>>>>+++++++.<<<<++++++++.>---.<+.-------=
--.>>>>----.<<<<.>>>>+++++.--------.<<<<.>.<.>>>>+++.<<<<.>.<.>>>>>------.<=
<<<<.>>>>>++++++.>+++.---.<<<<<<..>-.>>>++++++++.<<<++++++++++.----.<.>>>>-=
-.>>+++.---.<<<<<------.>>>++.<<<++++++++++.----.<.>>>>----.>>+++.---.<<<<<=
-----.<.>>>>----.<<<<.>.<.>>>>>----.<<<<<.>>>>>++++.<---.<<<<.>---.<.>>>>++=
+.<<<<.>>>>>.-...<---.<<<<.>+.<.>>>>+++.<<<<.>>>>>.>+++.---.<<<<<<+++++++.>=
>>+.+++.<.>-----.<<<-------.>>++++++.>++++.---.<<<.>>>---.+++.<-.+.<<.>>---=
----.++++++++.>+++++++.<-.>---.<----.>+++.---.------.--.<--.>+++.<+++++.>>>=
>+++.---.<<<<<-------.+++++++++.+++.<.>>>>++++.<<<<.>>>>----.<<<<.>>>>>+.<<=
<<<.>++.-----.<.>>>>>++++.-----.>+++.---.<<<<<<..>>>>++++++++.<<<<.>>>>----=
----.<<<<.>>>>>.<---.<<<<.>--------.<.>>>>+++.<<<<.>>>>++++.>>+++.---.<<<<<=
<..>-.+++++++++.+++.<.>>>>+.<<<<.>>>>-----.<<<<.>>>>>.<<<<<.>++.-----.<.>.>=
>>>>+++.---.<<<<<<....>---------.<++++++++.>----.<+.---------.>>>>.<<<<.>+.=
++++++.+++++.++++++.<++++++++.>>>>++++.<<<<.>>>>+.<<<<+.---------.>>>>>-.<<=
<<<.>>>>-.>------.<-------.<<<<.>-------------.<.>>>>+++.<<<<.>.<.>>>>>++.<=
<<<<.>-.>>>>---.<<<<----.>>>>+.>+++.---.<<<<<<....>+++.<.>>>>.<<<<.>.<.>>>>=
>++.<<<<<.>----.+.+++++++++++++++++.>>>>---.<++++.>.<+.>+.<<<<<.>>>>>++++.<=
<<<<.>>>>-.<<<<.>>>>>---.<<<<<.>>>>+++++.>--.<----.>+..>+++.---.<<<<<<..>--=
---.>>>+++.<<<++++++++++.----.<.>>>>---.>>+++.---.<<<<<<..>>>>+++.<<<<.>>>>=
--------.<<<<.>>>>++++++++.<<<<.>>>>>++.<<<<<.>>>>++.>>+++.---.<<<<<<..>>>>=
++.---.<<<<.>>>>-.<<<<.>>>>---------.<<<<.>--------.<.>++++++++.-----------=
-.---.+++++++++.<.>--.<.>>>>+.<<<<.>-------.>>>---.<<<<.>++++++++.<.>>>>+++=
=2E<<<<.>>>>++++.-------.<<<<.>-------.+++++++++.+++.<.>>>>++++++++.<<<<.>>=
>>-----.<<<<.>>>>>+++++.<<<<<.>++.-----.<.>>>>>++++++.<---.<<<<.>---.<+++++=
+++.>>>>++++++++.<<<<+.---------.>>>>-----.<<<<.>------.<++++++++.>----.<+.=
>>>>---.<<<<---------.>++++++++++++.---------.>>------------.----.<<<.>---.=
>>>>>+++.---.<<<------.<<+++.>>++++++++++.----.<<<.>----.>>>>>+++.---.<<<<<=
<+++++++.>>>++++++++++++++.<++.>+++++++.+++.--------.<<<-------.>>-.>++++.-=
--.<<<.>>-------.++++++++.>+++++++.<-.>---.<----.>+++.---.------.--.<++++.>=
++++++++.<-----.-.<<.>>+++++.+.--.>.<----.>--.>>>+++.---.<<<<<<+++++++.++++=
=2E.........>>>------------.<<---.<.......>.<..........>.<...>.<.>--....<++=
=2E>>>++.<<++.>>>>>+++.---.<<<-------------.++.---------.+++++.++++++.<<<--=
-----------.+++.>>>>>-----.-----.<<<<<---.>>>-.+.--.---------.+++++.-------=
=2E<<<++++.++++.>>>++++++.>>.<<<<<--------.++.>>>>>-.<<<<<.>>>>>--.<<<<<--.=
>>>>>++.<<<<<.++.>>>++++++++++++++.<<<.>>>>+.>>+++.---.<<<<<++++++++.++++++=
+++.+++.<--.>>>>++++++++.<<<<.>>>>------.<<<<.>>>>>+++++.<<<<<.>++.-----.<.=
>.>>>---.<<<<.>+.++.---------.+++++.++++++.<.+++.>>>>>+.-----.<<<<<---.++.>=
>>>++++.<<<<.--.>>>>>-.<<<<<.>-.+.--.---------.+++++.-------.<++++.>>>>>---=
=2E<<<<+++++.>>>>.<+++++.>+.+++.<<<<<----.++.>>>>>-.<<<<<.>>>>>--.<--------=
=2E<<<<--.>>>>-.<<<<.>.>>>>-.<<<<---------.>>>>+.<<<<<.>>>>+++.<<<<.>++++++=
+++.>>>>-.<++++++.>+.<<<<<.>>>>>+.<<<<<.>+.>>>---------.<<<<.>+.---------.>=
>---.----.<<<.>--.>>>>>+++.---.<<<----.++.<<++++++.>>----.++++++.<<<.+++.>>=
>>>+++++++.-----.<<<<<---.>>>-.+.--.<<.>>----.<<--.<++++.++++.>>>+.<<<-----=
---.>>>>>-.<<<<<.>>>>>++++++.-----.<<<<<.++.>>>>++.<<<<.>>>>>---.<<<<<--.>>=
>>>++.<<<<<.++.>>>>>++.<<++++++++++++++.>++.<<<<.>>>>---.>>+++.---.<<<<<<++=
+++.>>+.++++++.-.----.+++++.-.<<-------.>>.>+++++++++++.---.<<<.>>--.>.<+.+=
=2E>>>>+++.---.<<<<<+++++++++.<.>>>>++.<<<<.>>>>>+++.>+++.---.<<+++++++++.<=
<<-.+++.<.>>>>-----.<<<<.>>>>----.<<<<.>>>>>+.<<<<<.>++.-----.<.>---.------=
-.+++++++++.<++++++++.>>>>++++.<<<<----.+++++.>>>>>>+++.---.<<<<<<---------=
=2E.>>>>+.<<<<.>>>>-----.<<<<.>>>>++++.<<<+++++.>>>++.<<<<++++++++.>------.=
----.>>>+.<<<<----.++++.>>>>---.<<<<----.>>>>>-----.<<<<<----.>>>>.>.<<<<<.=
>>>>>+++++.--------..>+++.---.<<<<<<..>+++.<.>>>>----.<<<<.>>>>>+++++++++.+=
++..<---.<<<<.>+.<.>>>>+++.<<<<.>>>>>-----.>+++.---.<<<<<<..+++++++.>>>-.+.=
<.>.<--.-----.----.+++++.>.<<<-------.>>++++++.>+++.---.<<<.>>>---.+++.<-.+=
=2E<<.>>++.>----.<----.>++++++++.--------.+.<------.>+++.<<<.>>++++++++.---=
--.<<.>>++++++.--.>.>>>+++.---.<<<<<<..>-------.+++++++++.+++.<.>>>>++++++.=
<<<<.>>>>------.<<<<.>>>>>.<<<<<.>++.-----.<.>.<.>>>>>-----.<<<<<.>>>>>++++=
++.>+++.---.<<<<<<....>>>>++++++++.<<<<.>>>>--------.<<<<.>>>>++++.+.<<<+++=
+.<++++++++.>-------.<.>>>>+.<<<<+.---------.>>>>>----.<<<<<.>>>>-.>----.>+=
++.---.<<<<<<....>---.---.<.>-.<.>>>>------.<<<<.>+++++++.<.>+++.+++.<.>>>>=
>-.<+++++++++.<<<<.>>>>---------.+.<<<<.>------.<.>>>>++++.<<<++.>>>+++.<<<=
<.>>>>-.<<<<.>>>>------.<<<<.>++.>>>>+.<<<<<.>++++.>>>+++++++++++.---.<<<--=
----.<.>-.<.>>>>--------.<<<<.>>>>++++++.---------.<<<<.>-.<.>>>>+++.<<<<.>=
-------.>>>>>+++.---.<<<<<<..>+++++++++.>>>++++++++.<<<++++++++++.----.<.>>=
>>--.>>+++.---.<<<<<<..>>>>>--.<<<-----.>..-.<<<.>>++++++.-----.<<.>>--.++.=
+++++++.>+.>----.>>+++.---.<<<<<<..>>>>++++++++++.---.<<<<.>-------.<.>>>>-=
---------.<<<<.>+++.<.>++++.------------.---.+++++++++.<.>++.++.---------.+=
++++.++++++.<.+++.>>>>>++++++++++.-----.<<<<<---.>-.+.--.---------.+++++.--=
-----.<++++.++++.>+++++++++.<--------.>>>>>+.<<<<<.>---.>>>>-.<<<<<.++.>>>>=
=2E<<<<.>>>>>---.<-.>>+++.---.<<<<<<--..>----.---.<.>+++++++.<.>>>>+++.<<<<=
=2E>+++.<.>++++.>>>++++++++++.---.<<<------.<.>++.++.>>>++++.<<<----.++++++=
=2E<.+++.>>>>>++++++++.-----.<<<<<---.>-.+.--.>>>.<<<----.>>>--.<<<<++++.++=
++.>-.<--------.>>>>>+.<<<<<.>+++.>>>>-.<<<<<.++.>>>>---------.<<<<.>>>>>--=
-.<---.>>+++.---.<<<<<<--..>.<.>>>>++.<<<<.>---.>>>>>+++.---.<<<<<<..>>>>>-=
-.<<<--------.>..-.<<<.>>++++++.-----.<<.>>>---.+++.<-----.+++++++++++.--.+=
=2E<<.>>++.>---.<----.>++++++++.--------.+.<------.>+++.>++.>>+++.---.<<<<<=
<..>----.---.<.>>>>+++.<<<<.>>>>------.<<<<.>++++++.>>>>+.<<<<++++.>>>>+.<<=
<<<.>++++.------------.---.+++++++++.<.>++.++.---------.+++++.++++++.<.+++.=
>>>>>++++++++.-----.<<<<<---.>-.+.--.---------.+++++.-------.<++++.++++.>++=
+++.<.>++++.<+.---------.>>>>>+.<<<<<.>>>>++++++.>-.<<<<<.++.>>>>>+.<<<<<.>=
>>>>----.<-------.>>+++.---.<<<<<<--..>-------.---.<.>----.<.>>>>+++.<<<<.>=
++++++++++.>>>>-.<<<<++++.>>>>+.<<<<<.>++++.>>>++++++++++.---.<<<------.<.>=
++.++.>>>++++.<<<----.++++++.<.+++.>>>>>++++++++.-----.<<<<<---.>-.+.--.>>>=
=2E<<<----.>>>--.<<<<++++.++++.>>>>-----.<<<<--------.>>>>>+.<<<<<.>--.>>>>=
-----.<<<<++++.>>>>+.+++.<<<<<.++.>>>>>-.<<<<<.>>>>>--.<-------.>>+++.---.<=
<<<<<--..>----.>>>>-.<<<<++++.>>>>+.<<<<<.>>>>++.<<<<.>>>>+++++.>>+++.---.<=
<<<<<..>.++.>>>+++++++.<<<----.++++++.<.+++.>>>>>++++++++.-----.<<<<<---.++=
=2E>>>>>++.<<<<<.>>>>>+++++++++++++.>+++.---.<<+++++.---------.<<<++++.----=
=2E<--.>>>>----.>>+++.---.<<++.<<<--------.+++.++++.>>>++.<<<<.+++.>>>>>---=
-------.>+++.---.<<.<<<-----.>>>-.>>+++.---.<<<<<<++++.>>++++++++.>.<++++.-=
---.<<-------.>>--.>----.<----.>++++++.--.<+++++.<<.++++++++.>>-----.+.++++=
+.<<--------.>>>----.<--------..<<.>>++.>++++..-.<<<.>>++++++.-----.<<.>>>-=
-.+++.<<<.>>++++++.--.>.-.>>--------.>+++.---.<--.<<++.<----.+++.<<.>>+.---=
-.--.>-.<<<.>>++++++.------.>----.<-..<<.>>+++++++.+.--.>++++++++.<----.>--=
=2E<+++++.<<.>>+.--.+++++++.<<.>>>>>+++++++++++++.--------.++++++.++++.<<<<=
<.>>>++.+++++.+++++.+.---------------.----.+++.<<<.>>----------.>++.<<<.>>>=
>>-----.++++.---------.++++++.++++.>+++.---.<<.---.<<<++++++.>>>.<<<<.>>>>>=
-----.++++.---------.++++++.++++.>+++.---.<<+++.---.<<<.>>>.<<<<.>>>>>----.=
+++++.-----------.++++++++.--.>+++.---.<<+++.---.<<<.>>>.<<<<.>>>>>++.-.---=
----.++++++++++.--.>+++.---.<<+++.---.<<<.>>>.<<<<.>>>>>++.-.---------.<---=
-------..>>+++.---.<<+++++++++++++.---.<<<.>>>.<<<<.>>>>----------.+.>.<+.-=
-----.>>+++.---.<<<<<----------------.---.>>------------------.<<.<.>>>>+++=
+++.-----.>.<---.-.<<<--------.>>>>>+++.---.<<<<<+++++++++++.---.>>.<<.<.>>=
>>+..-.>.<+.+.++++.>>+++.---.+++.---.







------------------------------

From: "Daniel Perry" <entreido@yahoo.com>
Subject: [lang] [lang][bf][impl][interp] bf interpreter in lua
Date: Wed, 25 Jul 2001 12:17:03 -0400

 Hello,
   Yesterday, while messing around with lua, I decided to make an
interpreter in lua, one of my favourite languages.
 the file format that it uses is kinda lua-specific (ie. if you want to
interpret the hello world file, you'd make the contents of hello.bf this:)
  return
"++++++++++[>+++++++>++++++++++>+++++++++++>+++>+++++++++>+<<<<<<-]>++.>+.>-
-..+++.>++.>---.<<.+++.------.<-.>>+.>>."
---------------------------------------- luabf.lua
-- lua brainf*** interpreter : by entreido at yahoo dot com
file = dofile(arg[1])
array = {}
ip = 0
p = 0
while 1 do
  ip = ip + 1
  x = strsub(file,ip,ip)
  if array[p] == nil then array[p] = 0 end
  if x == "+" then
    array[p] = array[p] + 1
  elseif x == "-" then
    array[p] = array[p] - 1
  elseif x == ">" then
    p = p + 1
  elseif x == "<" then
    p = p - 1
  elseif x == "," then
    array[p] = strbyte(read(1))
  elseif x == "." then
    write(strchar(array[p]))
  elseif x == "[" then
    lastlbrack = ip
    nextrbrack = strfind(file,"]",ip)
    if not nextrbrack then
      print("**Program terminated: No accompanying closing \"]\" for \"[\"")
      exit()
    elseif array[p] == 0 then
      ip = nextrbrack
    end
  elseif x == "]" then
    if not lastlbrack then
      print("**Program terminated: No accompanying opening \"[\" for \"]\"")
      exit()
    elseif array[p] ~= 0 then
      ip = lastlbrack
    end
  else
    print("**Program terminated: Invalid character `"..x.."'");
    exit()
  end
  if ip == strlen(file) then
    exit()
  end
end
---------------------------------------- eof





------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: Separating fact from fiction
Date: Sat, 28 Jul 2001 00:00:37 +0100

I just came back from a short one-week holiday on Madeira. Unfortunately I
had to stay home one day due to *really* bad sunburn [hello skin-cancer],
and a ridiculous march 600 mtrs. downhill on what is considered a "mountain
route for experienced" by me, the total anti-sportsperson; with the result
of being totally unable to move my legs the whole next day.

Well, I had this idea. Please bear with me, some of this is deliberately
difficult and overcomplicated, but you see I had a whole day to spend.

- Remove all other high-level constructs, keep only IF-statements.
- Require that each IF-Statement is accompanied by a goto. (Dummy
IF-Statements can be used for loops, e.g.

while(x) y()

could be changed to

l0: if(!x) goto l1
y()
if(true) goto l0
l1:

so that the general form is

if(<logical expression of n parameters>) goto <line number>.

- The logical expression can be represented as a truth-table with n columns
(basically, a matrix with n columns, pow(2,n) rows).

- Find a numerical representation of that matrix as a number. An overly
complicated way of doing so is this: Use the pair (a,b) where a is the
number of columns, and b) a number in a n-base system represented by

Here is an example. "(a||b)" can be represented thus:

a b =
0 0 0
0 1 1
1 0 1
1 1 1

Now, the "digits" for the to-be-constructed-number are 000, 011, 101, 111;
so this is obviously an octal system. So you write: 3, o7530 so you can
construct the decimal number 3,3928

- You can, at any given point in the program, think of both local and global
variables as part of a large array, indexed by numbers. (Of course, the
local variables would be first, so the index of the global variables changes
all the time making the code less readable).

If you thus have a total of m (local+global) variables at the point, you
select n variables as arguments for the iF-expression. (Constants can be
represented as variables, obviously). Construct, in a similar way as
described above, a number pair (m,<digits representing the variable
indexes>), and convert it to the decimal system.

The last number pair consists of <absolute line number where if-expression
is located>, <relative line number where to jump to if the condition is
met>.

- Now you have basically 6 numbers that you can reduce to a pair of two
numbers thus:

If a is the highest number, construct a number system to the base a+1;
create a decimal representation of the resulting number.

- For all IF-statements in the program, repeat this process. You get a
series of number pairs. Again, "flatten" them to a number pair. You'll get
probably a *really* large number, but that is ok.

- Remove all IF-Statements from the program. The rest of the program can be
as readable as you like, maybe a cobolesque sort of pascal, or *the best*:
Python, or whatever; only, there would be no high-level constructs in the
program, no GOTOs, no IFs, no WHILEs etc. (Functions yes, and unconditional
functioncalls, too, but no visible "program logic"). Of course, by removing
the IF-statements, you implicitly change the line numbers...

- Encode the logic - that is, the number pair - in the <i>filename</i>.

The achived goals of this extravagant idea:

- The program code has no logic part, the logic part has no program part.
(It could be two different sources or source medias, for all I care).

- Make it *really* difficult to program in and attract a bunch of linux
kernel hackers by claiming its worse than the System V semaphore
implementation *and* at the same time essential to world peace.




I don't think I'm too interested in writing an interpreter (or code) for
that language in the near future, but then again, I am no linux kernel
hacker.














------------------------------

From: "Martin Sandin" <msandin@hotmail.com>
Subject: [lang] New BF hybrid, BF with Continuations
Date: Sat, 28 Jul 2001 16:00:22 +0200

This is a short writeup on my new BF hybrid, Brainf*ck with =
Continuations.
Lacking a real name (suggesitions accepted) I'll currently refer to it =
simply
as BFC. This is a working draft of the language spec and I'd be happy to
improve it if anyone can suggest such changes =3D) In particular the =
langue still
feels less 'elegant' than BF and I'd like anything that improves on this
situation. This being my second eso language ('When' is still happening, =
albeit
slowly since I got stuck in a interpreter rewrite.) and I'd like =
feedback;-P


BFC is very simple and the result of ditching the while structure of =
regular
BF and replacing it with the altogether more powerful, general, and =
confusing
continuations of languages such as IO. While IO supports continuations =
as
"goto's with parameter" BFC obviously ditches the "with parameters" part =
and
makes do with a conditional goto (the ! instruction). To be able to =
store the
destination of a goto in memory BFC operates on arbitarily sized =
positive
integers rather than the eight bit integers of BF. This also presented a
interesting opportunity for BFC to be homoiconic and thus BFC programs =
are
stored in the same memory array (MEM) that it uses for data storage. =
Thus BFC
uses two pointers into this memory: 'The Pointer' of BF (refered to as =
P) and
the program counter (PC).


In the end, BFC ends up being a bit like a rather cumbersome machine
language.


BFC has eight instructions, just like BF:
<    Decrease P.
>    Increase P.
+    Increase MEM[P]
-    Decreases MEM[P] but no further than 0.
.    Put the ascii char of MEM[P] on stdout.
,    Put the ascii value from stdin in MEM[P].
@    Stores the value of PC+1 in MEM[P] and advances PC to one beyond =
the
     next @ found.
!    Conditional goto, if MEM[P] is non zero then set PC to MEM[P+1]


Now, since BFC is homoiconic it needs well defined values that represent =
it's
instructions, the following were chosen:
< =3D 0
> =3D 1
+ =3D 2
- =3D 3
. =3D 4
, =3D 5
@ =3D 6
! =3D 7

Since BFC only has 8 instructions and thus only 3 bits are needed to =
represent
them, well, BFC only looks at the 3 lower bits of the memory cell to =
determine
what instruction it contains. Every cell value is thus a valid =
instruction,
note however that the program _code_ may only contain the original 8
instruction symbols (all other symbols are simply ignored).

The memory layout of BFC is simple, the program code (and PC) starts at =
0, the
memory pointer P starts at one cell beyond the last instruction in the =
code.

BFC has a problem of program termination since it will quite happily run =
into
it's data area. The solution is that BFC programs terminate on a jump to =
the
address 0.


So what does BFC look like? Well, this "Hello World!" program is =
probably far
from optimal but it'll give you an idea:

+++++++++>@>>>++++++++<<<-!>>++++<!@>@
@<<!>>.>++++++++++>@>>>++++++++++<<<-!
>>++++<!@>@@<<!>>+.+++++++..+++.>++++>
@>>>++++++++<<<-!>>++++<!@>@@<<!>>.<<<
<<----.>.+++.------.--------.>>>>+.>+!

Most of that is simple enough but it does use a stored goto destination =
as the
basis for calculating one of the chars which makes it a bit less like
'translated BF' and a bit more confusing. Enjoy=3D)

I still haven't tried nested loops but I'm convinced it should be =
entierly
possible with a bit of dicipline.


A hackish and undocumented but working Python implementation of BFC can =
be
obtained from http://www.guldheden.com/~sandin/files/bfc.py. Note that =
progam
errors will probably result in a Python "index out of range" exception =
and
termination. This implementation even has debugging facilities :-)



-
Martin Sandin
http://come.to/vague





------------------------------

Date: Sat, 28 Jul 2001 23:28:09 -0700
From: "Daniel." <voice@teleport.com>
Subject: [lang] Re: New BF hybrid, BF with Continuations

>This also presented a
>interesting opportunity for BFC to be homoiconic and thus BFC programs are
>stored in the same memory array (MEM) that it uses for data storage.

Which means that this is necessarily an interpreted language, and can 
be "compiled" only in the sense of attaching an interpreter to a copy 
of the source code from which non-instructions have been removed, 
right?
-Daniel.




------------------------------

From: "Martin Sandin" <msandin@hotmail.com>
Subject: [lang] Re: New BF hybrid, BF with Continuations
Date: Sun, 29 Jul 2001 12:53:21 +0200

> >This also presented a
> >interesting opportunity for BFC to be homoiconic and thus BFC =
programs are
> >stored in the same memory array (MEM) that it uses for data storage.
>=20
> Which means that this is necessarily an interpreted language, and can
> be "compiled" only in the sense of attaching an interpreter to a copy
> of the source code from which non-instructions have been removed,
> right?

In real actual practise, yes, it means that compiling it likely wouldn't =
give you much of a benefit. This is one of the ideas I've considered =
giving up, but as nobody (including me) has a realistic idea of actually =
constructing a compiler and as the jump structure (you jump to integer =
positions within the program) already makes compiling awkward I've up =
until now figured that it didn't hurt much. Should I give up this idea?

-
Martin =3D)




------------------------------

Date: Sun, 29 Jul 2001 08:31:57 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: New BF hybrid, BF with Continuations

On Sat, 28 Jul 2001, Daniel. wrote:
> >This also presented a
> >interesting opportunity for BFC to be homoiconic and thus BFC programs are
> >stored in the same memory array (MEM) that it uses for data storage.
> Which means that this is necessarily an interpreted language, and can 
> be "compiled" only in the sense of attaching an interpreter to a copy 
> of the source code from which non-instructions have been removed, 
> right?

I'm going to say "wrong."  Now, *I* can't compile self-modifying code,
but LISP can be self-modifying, and has been compiled since it was
created.  I have also considered the idea of a compiler that
essentially interprets "all possible" paths of the self-modifying
program and reconstructs the paths it covers into a "standard" program.
It's also presumably possible to "buffer" the self-modifying areas so
that they can be overwritten with the proper machine code at when the
program is running.  JIT compilation might be fairly productive in
this, as well.

Raphael Finkel looks like he *wants* to talk about it in his
programming languages book ("Advanced Programming Language Design"),
but skirts the issue something fierce...

So, it's not impossible, but rather there isn't a significant benefit
in most cases, so it's a heck of a lot easier to interpret.





------------------------------

Date: Mon, 30 Jul 2001 20:40:00 -0700
From: "Daniel." <voice@teleport.com>
Subject: [lang] Re: New BF hybrid, BF with Continuations

>  > >This also presented a
>  > >interesting opportunity for BFC to be homoiconic and thus BFC programs are
>  > >stored in the same memory array (MEM) that it uses for data storage.
>>  Which means that this is necessarily an interpreted language, and can
>>  be "compiled" only in the sense of attaching an interpreter to a copy
>>  of the source code from which non-instructions have been removed,
>>  right?
>
>I'm going to say "wrong."  Now, *I* can't compile self-modifying code,
>but LISP can be self-modifying, and has been compiled since it was
>created.  I have also considered the idea of a compiler that
>essentially interprets "all possible" paths of the self-modifying
>program and reconstructs the paths it covers into a "standard" program.

[trim]

Thank you. I see where I screwed up--I was unthinkingly reading 
"programs are stored in the same memory array" &c. as a literal 
description of compiled BFC, not just a figurative description of the 
semantics of BFC source code. Whereas in fact a compiler's job is to 
make a program that will produce the right output, not to instantiate 
the constructs of the source language. (This looks like a fundamental 
principle of compiler design; I've applied it myself and seen it 
applied numerous times, but never articulated it, and did not notice 
it could be applied here. I probably would have been more conscious 
of the distinction if I'd been dealing with higher-level languages 
recently than C, SPARC and x86 assembler, brainfuck...still it's a 
silly mistake to have made.)

And to Martin--no, I don't think it needs any alteration. Being 
impractical to compile is a limitation of the language, but I doubt 
if anyone considers it an important one. And on the plus side it 
should be possible to make a fairly short if "illegitimate" quine by 
reading the program code.
-Daniel.




------------------------------

Date: Tue, 31 Jul 2001 00:16:47 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: New BF hybrid, BF with Continuations

Sort of tangential but...

"Daniel." wrote:
> a compiler's job is to
> make a program that will produce the right output, not to instantiate
> the constructs of the source language.

Yes, but just look at all those things that are called "languages" (like
FORTH, and LOGO) which specify the dynamic behaviour of the translation,
basically.  What are these things?  Abstract interpreters masquerading
under the name "languages"?  Or something else entirely... FORTH has
been called an operating system, in fact it does behave how you'd expect
a typical interpreter to behave, kind of like a shell, but is generally
a compiled language in spite of it.

I think these things need a name, 'cause they're not languages.  They're
languages *plus* some other information that (theoretically)
standardizes how the compilers/interpreters interact with the world -
they're no longer languages per se (unless you want to say that every
implementation of some language is another language, which is a
perfectly valid interpretation too isn't it)

> And on the plus side it
> should be possible to make a fairly short if "illegitimate" quine by
> reading the program code.

What do you mean, "illegitimate"? :)
My all-time favourite quine is
1 LIST 1
See, it's even got symmetry to it!  Well, a bit.

I mean, I can see why you'd want to call it "illegitimate", but that
terminology might not be colourful enough for a mailing list as esoteric
as this one, so how about we call it a "bastard quine" instead? :)

Chris

--
And now we must define "bastard operating system"...




------------------------------

Date: Mon, 30 Jul 2001 23:18:51 -0700
From: Brian Raiter <breadbox@muppetlabs.com>
Subject: [lang] Re: New BF hybrid, BF with Continuations

> What do you mean, "illegitimate"? :)
> My all-time favourite quine is
> 1 LIST 1
> See, it's even got symmetry to it!  Well, a bit.
> 
> I mean, I can see why you'd want to call it "illegitimate", but that
> terminology might not be colourful enough for a mailing list as esoteric
> as this one, so how about we call it a "bastard quine" instead? :)

The best (IMO) term I've heard for such bastards is "degenerate
quines" -- alludes to the mathematical term "degenerate case".

b




------------------------------

Date: Mon, 30 Jul 2001 23:41:31 -0700
From: "Daniel." <voice@teleport.com>
Subject: [lang] Re: New BF hybrid, BF with Continuations

>  > What do you mean, "illegitimate"? :)
>>  My all-time favourite quine is
>>  1 LIST 1
>  > See, it's even got symmetry to it!  Well, a bit.

BZZ! Use-mention error; should read "What do you mean, 
'"illegitimate"'? :)". :)
(If I'd said 'illegitimate' I'd have been commenting on that style of 
quine but I said '"illegitimate"' which indicates I was summarizing 
other people's valuations; e.g. two of the quine references linked to 
from your Cat's Eye page call the practice in question "cheating" and 
the third calls it "bad form".)
(And for the record, I like that one too.)

>  > I mean, I can see why you'd want to call it "illegitimate", but that
>>  terminology might not be colourful enough for a mailing list as esoteric
>>  as this one, so how about we call it a "bastard quine" instead? :)
>
>The best (IMO) term I've heard for such bastards is "degenerate
>quines" -- alludes to the mathematical term "degenerate case".

Mmm, that works--although the null quine more closely fits the 
mathematical usage of 'degenerate', I think.
-Daniel.




------------------------------

Date: Tue, 31 Jul 2001 08:40:53 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: New BF hybrid, BF with Continuations

On Tue, 31 Jul 2001, Chris Pressey wrote:
> Sort of tangential but...
> "Daniel." wrote:
> > a compiler's job is to
> > make a program that will produce the right output, not to instantiate
> > the constructs of the source language.
[...]
> I think these things need a name, 'cause they're not languages.  They're
> languages *plus* some other information that (theoretically)
> standardizes how the compilers/interpreters interact with the world -
> they're no longer languages per se

I've called them "language implementation standards."  Like Prolog's
non-determinism which is defined to work in a deterministic manner,
because "the real" implementation did it that way...

> (unless you want to say that every
> implementation of some language is another language, which is a
> perfectly valid interpretation too isn't it)

At which point, every compiler option causes a language schism, and so
on.  Possibly every program defines a language by the subset of a
language it uses.  Probably not best to go that route.

[...]
> And now we must define "bastard operating system"...

When MommyOS really, really loves DaddyOS, and neither the Church of
ANSI nor the bureaucracy in POSIXville have officially recognized their
union...

Oh, wait.  That's probably not what you wanted.  Oops.





------------------------------

Date: Tue, 31 Jul 2001 22:43:48 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: New BF hybrid, BF with Continuations

"Daniel." wrote:
> Mmm, that works--although the null quine more closely fits the
> mathematical usage of 'degenerate', I think.

OK, i would have also accepted 'deviant', 'misfit', 'filthy', 'lousy
no-good', etc

John Colagioia wrote:
> > I think these things need a name, 'cause they're not languages.  They're
> > languages *plus* some other information that (theoretically)
> > standardizes how the compilers/interpreters interact with the world -
> > they're no longer languages per se
> I've called them "language implementation standards."  Like Prolog's
> non-determinism which is defined to work in a deterministic manner,
> because "the real" implementation did it that way...

Yeah, but it gets mixed up with general software engineering at that
point - the wall of abstraction has fallen and it might also be
perfectly correct to call such a thing an operating system, or even just
a "problem specification".

> > (unless you want to say that every
> > implementation of some language is another language, which is a
> > perfectly valid interpretation too isn't it)
> 
> At which point, every compiler option causes a language schism, and so
> on.  Possibly every program defines a language by the subset of a
> language it uses.  Probably not best to go that route.

Unless it becomes productive in some situation to go that route, then
why not.  There are certain languages in the 'gcc' family, such as it
is, that don't have equivalents in the realm of language
specifications... they may one day "graduate," but my point is that I
think it happens both ways "up" and "down" that route in real life, as
languages & implementations co-evolve.

> [...]
> > And now we must define "bastard operating system"...
> 
> When MommyOS really, really loves DaddyOS, and neither the Church of
> ANSI nor the bureaucracy in POSIXville have officially recognized their
> union...
> 
> Oh, wait.  That's probably not what you wanted.  Oops.

Or maybe it was exactly what I wanted... muahahaha!...

Or maybe I was making a snide remark about commercial products...

Or maybe I was desperately looking for a way to justify building
*something* called ESO and calling it an operating system...

Chris

-- 
A bastard operating system is anything with a bastard-file system.




------------------------------

Date: Thu, 2 Aug 2001 11:22:51 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [misc] IRC etc

On Tue, 24 Jul 2001, Chris Pressey wrote:

> Has anyone organized an esoteric IRC meeting place yet?

Not much trouble, just put up a channel and tell everybody about it. :)

> What would everybody here think of using a MUSE instead?  I have several
> reasons for suggesting it but suffice to say that it's a superset of
> chat, so I don't see why not.

How about ytalk?

Panu




------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: 2 Questions for the group
Date: Fri, 3 Aug 2001 21:25:50 +0100


1) Are there HTML-Quines? That is, a HTML/Javascript combination that will
display its own sourcecode as html text ?

2) Are there BF interpreters that work as (singlestep) CGIs? I'm moving to a
new provider where I can use "free CGIs", and I plan to put up a section
with the most usefull CGIs of the whole internet.




------------------------------

Date: Fri, 3 Aug 2001 16:37:31 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: [bf] [interp/chat] BFServer: Come to code! Come to chat!

Hi,

Just been messing around with Visual Basic the last few days and wrote a
BF server.  Now you can enter and run your favorite BF programs from a
telnet client! :)  Also included is a primitive IRC-style chat room with
the basic features.  Come check it out!  I haven't implemented error control
so I'll probably turn it off late tonight for repairs.

telnet to 169.197.50.119 port 3141
or, ppp630.mc01.dsl.fastucson.net port 3141

I would use the standard port 23, but it is blocked by my ISP.

So, come out and help me find & work out the bugs! :)
Jeff

btw, source will come later, right now its kinda a mess :P
and turn on local echo or you won't see what you are typing.




------------------------------

Date: Fri, 3 Aug 2001 22:11:35 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: [bf] [interp/chat] [source] BFServer

Hi again,

Gave the BF Server a little workout tonight and it did okay.  Thanks to
Chris Pressey for discovering a few bugs!  Heres the project source &
compiled executable for Visual Basic 6.0 SP5.  The code is still poorly
commented, but ah well :).

Enjoy,
Jeff





-- Binary/unsupported file stripped by Listar --
-- Type: APPLICATION/ZIP
-- File: bfserver.zip



------------------------------

Date: Wed, 8 Aug 2001 09:10:18 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [dc] The obscurish-forthoid of Unixen



I suppose most on the list already know this, but it is interesting to
note that almost every Unix(or lookalike) installation comes with a neat
forth-style obfuscated programming language named dc. The obfuscation
begins with, but is not limited to, RPN with lambda expressions as the
only flow control tool (well, to be frank, there are "predicates" which
only run a given expression if, say, TOS is greater than STOS).

I think the language was meant to be useful, but it reeks of ad-hoc
obfuscation. The only input command, '?', does not _push_ the input line,
but instead executes it (even though there is a simple operator, 'x',
which pops TOS and executes it). Comparing the two output commands, 'p'
and 'n', reveals that the former prints TOS with a newline but does not
pop it, while the latter prints TOS without a newline but does pop it.
There's still another printing command, 'P' (apparently just to make the
programs less readable), which works like 'n' for strings but for numbers
dumps them in raw binary representation instead of human-readable format -
I haven't yet come up with a single use for this, but maybe it's not meant
to be used after all.

Reading the man page makes me giggle. There's a way to get the first
character of a string, but not the rest of the characters (so you can't
really do any string manipulation). There's a command for quitting, 'q',
but actually it only quits two levels of execution. Another command, 'Q',
pops the number of levels to be exited, but never exits toplevel. :)
There's also a way to call the shell, but not to pass it non-constant
values (from the stack or anything).

To demonstrate the nice properties of the language, I made a couple of
programs with it. koe.dc shows how you write a loop. fibo.dc shows
fibonacci numbers. mandel.dc calculates whether a given point is in the
Mandlebrot set, and sqroot.dc iteratively counts the square root of a
value. (The program does not cease to iterate, but that's because you can
conditionally-execute only a program stored in a register. :)

Panu

Am fuar -> symb <- am fesh
atehwa@iki.fi



-- Attached file included as plaintext by Listar --
-- File: koe.dc

[How many numbers? ]P ?
[p 1- d 0!=a] dsax

-- Attached file included as plaintext by Listar --
-- File: fibo.dc

[Fibonacci numbers up to: ]P ?
[d la lb + p la sb d sa <f] dsf
1 sa 0 sb x

-- Attached file included as plaintext by Listar --
-- File: mandel.dc

[lr li 2 * * lI + lr d * li d * - lR + sr si] sx
[lr d * li d * +] sd			# distance from origo
[lr n [,]P li n 10P] sp			# print coordinates
[[Escape at ]P lpx 2Q] se		# announce escape
[dn [: ]P lpx lxx ldx 16<e 1- d 0<f] sf	# loop

5k
[Give coordinates: ]P ? d sI si d sR sr
[Number of iterations: ]P ?
lfx [Final at ]P lpx


-- Attached file included as plaintext by Listar --
-- File: sqroot.dc

32k
[Square root of: ]P ? d sV 2/
[r d lV r / + 2/ p r dx] dx


------------------------------

Date: Wed, 08 Aug 2001 12:07:08 +0200
From: Georg Westenberger <gwestenb@gmx.de>
Subject: Now THAT is an interesting game...

I'm talking about LaserTank, which I just recently discovered. I think
this might be just the right kind of game for people like us who like to
strain their brains with programming in esolangs. Unfortunately, there's
no 
Linux version; the newest version needs win95.
Description: This is an addictive puzzle game on a 16x16 grid where you
control 
a tank that can move around and manipulate objects to help you reach the
goal 
flag. For example, you can move blocks by shooting at them. They will
form 
bridges when falling into the water. Your shots get reflected by
mirrors, 
there are teleporters, ice fields on which you slide until you are
stopped 
by a block (Inertia anyone? ;) ) etc.
The game is free, but you are encouraged to make your own levels with
the 
built-in level editor (There are already 2500+ levels) and send them to
the
author. The official page is http://www.jccontrols.net/laser/ . 

--

Georg Westenberger      ( gwestenb@gmx.de )


------------------------------

From: "Charles Lamontagne" <boulam@videotron.ca>
Subject: [lang] Tabarnac, a new tarpit, which uses two function stacks
Date: Thu, 9 Aug 2001 10:39:56 -0400


Tabarnac
-------------
Tabarnac could easily be described as functional BrainF*ck. However,
instead of having a nice array, Tabarnac has two function stacks and
a very limited counter. This means you have to juggle with functions,
and arrays are difficult to code. I'm pretty sure Tabarnac is turing
complete, but I won't go into proving that here. It is not as hard
as unlambada, but it's still crazy. :)

9 Commands:
-----------

+ = Increment the counter (if over 255, it will wrap around)
- = Decrement the counter (if under 0, it will wrap around)
! = Print the counter's corresponding ascii char on the screen
? = Input a char and set the counter to it
(function) = Push a function on the other stack
: = Go run the function on the top of the other stack
& = Combine the two top functions into one. Run order: 2nd, then top
* = Repeat the top function 'counter' times
~ = Pop a function and push a function that pushes it

(Note that the counter is an unsigned byte)

= means 'has the same result as'

(+++): = +++
(---)(+++)& = (---+++)
(*---+---)(&~~~!!!!)& = (*---+---&~~~!!!!)
(+---)++++*---- = (+---+---+---+---)   (this assumes that counter=0)
(+-+)~ = ((+-+))
(+-)+++**--- = (+-+-+-+-+-+-+-+-+-)   (if counter=0)



Two code stacks
---------------

There are two code stacks in tabarnac. When runned, a tabarnac
program is entirely pushed on the first stack, and then the
interpreter starts popping and executing it, until it runs
into a :, in which case it starts popping from the other stack.
(It also internally switches stack when returning from a function.)
Operators that operate on the stack (),&,* and ~ always modify
the stack which is isn't being runned, because programs would
otherwise mess themselves up. So a * operator runned on stack 1 
would repeat the first function of stack 2, and vice versa. This 
means you can loop forever, and in fact also makes tabarnac turing
complete. It also means making programs is a real puzzle.



Fun stuff
----


(-)*:
Set counter to 0
This sets the counter to 0.


()~&~:
Run on this stack
Takes a function from the other stack, moves it to the stack
which is running (instead of running it on the OTHER stack
as : does). It also modifies the function so that it returns to
the right stack.


~~((~~((((())&&)))&))&:
Switch
Switches the 2 first functions.


~(~~((~~((((())&&)))&))&:~&)-*+()~&~:()~&~:
Big flip
Inverts the order of the 'counter' first functions.
Use this for arrays.


~*(())&~:
Clone
Make 'Counter' duplicates of the first function.



Arrays
------

To do arrays in tabarnac, use the 'big flip' to get the function you
want on the top, and use it again to put it back where it was.


Looping Forever
---------------

This prints '!' endlessly

(
(-)*:
++++ ++++ +++
++++ ++++ +++
++++ ++++ +++
!
(-)*:
++
(*):
)
++*:


Interpret
---------

None yet.



Hubert 'MadBrain' Lamontagne
madbrain@videotron.ca




------------------------------

From: "Navigator" <navigator@hack.gr>
Subject: Testing...
Date: Fri, 10 Aug 2001 20:52:23 +0300

Irritating but necessary.



------------------------------

Date: Sat, 11 Aug 2001 01:53:07 +0200
From: Bertram Felgenhauer <bf3@mail.inf.tu-dresden.de>
Subject: [lang] Re: Tabarnac, a new tarpit, which uses two function stacks

Hi,

[Tarbanac]
> + = Increment the counter (if over 255, it will wrap around)
> - = Decrement the counter (if under 0, it will wrap around)
> ! = Print the counter's corresponding ascii char on the screen
> ? = Input a char and set the counter to it
> (function) = Push a function on the other stack
> : = Go run the function on the top of the other stack
> & = Combine the two top functions into one. Run order: 2nd, then top
> * = Repeat the top function 'counter' times
> ~ = Pop a function and push a function that pushes it
[...]
> There are two code stacks in tabarnac. When runned, a tabarnac
> program is entirely pushed on the first stack, and then the
> interpreter starts popping and executing it, until it runs
> into a :, in which case it starts popping from the other stack.

  Hmm, I think that description is not clear; anyway I've tried to make
an interpreter for this language which makes the examples you
gave work; you can find it at

  http://www.inf.tu-dresden.de/~bf3/tarbanac.py

  (The code is, of course, undocumented, slow and does not check for
errors ... :)
  The stacks are implemented as stacks holding functions (i.e. lists of
operations). When executing, the first element of the top element
of the execstack is removed and executed; if the first element of the
execstack is empty, it is popped off and the stacks are switched (this
implements the function return).
  The program ends when the execstack is empty.

Bertram


-- 
    `.oo'     "Do not meddle in the affairs of Wizards, for they
 ,.  (`-'   are subtle and quick to anger."        -- J.R.R. Tolkien
'^\`-' )      "Do not meddle in the affairs of wizards, for you
   c-L'-    are crunchy and good with ketchup."    -- Terry Pratchett




------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: Why I like the IBM 3090
Date: Sun, 12 Aug 2001 20:57:56 +0100

First, there's the wonderful operating system, VM/SP,
which has so many advantages!  Here are some of my favorites!

1.  All  of your files are in the same directory, you don't have to
    worry about subdirctories and other nonsense.

2.  For file names, not only do you get a file name, but you also get a
    file type and a file mode, with the name and type each being an
    astounding 8 characters, plus a 2 character file mode, way more than
    I ever had on my Apple II.

3.  If you create a small file, it automatically makes sure it takes up
    one 4K block on your disk, so you can add up to 4K of data to the
    same file and not take any more disk space!  WOW!!!!!

4.  When you get an account you get an entire cylinder to yourself, an
    amazing 465K, which is more than my 5 1/4 inch, single sided,
    low density PC disk.

5.  If a FORTRAN file is too long (250 lines) to compile on your disk
    because the temp files fill up your cylinder, all you have to do is
    unlink your A disk, create a big temporary disk, attach that as your
    A disk, attach your old A disk as another disk, copy the source file
    to the new A disk, then compile it.

6.  You never have to worry about background processes, redirection, or
    piping because the 3090 doesn't have any!  Or command histories!

7.  Or here (WSU) we are privileged to have RESLIM, which makes sure that
    you don't use any more CPU time than you want to or have to.

8.  We also have system administrators who also make sure we don't use
    more CPU than we have to, not to mention they tell us what we can
    and can not do, and what they think they legally can and can not do,
    such as maintenance on our accounts to make sure there is nothing
    wrong with any of our personal files.

9.  If any files have sat in your reader/mailbox too long, they will
    automatically be discarded for you.

10. And finally, all of the useful on-line help!  All you have to know
    is the name of the command and whether it is in CP or CMS or SOFTWARE
    or one of the other help menus, and you can get a great description
    of that command and some examples how to use it like you would want
    to every day!

        Not only is the operationg system fantastic, they have an awesome
full
screen editor, XEDIT.  Boy, it's quite a step up from EDLINE on my PC!
Just look how powerful it is:

1.  If you want to move your cursor to the middle of the screen, all you
    do is hold down the arrow keys until you get there.

2.  If you wanna delete a whole bunch of characters in the middle of the
    line all you have to do is hold down the DELETE key until they all
    magically dissappear.

3.  If you wanna insert something, all you do is hit the INSERT key and
    type in what you want, unless it's too long for that line, then all
    you gotta do is split the line where you want by using the PF11 key,
    which, if you are on a VT100, is just an ESC minus sign.

4.  After you do any commands in that neat prefix area, your cursor
    almost always goes back to the command line at the bottom of the
    screen.

5.  You never have to worry about anything nasty like tab keys, there are
    no tab stops by default (unless you wanna set them)

6.  And, unless you tell it otherwise, XEDIT always creates fixed length
    lines of 80 characters, so if you ever want to put more stuff on the
    same line sometime later, there is room for it!!

        Add to all of this such things as COBOL, disk linking, EBCDIC
character set (I mean who says J should follow I?), and even
some awesome graphics capabilities, and you'll have to agree that the
IBM 3090 is the system for me!!!!

[Came up on this in my files - its old but I like it :) GK ]



------------------------------

Date: Mon, 13 Aug 2001 04:33:31 +0300
From: "J. A. =?iso-8859-1?Q?N=E4kk=E4l=E4j=E4rvi?=" <kaatunut@saunalahti.fi>
Subject: [lang] Purists language listing

Bloody heavens! Today, I decided I want to learn more about graph-based
languages. Naturally, I headed first to purists.org/esoteric, it being
related to everybody's favourite mailing list (by the way, why is this
list so quiet? Did everyone move back to esolang@catseye.mb.ca? Is it
still a list full of mad raving? I'm too afraid to look...), but damn
it, it appears the listing has nothing except the name to tell about the
language.

So if someone's in charge of purists, please consider some sort of brief
description. I could use a short introduction to graph-based (esoteric,
of course) languages too=B8 in case I'm too lazy to go through every
language on that list.

 -Kaatunut





------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: THE WORLDS WORST ASSEMBLER
Date: Mon, 13 Aug 2001 15:33:37 +0100

THE WORLDS WORST ASSEMBLER is, of course, made by IBM , and runs on a
mainframe [S/390],
well documented in IBM style @ this address:

http://www.s390.ibm.com/bookmgr-cgi/bookmgr.exe/BOOKS/DZ9AR004/CCONTENTS

Here is a sample command
---------------------------
The MOVE STRING instruction is used to move a second operand designated by
general register  R2  to  a  first-operand location designated by general
register R1.  The movement is made left to right until an ending character
specified in general register 0 has been moved or a CPU-determined number
of bytes  have been moved.   The condition code is set to 1 if the ending
character was moved or to 3 if a CPU-determined  number  of  bytes were
moved.

Following is an example program that sets string A equal to the
concatenation of string B followed by string C, where the length of each
of strings B and C is unknown, and the end of each of strings B and C is
indicated by an ending character of 00 hex (as in the C programming
language). The program is not written for execution in the access-register
mode.

            L     4,STRAADR
            L     5,STRBADR
            SR    0,0
   LOOP1    MVST  4,5
            BC    1,LOOP1
            L     5,STRCADR
   LOOP2    MVST  4,5
            BC    1,LOOP2
            [Any instruction]

---------------------------
Note the fine use of the numbers 4 and 5 in this code. Here is a nice
newsgroup posting
---------------------------
I am slightly unsure how the following piece of code works and was
wondering if anyone could give assistance :

BAL R10,SUBR
B *+L'*(R15)
B RET1 R15 = 0
B RET2 R15 = 4
B RET3 R15 = 8
etc

SUBR sets up R15 to a multiple of 4.

---------------------------
an expert answers:
--------------------------

R15 is the index register, R0 is l'* is converted to 4 (it is a branch
instruction). So you it is really branching to *+4 with offset from the
current base register + the index register (r15). It is risky code, if
SUBR
for some reason returns a number highe than you branches or not a multiple
of 4 then the program will either S0C1 or S0C4. This is safer:

L R15,=V(IBMCODE)			Load addr of IBM code
BALR R14,R15 				Call IBM code
LR R14,R15 					Copy return code to
R14
N R14,=F'-4' 				Remove low order bits from RC
CR R14,R15 					Compare with original return code
BE *+6 						Br if RC a multiple of 4
DC H'0' 					ABEND if not
C R15,=A(MAXRC) 			Compare RC with max valid RC
BNH *+6 					Br if OK
DC H'0' 					ABEND if RC > maximum RC
B RCLIST(R15) 				!!! Br to proper
routine RCLIST EQU *
B RETRC0 					Br if return code = 0
B RETRC4 					Br if Return code = 4
MAXRC EQU (*-RCLIST)-4 		Set max allowable RC

Of course, it is a lot of code space for little return.

Many times a non-zero RC just means you go to an error routine --

L R15,=V(IBMCODE) 		Load addr of IBM code
BALR R14,R15 			Call IBM code
LTR R15,R15 			Test return code
BNZ error-routine 		Br if return code non-zero

Frequently, when I write an internal routine, I will make it like this --

BAL R14,internal
B error
...
INTERNAL ...
B 4(R14) 					Return to caller if OK
...
BR R14 						Return to caller
indicating error



------------------------------

From: Steve Mosher <goat@isn.net>
Subject: Re: THE WORLDS WORST ASSEMBLER
Date: Mon, 13 Aug 2001 10:47:09 -0300

On Monday 13 August 2001 11:33, Gerson Kurz wrote:
> THE WORLDS WORST ASSEMBLER is, of course, made by IBM , and runs on a
> mainframe [S/390],
> well documented in IBM style @ this address:
>
> http://www.s390.ibm.com/bookmgr-cgi/bookmgr.exe/BOOKS/DZ9AR004/CCONTENTS

<<ROFL>>

A few years ago, I became addicted to a roguelike game called Ancient Domains 
of Mystery (www.adom.de). One time I found a book in it called "IBM Tech 
Manual" which I read. Immediately after I noticed that the status line read 
"permenantly confused." Afaik, that's the *only* way to become permenantly 
confused. Worth a good laugh, if frustrating (since confusion makes it very 
hard to play the game).

Now I know where all that's coming from. =)

-- 
Steve Mosher,
Mad Scientist


------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: Useless CGIs
Date: Mon, 13 Aug 2001 18:20:12 +0100

I've moved to a new provider that allows me to run python CGIs. Yeah! The
first two useless CGIs are

1) I dug up the ESOGOTSCHI number syntax, changed it (groups are now called
"(a=b)" and not "(a,b)") and implemented it as a cgi, so you can finally
write the number 1 like this:

~'|#,'|(+|=|.),~'|#,'|,~'|(|=.)+,~.,(++#+|+#|+|~:,+|~#,|#=+~:,~#,~:,~+,~+,~:
,|)~'|#|,|(.#.+.||+|||~#,#+=:~.,+~#,:~.,~:,~.,~.,~:,)~+,#~|,.~'||,~'(+|=|.),
..~'|(+|=|.),~'+#,#'|,~'#+,~.,'+|,'(+|=|.)(+|=|.),.

There is a page where you can convert decimal->esogotschi and back.

2) an Abstract ASCII art page

Next, I plan to bring a (restricted) brainfuck interpreter to internetland,
that will have the following features:

- singlestep only, you have to press "refresh" in your browser for each
step.
- memory is stored in a mysql db, so if two people at the same time try to
run a program, only one can win.

You *have* been waiting for that, haven't you ?


Since I changed the navigation to frames, there are no more direct links, so
you'll have to find your way around http://p-nand-q.com



------------------------------

From: Renee Rehling <Renee.Rehling@blackbox.net>
Subject: [lang] Re: Purists language listing
Date: Tue, 14 Aug 2001 11:47:48 +0200 (METDST)

"J. A. Näkkäläjärvi" <kaatunut@saunalahti.fi> writes:

> (by the way, why is this list so quiet? 


Because we're in the middle of summer? Just a guess. I subscribed
only about a month ago, so I don't know what amount of traffic
you are used to see here.


> Did everyone move back to esolang@catseye.mb.ca? 


No.


> but damn it, it appears the listing has nothing except the name
> to tell about the language.


That's not true. There is at least one comment on almost every
language on the list. Also, there are links.


> So if someone's in charge of purists, 


I happen to know the guys "in charge" of purists. One of them 
(the original list inventor/proponent) is seriously ill, another
one is busy writing her doctoral thesis, and the remaining two
are on extended vacation. However, if you would forward your
complaints to everybody@purists.org, somewhere down the road
someone would react.


> I could use a short introduction to graph-based (esoteric,
> of course) languages too¸ 


Maybe you want to consider providing said introduction?






------------------------------

Date: Tue, 14 Aug 2001 16:09:34 +0300
From: "J. A. =?iso-8859-1?Q?N=E4kk=E4l=E4j=E4rvi?=" <kaatunut@saunalahti.fi>
Subject: [lang] Re: Purists language listing

Renee Rehling wrote:

> > but damn it, it appears the listing has nothing except the name
> > to tell about the language.
>
> That's not true. There is at least one comment on almost every
> language on the list. Also, there are links.

Um, yes, on the language-specific page, not on the main listing with
lots of names. Zat's the point.

> I happen to know the guys "in charge" of purists. One of them
> (the original list inventor/proponent) is seriously ill, another
> one is busy writing her doctoral thesis, and the remaining two
> are on extended vacation. However, if you would forward your
> complaints to everybody@purists.org, somewhere down the road
> someone would react.

Duh. I think I'll let them enjoy their vacation. Mine was bad enough.

 -Kaatunut





------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [OS/2] Bashing
Date: Tue, 14 Aug 2001 17:20:23 +0100

Its been some time, but just so that you all don't forget that I HATE OS/2,
here is an article from linuxmagazine (link at the end) about installing
"eComStation", the "next generation" OS/2

------
Version 1.0 of eComStation has been released, and I got my copy last week.
It is an attempt to extend OS/2 Warp4 beyond where, and in different
directions than, IBM has taken it. The basic question is whether eComStation
represents a rebirth of a once-promising operating system or merely another
of the post-mortem spasms on which OS/2 diehards have placed so much hope in
the five years since that last release of the product by IBM. There is much
emotional baggage carried by eComStation.

One of the problems that always plagued OS/2 was a fairly difficult
installation routine. It got easier with subsequent releases, but it was
never really easy. eComStation has managed to take this a giant leap
backwards, producing possibly the most maddeningly complicated, for no good
reason, installation I've ever encountered. This is not especially helped by
the documentation, which comprises two pages with printing on both sides and
which makes frequent reference to documentation (including some in .pdf
format) on one or another of the three CDs. Of course, if one is installing
on a clean machine, as I was doing (K6-2-550, 256 megs of memory, 10-gig
hard drive), there's really no way to get to those files. Nice.

When booting from the CD, the preferred method of installation, one is
presented with a menu of sorts. The default item is curiously labeled both
as booting from the CD and booting from the 2.88-meg floppy drive (and when
was the last time you had anything to do with one of those?), which throws
an immediate disk read error (big surprise); a standard boot from CD, easy
install option (which waited until it got to its config.sys before
announcing that there was insufficient memory to load pmshell.sys, which I
take to be an error -- 256mb is enough memory for most install routines);
and an advanced install routine, which is necessary if there are SCSI drives
on the system and which was necessary here because it was all that would
work. It spawned a screen the likes of which I haven't seen this decade or
last decade, either, reminiscent as it was of the old 1dirPlus file manager
thing for DOS. Text mode, lots of colors and things that flash, and this
stark statement:

>>> PLEASE READ INSTRUCTION BOOKLET BEFORE EXECUTING CHANGES! <<<

Which would have been well and good, had an instruction booklet actually
shipped with the product. (This reminded me of the sad events surrounding
the late, lamented Textra word processor, whose final version shipped okay,
but the company, Ann Arbor Software, disappeared before the docs were
printed.)

I would have to wing it, but there was nothing on the first screen, at
least, that seemed much out of the ordinary. And except for its failure to
detect the USB ports and its desire to run my 17-inch Sony monitor at
800x600, there was nothing that needed changing. It then launched into a
process that looked a great deal like the installation of previous versions
of OS/2 with a coat of very nice paint, little animations, and so on. Soon a
nice desktop appeared, but this was apparently being run from a RAM drive,
in that I'd made few installation decisions yet. There was in the center a
documentation pop up that let you read, among other things, documentation
for a different though similar IBM product. Weird.

This is the phase where the user is introduced to IBM's Logical Volume
Manager, something spoken of in terms suggesting that it is so wonderful
that it's too bad it will kill you. Well, not quite that bad, but there was
an ominous tone to it, particularly as pertained to any other drives that
might be on your machine to be sucked into this vortex. In that I didn't
especially care if it set the hard drive on fire, so long as the fire didn't
spread, I strode boldly ahead. I clicked on the "Install" button. A screen
appeared in which I was asked what I would like to install; among the
options were "IBMGenGradd," "Classic VGA," and "Scitech Display Doctor." The
documentation papers (there was no Help button at this point) offered no
guidance other than to name them as the lone three display driver choices.
Well, duh. I knew I didn't want VGA, but what was to recommend one over the
other? I didn't know then and don't know now, but I had heard of Scitech
from some OS/2 partisans who liked it, so it's what I chose.

Then came the Logical Volume Management stuff, which began by informing me
that the partition table on my second physical hard drive might be corrupt.
I had no second physical drive in the machine, though. The Logical Volume
Manager fought like hell to keep me from partitioning the drive, then
refused to let me set a partition bootable. Something was definitely wrong
here. Though the only operating system that had ever been on the drive was
OS/2 Warp4, I decided that I'd better back out. I dug up an old bootable DOS
floppy with fdisk on it and booted from it, then ran fdisk /mbr. No joy. The
thing wasn't going to install.

Which is too bad, in that I had already downloaded the secret registration
code required to get eComStation to complete installation once it reached
that point, which it never did here. (I do not at this point think that if
the thing were put on the web for free download there would be many takers,
so I'm not sure of the necessity of this kind of copy protection, but it's
theirs to do with as they please.) I cannot, therefore, tell you about the
new tcp/ip stack, or the "Wise Machine," which appears to be some sort of
applications deployment thing, or the new version of Lotus Smart Suite for
OS/2 that ships with eComStation, or even of the new IBM web browser that
may or may not be included -- there seems to be disagreement on this. And I
feel confident that if I had a day or two and managed to summon a very high
threshold of frustration, I could probably get it more or less installed.
I'd like to see the thing running, because . . . well, just because.
....
http://www.linuxplanet.com/linuxplanet/opinions/3689/2/






------------------------------

Date: Tue, 14 Aug 2001 22:31:54 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Purists language listing

On Mon, 13 Aug 2001, J. A. N=E4kk=E4l=E4j=E4rvi wrote:

> Bloody heavens!

You really know the perfect way to express oneself :)

> (by the way, why is this
> list so quiet? Did everyone move back to esolang@catseye.mb.ca? Is it
> still a list full of mad raving? I'm too afraid to look...),

AFAIK list@catseye does not currently exist. People are free to rave madl=
y
on misc@esoteric, but don't. That OK with me... :)

> Today, I decided I want to learn more about graph-based
> languages. Naturally, I headed first to purists.org/esoteric, it being
> related to everybody's favourite mailing list  but damn
> it, it appears the listing has nothing except the name to tell about th=
e
> language.

Which language? The subject of graph-based languages is _really_ broad,
because graphs are a superset of most structures any language has. For
example, continuations turn tree-like execution graphs into full (possibl=
e
cyclic) graphs, so continuations kind of turn functional languages into
graph-based languages.

If you're talking about graphs as the primary data type, most OO language=
s
encourage graph-based programming (the graph being the references the
objects have between each other). There are few languages that _only_ hav=
e
graphs as the data type, and I don't remember their names... maybe you
were referring to these? They include the draft FvdP and I were designing=
,
where the computation was based on rewriting of colored, undirected
graphs. I can repost those postings if you're interested.

> So if someone's in charge of purists, please consider some sort of brie=
f
> description. I could use a short introduction to graph-based (esoteric,
> of course) languages too=B8 in case I'm too lazy to go through every
> language on that list.

Descriptions are well possible, in the form of language comments. Somebod=
y
just should write one. :) (BTW: I'm also somewhat irritated by the
slightly-defunct state of purists. I hope they'd finish it - I want a
working system, not one that has many features but never gets done.)

Panu






------------------------------

Date: Tue, 14 Aug 2001 22:48:09 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Tabarnac, a new tarpit, which uses two function stacks

On Thu, 9 Aug 2001, Charles Lamontagne wrote:

> There are two code stacks in tabarnac. When runned, a tabarnac
> program is entirely pushed on the first stack, and then the

As one function?

> interpreter starts popping and executing it, until it runs

If it is one function, it's probably popped only once?

> into a :, in which case it starts popping from the other stack.
> (It also internally switches stack when returning from a function.)

Does this mean that whenever the top function on the current stack has
been completely executed, it changes the stack before continuing with the
execution?

> ()~&~:
> Run on this stack
> Takes a function from the other stack, moves it to the stack
> which is running (instead of running it on the OTHER stack
> as : does). It also modifies the function so that it returns to
> the right stack.

Um?

Stack1		Stack2

(()~&~)		(fn)
(~&~)		(fn) ()
(&~)		(fn) (())
(~)		(fn())
()		((fn()))

... and then the execution terminates.

I'm clearly somehow misunderstanding the execution model and/or what the
instructions do. And what does "the /right/ stack" mean here?

Anyway, the language looks interesting and is hard to classify, so it gets
high points from me. But the description is not precise enough for me to
understand how the language works. So could you describe the language in a
little more detail? Maybe stack-state examples (such as above) from your
example programs?

Panu






------------------------------

Date: Tue, 14 Aug 2001 16:04:20 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [OS/2] Bashing

Gerson Kurz wrote:
> Its been some time, but just so that you all don't forget that I HATE OS/2,
> here is an article from linuxmagazine (link at the end) about installing
> "eComStation", the "next generation" OS/2

Gerson, you always manage to crack me up.

Did you ever get your PRIzE for the ESSIES?!?

Would you like one of Jeff's TI994A's?  I'll help pay for shipping...

Chris


------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [VAX ON EBAY] was: [OS/2] Bashing
Date: Wed, 15 Aug 2001 10:32:57 +0100

Hi Jeff,

Thanks but no thanks. My computer nostalgia is limited to VICE, WinUAE and
the occisonal trip to ebay in search for a lowprice VAX. Unfortunately, on
the german ebay, this:

http://cgi.ebay.de/aw-cgi/eBayISAPI.dll?ViewItem&item=1627433186

is what they have to offer if you search for VAX.

Gerson

> -----Original Message-----
> From: Jeff Johnston [mailto:jeffryj@azstarnet.com]
> Sent: Wednesday, August 15, 2001 12:12 AM
> To: Gerson Kurz
> Subject: Re: [OS/2] Bashing
>
>
>
> In case you missed my offer, I'd be happy to send you a complete TI-99/4a
> kit for free.  It's NTSC, nope thats okay!  You can run all your favorite
> BF programs, provided you have enough patience :)
>
> Let me know and I'll pack it up,
> Jeff
>
>
> On Tue, 14 Aug 2001, Chris Pressey wrote:
>
> > Did you ever get your PRIzE for the ESSIES?!?
> >
> > Would you like one of Jeff's TI994A's?  I'll help pay for shipping...
> >
> > Chris
> >
> >
>



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [CRYPTO-GRAM] Chantilley Data Security
Date: Wed, 15 Aug 2001 11:23:04 +0100

I don't know how many of you subscribe to bruce schneiers Crypto-gram. In
the latest letter, in the section "the doghouse" there is a report about
Chantilley Data Security. My personal favourite quote from their website is
this:
-----
The XES1152 Solar Cipher, over the key strength range 144 to 1152 bits, can
encrypt with no reduction of speed. XES1152, on a PII 266MHz PC with
standard IDE hard drive, running MS Windows NT4.0 encrypts and re-files a 60
Mbyte file in less than 35 seconds. Trials on a similar PC have shown Raw
Byte Encryption time of 130 nano seconds using XES1152. This is equivalent
to 1,000,000 bytes in 130 milli seconds. (Timings are with a 1152-bit key
and with non-optimised C code, not yet assembled)
----
Here is what bruce has to say about them:
-----
Let's all welcome Chantilley Data Security to the world of encryption....On
[a] page they describe "Ciphers:XES the new European Encryption Standard?"
"A Solar Cipher is an idea unique to Chantilley.  It uses a PRIMARY
ENCRYPTION STREAM to 'fire up' a system of SUN WHEELS and PLANET WHEELS
providing high encryption strength and using only a small number of simple
logical on-line operations.  In a Solar Cipher, each new key is a set of
primitives which generate cryptographically strong pseudo-random streams,
which in turn scramble the wiring of three 256-position rotors as in a
rotary cipher."  When I first read this page, I thought it was a joke.

"The theoretical maximum entropy of the algorithm is therefore ...
equivalent to a 100818 bit key."  "There are very sound reasons for
claiming that XES1152 may be the best combination of strength and speed of
any software cipher in the world."  "XES-36 is 30,000 times stronger than
DES with similar key strength (if that were possible)."  What in the world
does that last quote mean?

Their Web site rings all the snake-oil warning bells.  They give their
stuff weird fancy names: e.g. "expert encryption standard."  There are
claims about breakthrough technology and totally new cryptography and the
like.  There are unsubstantiated accolades from nameless experts.  There's
scientific mumbo-jumbo (that "solar cipher" stuff had me rolling on the
floor, and they invoke something called "Multiple Fermat Sequencing"):
comparisons with a one-time pad, ridiculous key lengths (they have a
symmetric 1152-bit cipher), and claims that conventional ciphers are too
slow for real-time data encryption.  (Here's a representative
quote:  "XES-1152 is the fastest and strongest cipher of its kind in the
world.")  And they clearly don't know what's going on in the cryptography
world; they have a product called "Automatic E-Mail Security" that they
refer to as "AES."

There's more, but I can't reprint it all.  These guys are too much, and
their Web site is great entertainment.

<http://www.chantilley.com>

Generic snake-oil information:
<http://www.counterpane.com/crypto-gram-9902.html#snakeoil>
<http://www.interhack.net/people/cmcurtin/snake-oil-faq.html>
---- end of quote ---



------------------------------

Date: Thu, 16 Aug 2001 14:29:48 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [ML] [long] OO, type systems


Lately, I've spent some more time to study ML languages, especially SML.
(I invite you all to do so, it's very enlightening if you're used to
programming in C or a similar language.) For example, I've come across
some techniques to implement a limited form of object-oriented programming
in the core language, without the (IMO very ugly) syntax quirks of Ocaml.

To explain these ideas, let's get back to what an object is. (If you
happen to disagree with my definition, please do not use historical but
pragmatic arguments against me.) An object is a set of closely-related
services, which guarantee certain behavior. Whether they have no
parameters affecting their behavior, only immutable parameters or even
mutable parameters (state) is not that important - except that if they
have state, the services (and not any other part of the program) has
access to the same piece of state.

Thus, a function pointer is a parameterless object that provides one
service.  A closure is a parametrised object that provides one service.
Because ML does support mutable data structures (references and arrays),
the values of the parameters can be mutable, and thus you can have a
stateful closure, for example like this:

fun make_counter () =
	let val count = ref 0 in
	fn inc => count := !count + inc; !count
end

let mycounter = make_counter ()
print mycounter 2
print mycounter 1

This will print 2 and 3.

All we still need is putting many services into one first-class value.
This is possible via the usage of tuples or records. Records are probably
more appropriate for the task, because they enable one to name the
services. Moreover, the services are well able to share state. For
example:

fun make_intcell initval =
	let
		val value = ref initval
		fun fset n = value := n
		fun fdiff n = value := !value + n
	in
		{ set=fset, diff=fdiff }
	end
end

(Forgive me if I remember the syntax wrong. It's a nuisance to live
between SML syntax and Ocaml syntax.)

What's missing? Now, a principal idea in object-oriented programming - one
might say it's really the only real point of object-oriented programming,
as opposed to object-based programming - is that you can make many
internally-different services that can be used via the same interface. For
example, one might be interested in intcells that reside on a remote
machine (for example in a database). The _real_ boon of object-oriented
programming is that you don't have to modify the code that uses the
intcells to achieve this, and you can even have arrays of intcells some of
which reside on the local machine (the simple implementation) and some of
which are remote. This is possible in ML, because as long as the types of
the fields of the record (ie. the services / methods) are equivalent,
there's no restriction that the record (ie. the object) is constructed via
make_intcell. Thus, the record type corresponds to an interface, whereas
record instances correspond to objects. The only thing that corresponds
somehow to the class is make_intcell, but the concept of class is not very
important in OO (except in languages where interfaces have to be specified
as classes).

This demonstrates another important point which is often obscured by most
conventional object-oriented languages. It is the fact that _the
criterion_ of a specific class / object implementing a given interface (=a
specification of behavior) is not that it is inherited from it (though
this is often required for technical reasons) nor that it has every method
the interface has (though this is one of the minimum requirements). The
criterion is that, considering the behavior specified by the interface,
the class / object services behave in the way specified by the interface -
ie. the code using the class (via the interface) gets the results it
expects to get.

However, even though ML provides enough tools to handle basic OO stuff
(actually some of which raise it over C++ as a language for writing
object-oriented code), it has some difficulties to flexibly express some
less important, but nevertheless handy OO structures. One of these is the
lack of inheritance as a specialisation tool, but the most important is
difficulties with classes / objects implementing more than one interface.
This directly boils down to ML's static view of records: in ML, a record
has to always be of a wholly-defined type; it is not enough that a record
has /at least/ the fields needed for the task (which correspond to the
methods required by a certain interface); the record has to have _exactly_
the fields specified. More generally, the record is not defined by its
fields, but the fields are defined by their record.

The reasons for this are apparently technical. How do you manage the
structure of records (in memory) if _any_ record can contain _any_ field?
C++ solves this by separating function pointers from their closures (from
the ML point of view) into tables and requiring that the interface be
inherited in order for C++ to arrange the function pointer tables so that
the object can be upcast into any of its superclasses (which are
interfaces in proper OO programming). However, Ocaml object types (when
objects are passed, for example, to functions as parameters) are specified
by what services they must _at least_ provide and are in no way related to
class definitions or inheritance. This would suggest generic polymorphic
records are not impossible to implement efficiently with respect to time
and memory consumption.

The direction I see type systems as heading (if only there was any
progress :)) is "requirement" types: functions that specify what fields a
record should at least have, what possible alternatives a variant should
at most have, and what types a tuple should begin with. Truly polymorphic
(strong) type systems are the key to flexibility in programming.

Panu Kalliokoski

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Thu, 16 Aug 2001 14:58:10 +0300 (EEST)
From: Esoteric languages community <esoteric@oiva.sange.fi>
Subject: [chat] [list-meta] reply-to, precedence, subject tags


Today, I found the time to go forth and put into use the simplest solution
to the reply-to problem. The problem can be described as follows: postings
sent to misc@esoteric.sange.fi do not get a reply-to header of
misc@esoteric.sange.fi for reasons I'd rather not explain again.

The solution is this: there is now a new mailing list,
chat@esoteric.sange.fi. It is aimed for miscellaneous discussion, just as
misc@esoteric.sange.fi is (or was). If you have something to say which is
not suitable for lang or sci (nothing related to programming or science),
send the message to chat. The role of misc is that lang, sci and chat get
all forwarded to it, so you don't have to change your subscriptions, just
post miscellaneous thread-starters to chat.

If you have questions to ask, email me directly, and I'll summarise to the
list.

Another change is that precedence: bulk headers are no longer added to the
messages. On some mail delivery systems, this causes the message to be
tagged as spam, which is a nuisance.

Still one thing to note is that you're still highly encouraged to
(over?)use the [categ] subject notation. At least for me this makes it
vastly easier to quickly spot eso-messages and threads from my email bulk.

Panu






------------------------------

Date: Fri, 17 Aug 2001 00:21:06 +0300
From: Juha =?ISO-8859-1?Q?J=E4rvi?= <mooz@welho.com>
Subject: [OS][long]Specs for an esoteric OS

A little while before I heard about the ideas for ESO in here
and before UF featured the 'movie OS' I had gathered some plans
for an esoteric movie OS, project currently named LeetOS for
the amusement value. This would be my long-term project,
which stands for something I'm not even going to start
'for a while' but I thought the specs might prove
interesting.

It would have a GUI with as many movie artifacts as possible.
Obligatory little pi-sign in the lower right corner that
would turn the display green, display odd hex dumps, coordinates
for windows, all kinds of symbols and stuff in a flashy mess.

The other side of this is the technical framework. First of all;
it would have true multitasking and memory protection... under
Z80 emulation. Every instruction would be disassembled, checked
and then run. I've tried this on my TI-86 and in a realworld
situation the speed is bearable, while emulation would make it
much faster since most stuff could be thrown out.

The reason for this is that _if_ someone made a compatible Z80-
based platform it could be run on it. I've heard at least of
some japanese binary compatible processor featuring at least
30 times the speed of the original Z80. Still, with the
original Z80 costing little more than nothing, someone _could_
build a cheap machine with dozens of processors, I'd call that
having all the design problems of a supercomputer and none of
the speed...

Display memory would be planar (one bit in each bitplane
together specify one resultant pixel color) allowing for
shadows etc with palette tricks (hmm, I've had an Amiga ages
ago and ideas stuck).

I've drawn some windows, icons and stuff, which give a very
much Lego-like sense, gives a nice touch if it looks like
a playground until you enter 'haxxxxor-mode'.

Then the issue of the command prompt. The font and feeling can
be best imagined by thinking of the intro of Megaman X. The
font is ready and it's... like a movie thing.

Directory structure would be such that each directory can
contain 23 files or bags (*nix&dos have directories, windoze
has folders, amiga has drawers so we have... bags). Each
of them will be referred to by a single letter of the alphabet
when in command prompt. The files have long names in GUI but
the only way to see them in console is to list the bag to
see the corresponding letters.

The paths are represented as follows (unix-example converted
to LeetOS-format):
/bin/ls
would become:
xbzl
The first slash, referring to the root bag, becomes x.
Next slash is represented by z and the last possible one
(there's no more than 3 levels of bags) is y.

When in command prompt, there's no way to explicitly separate
commands from one another, except with x to indicate the
beginning of a new file path. There are no relative paths at
all. Commands can only be given arguments in the form of files,
text is not allowed. Therefore, text must be built by
concatenating files which is then passed to the command.
The shell takes the number of required arguments from the
executable.

Filenames passed as arguments must also be full paths.
Concatenation command might be found in /bin and here we refer
it with c for clarity (it needn't be any logical letter).
It takes the arguments <destination file> <source file> and
simply appends the source file to the destination.

Of course we need the building blocks for strings, these can
be found in /var/letters (which will be represented with
/y/z) thus giving us xyzzya-xyzzyw (x, y and z shall be stored
in another bag, named a-c since xyz aren't allowed in file names)

To print 'foo' one might use the
following sequence: (using /tmp/t for the text)
xbzr xtzt xbzc xtzt xyzzyf xbzc xtzt xyzzyo xbzc xtzt xyzzyo xbze xtzt
meaning
/bin/rm /tmp/t; /bin/concatenate /tmp/t /var/letters/f; /bin/concatenate...
(of course without the spaces, they're here for clarity only)

Sad thing is, the shell won't accept a bag name as a
parameter so you have to use a similar sequence every time you
need to list a bag.

Shell needn't display lines of input from left to right, I
was thinking of rather having them alternate left-right,
right-left so it becomes a constant flow.

Executables can be written in Z80-code, befunge or brainf*ck.
Because of the memory protection, befunge/brainf*ck apps
should be faster than machine language ones. Befunge programs
could easily act as shell scripts if we introduce a command
that pops a char from the stack and acts as if the used entered
it in the command line.

Needless to say, the GUI will run 'native', bypassing the memory
protection stuff and only applications have to be run under it.

This is, of course, a multiuser environment. Native executables
have a separate data part where all settings are stored. Ascii
strings are given a tag and for each user only pairs of tags
and data are stored. Also all data files are stored in executables.
Thus we get rid of separate configuration files and the GUI part
becomes actually _elegant_. Each file is assigned a type on
filesystem-level, getting rid of extensions and 'magic numbers'.

The third available mode is nethack-like shell. Stuff is used
by (a)pplying them, which runs applications or opens files
and bags. Like in Nethack, you need to take objects out of
the bag (moving them to the root bag) before applying them
and then put them back in the bag. Fun with nested bags when
you need to take all the bags out of each other to get to the
object. All you can have from Nethack in fact is the inventory
window.

Now we can introduce bags of holding. These are magical bags
you can create that make objects lighter (by compressing the
files). The problem with them is that if they somehow become
cursed the contents actually become twice as heavy and each
time you open the bag some objects might disappear. What an
evil trick it is to curse someone's home bag if it happens
to be a bag of holding! Normal bags would just become
read-only.

Of course the process to create a bag of holding is not that
simple. You have to polymorph a bag and hope it turns into
one. Better check it's empty because it might just disappear.
Luckily creating new bags is possible in GUI and command prompt
modes, where they work just like traditional directories.

Indeed the only attribute objects can have is blessed/uncursed/
cursed. Cursed files tend to stick so they work like write-
protected ones (except for those special bags). The difference
between blessed and uncursed files is application specific.

As many OS functions as possible will be written in Befunge.
(Befunge is NOT good for...) such as sorting, compression etc.

The command prompt might be spiced up by requiring users eg.
to insert a space every three characters, randomly change the
direction text flows in, and killing all running background
tasks each time you make a typo (or cursing your home bag)

Any more sick ideas are welcome.

-mooz
Oh, and there's some new befunge programs on my
homepage (floating point division and stuff)
http://kotisivu.mtv3.fi/oma/quux/



------------------------------

From: "Charles Lamontagne" <boulam@videotron.ca>
Subject: [lang] Re: Tabarnac, a new tarpit, which uses two function stacks
Date: Thu, 16 Aug 2001 21:29:04 -0400

> > There are two code stacks in tabarnac. When runned, a tabarnac
> > program is entirely pushed on the first stack, and then the
>
> As one function?

As one single big function.


> > interpreter starts popping and executing it, until it runs
>
> If it is one function, it's probably popped only once?

Actually, it doesn't pop off the whole function, then run it. It pops stuff
operator per operator, char per char.
I'll use @ to symbolize the end of a function.

Example:

Stack 1: @+++:(+++)+++ <- Being interpreted
Stack 2:
The program is first loaded. Note that it's written right to left here.

Stack 1: @+++:(+++) <- Being interpreted
Stack 2:
The counter is now 3.

Stack 1: @+++: <- Being interpreted
Stack 2: @+++
It pushes the function.

Stack 1: @+++
Stack 2: @+++  <- Being interpreted
Having encountered a : colon operator, it starts executing the second stack

Stack 1: @+++
Stack 2: @  <- Being interpreted
The counter is now 6

Stack 1: @+++ <- Being interpreted
Stack 2:
Having encountered the end of the function, it changes stack, just as if it
had encountered a : colon operator.

Stack 1: @ <- Being interpreted
Stack 2:
The counter is now 9.

> > into a :, in which case it starts popping from the other stack.
> > (It also internally switches stack when returning from a function.)
>
> Does this mean that whenever the top function on the current stack has
> been completely executed, it changes the stack before continuing with the
> execution?
>

Yes. This means we return to the function which called it.

> > ()~&~:
> > Run on this stack
> > Takes a function from the other stack, moves it to the stack
> > which is running (instead of running it on the OTHER stack
> > as : does). It also modifies the function so that it returns to
> > the right stack.
>
> Um?
>
> Stack1 Stack2
>
> (()~&~) (fn)
> (~&~) (fn) ()
> (&~) (fn) (())
> (~) (fn())
> () ((fn()))
>
> ... and then the execution terminates.
You forgot the colon, which makes it execute fn.

The point of this is in a case like this:

@main program
@data @function

What if I need to give access to the data to the function?

@main program :~&~() <- Being interpreted
@data @function
Note that it is flipped.

@main program :~&~ <- Being interpreted
@data @function @
Push an empty function.

@main program :~& <- Being interpreted
@data @function @()
Now we have a function that pushes an empty function.

@main program :~ <- Being interpreted
@data @() function
Now the function will push an empty function after being executed (remember,
it's flipped).

@main program : <- Being interpreted
@data @(()function)
Now we have a function that pushes the function.

@main program
@data @(()function) <- Being interpreted
Because of the : colon we change stack.

@main program  @()function
@data @<- Being interpreted
We push ()function.

@main program @()function  <- Being interpreted
@data
Because of the end of function (@) we return to the first stack and run
function.

@main program @() <- Being interpreted
@Modifed data
We run the function, which modifies the data.

@main program @ <- Being interpreted
@Modifed data@
We push an empty function.

@main program
@Modifed data@ <- Being interpreted
We change stack because of the end of function (@).

@main program <- Being interpreted
@Modifed data
We change stack again because of the other end of function (@).
We're back to running the main function



>
> I'm clearly somehow misunderstanding the execution model and/or what the
> instructions do. And what does "the /right/ stack" mean here?

What I meant was that the function would have returned to the second stack
as normally, which we do not want (it would be executing the data) but
because we've pushed an empty function, it returns to the main program, ie:
the 'right' stack.

>
> Anyway, the language looks interesting and is hard to classify, so it gets
> high points from me. But the description is not precise enough for me to
> understand how the language works. So could you describe the language in a
> little more detail? Maybe stack-state examples (such as above) from your
> example programs?
>
> Panu
>
Here's the 'switch' program, with the stack diagrams. It's a complicated
program, but it seems to work on the interpret.

~~((~~((((())&&)))&))&:

@code <-
@a @b

@code <-
@a @(b)

@code <-
@a @((b))

@code <-
@a @((b)) @(code)

@code <-
@a @(code)((b))

@code
@a @(code)((b)) <-

@code@(b)
@a @(code) <-

@code@(b)@code
@a @ <-

@code@(b)@code <-
@a

@code@(b)@code <-
@(a)

@code@(b)@code <-
@((a))

@code@(b)@code <-
@((a))@(code)

@code@(b)@code <-
@(code)((a))

@code@(b)@ <-
@(code)((a))

@code@(b)
@(code)((a)) <-

@code@(b)@(a)
@(code) <-

@code@(b)@(a)@code
@ <-

@code@(b)@(a)@code <-
...

@code@(b)@(a)@code <-
@code

@code@(b)@(a)@ <-
@code

@code@(b)@(a)
@code <-

@code@(b)@(a)@()
@code <-

@code@(b)@()(a)
@code <-

@code@()(a)(b)
@code <-

@code@()(a)(b)
@ <-

@code@()(a)(b) <-
...

@code@()(a) <-
@b

@code@() <-
@b@a

@code@ <-
@b@a@

@code
@b@a@ <-

@code <-
@b@a

The big flip program is similar, but it doesn't work on the interpret,
because of an error on my part or a bug in the interpret, so I won't list
the stack diagrams.

Here's the infinite looping program:

main(loop((-)*:++*):)++*:

@main
@:(*++:*(-)):)loop

@main <-
@:(*++:*(-))loop:(*++:*(-))loop

@main
@:(*++:*(-))loop:(*++:*(-))loop <-

@main
@:(*++:*(-))loop:(*++:*(-))loop <-

@main
@:(*++:*(-))loop:(*++:*(-)) <-

@main@*++:*(-)
@:(*++:*(-))loop: <-

@main@*++:*(-) <-
@:(*++:*(-))loop

@main@*++:* <-
@:(*++:*(-))loop@-

@main@*++: <-
@:(*++:*(-))loop@-----    (assuming that counter = 5)

@main@*++
@:(*++:*(-))loop@-----  <-

@main@*++
@:(*++:*(-))loop@ <-   (now counter = 0)

@main@*++ <-
@:(*++:*(-))loop

@main@* <-  (counter = 2)
@:(*++:*(-))loop

@main@ <-
@:(*++:*(-))loop:(*++:*(-))loop

@main
@:(*++:*(-))loop:(*++:*(-))loop <- (the program is looping)

To leave he loop, you have to get the looped function to be repeated 0 times
instead of 2, forcing the program to return to main.
This doesn't mix well with ''Run on this stack" though.



Here's a pretty crude 'Hello World'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!+++
++++++++++++++++++++++++++!+++++++!!+++!------------------------------------
-------------------------------------------!++++++++++++++++++++++++++++++++
+++++++++++++++++++++++!++++++++++++++++++++++++!+++!------!--------!


Unfurtunately, the interpret seems to be somewhat buggy. The '?' doesn't
work properly, the counter doesn't overflow well either.

This is a hard to explain language, but I hope I've helped you understand
it.

        Hubert "MadBrain" Lamontagne





------------------------------

Date: Fri, 17 Aug 2001 05:01:00 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] Re: [ML] [long] OO, type systems

On Thu, 16 Aug 2001, Panu A Kalliokoski wrote:

> 
> Lately, I've spent some more time to study ML languages, especially SML.
> (I invite you all to do so, it's very enlightening if you're used to
> programming in C or a similar language.) For example, I've come across
> some techniques to implement a limited form of object-oriented programming
> in the core language, without the (IMO very ugly) syntax quirks of Ocaml.

I don't know very much about object-oriented programming, but here's my
comments anyway.

> 
> To explain these ideas, let's get back to what an object is. (If you
> happen to disagree with my definition, please do not use historical but
> pragmatic arguments against me.) An object is a set of closely-related
> services, which guarantee certain behavior. Whether they have no
> parameters affecting their behavior, only immutable parameters or even
> mutable parameters (state) is not that important - except that if they
> have state, the services (and not any other part of the program) has
> access to the same piece of state.

Abstraction. More generally, an object can also have "private" methods.

> 
> Thus, a function pointer is a parameterless object that provides one
> service.

I don't understand what you mean by function pointer here.

> A closure is a parametrised object that provides one service.
> Because ML does support mutable data structures (references and arrays),
> the values of the parameters can be mutable, and thus you can have a
> stateful closure, for example like this:
> 
> fun make_counter () =
> 	let val count = ref 0 in
> 	fn inc => count := !count + inc; !count
> end
> 
> let mycounter = make_counter ()
> print mycounter 2
> print mycounter 1
> 
> This will print 2 and 3.
> 
> All we still need is putting many services into one first-class value.
> This is possible via the usage of tuples or records. Records are probably
> more appropriate for the task, because they enable one to name the
> services. Moreover, the services are well able to share state. For
> example:
> 
> fun make_intcell initval =
> 	let
> 		val value = ref initval
> 		fun fset n = value := n
> 		fun fdiff n = value := !value + n
> 	in
> 		{ set=fset, diff=fdiff }
> 	end
> end
> 
> (Forgive me if I remember the syntax wrong. It's a nuisance to live
> between SML syntax and Ocaml syntax.)
> 
> What's missing? Now, a principal idea in object-oriented programming - one
> might say it's really the only real point of object-oriented programming,
> as opposed to object-based programming - is that you can make many
> internally-different services that can be used via the same interface.

That last part sounds a lot like ML-style modules, which are an IMHO a
lot more interesting aspect of ML. Interfaces where the implementation
details are unknown are also abstract. Have a look at the code of the
standard library of Ocaml, for example (not a full implementation, but
a simple example):

module type STACK =
  sig
    type 'a t
    exception Empty
    val create : unit -> 'a t
    val push : 'a -> 'a t -> unit
    val pop : 'a t -> 'a
  end

(* from the ocaml standard library, we could have used any other
   implementation providing the same interface, though *)
module Stack : STACK =
  struct
    type 'a t = { mutable c: 'a list }
    exception Empty
    let create () = { c = [] }
    let push x s = s.c <- x :: s.c
    let pop x = function
        [] -> raise Empty
      | hd::tl -> s.c <- tl; hd
  end

(this is Ocaml now, but SML is very similar)

Here, Stack.create creates a new abstract object of the abstract
datatype STACK whose interface we specified above.
The difference is, though, that a module isn't an object itself, but
rather provides an interface and implementation of a bunch of functions
to allow the creation of an object, etc. (instead of saying
let x = new <some_class>, it's let x = <module>.create :-)

> For
> example, one might be interested in intcells that reside on a remote
> machine (for example in a database). The _real_ boon of object-oriented
> programming is that you don't have to modify the code that uses the
> intcells to achieve this, and you can even have arrays of intcells some of
> which reside on the local machine (the simple implementation) and some of
> which are remote. This is possible in ML, because as long as the types of
> the fields of the record (ie. the services / methods) are equivalent,
> there's no restriction that the record (ie. the object) is constructed via
> make_intcell. Thus, the record type corresponds to an interface, whereas
> record instances correspond to objects. The only thing that corresponds
> somehow to the class is make_intcell, but the concept of class is not very
> important in OO (except in languages where interfaces have to be specified
> as classes).

I find this Ocaml code posted by Markus Mottl to comp.lang.functional a
while ago to be a good example of what I think you are suggesting:

  type 'a obj =
    {
      add : 'a -> unit;
      print : unit -> unit;
    }

  let make_int_obj init =
    let state = ref init in
    {
      add = (fun x -> state := x + !state);
      print = (fun () -> Printf.printf "%d\n" !state);
    }

  let make_float_obj init =
    let state = ref init in
    {
      add = (fun x -> state := x +. !state);
      print = (fun () -> Printf.printf "%f\n" !state);
    }

  let _ =
    let int_obj = make_int_obj 42
    and float_obj = make_float_obj 3.14159 in
    int_obj.add 3;
    float_obj.add 7.0;
    int_obj.print ();
    float_obj.print ()

> 
> This demonstrates another important point which is often obscured by most
> conventional object-oriented languages. It is the fact that _the
> criterion_ of a specific class / object implementing a given interface (=a
> specification of behavior) is not that it is inherited from it (though
> this is often required for technical reasons) nor that it has every method
> the interface has (though this is one of the minimum requirements). The
> criterion is that, considering the behavior specified by the interface,
> the class / object services behave in the way specified by the interface -
> ie. the code using the class (via the interface) gets the results it
> expects to get.
> 
> However, even though ML provides enough tools to handle basic OO stuff
> (actually some of which raise it over C++ as a language for writing
> object-oriented code), it has some difficulties to flexibly express some
> less important, but nevertheless handy OO structures. One of these is the
> lack of inheritance as a specialisation tool, but the most important is
> difficulties with classes / objects implementing more than one interface.
> This directly boils down to ML's static view of records: in ML, a record
> has to always be of a wholly-defined type; it is not enough that a record
> has /at least/ the fields needed for the task (which correspond to the
> methods required by a certain interface); the record has to have _exactly_
> the fields specified. More generally, the record is not defined by its
> fields, but the fields are defined by their record.

As I said, I'm not at all into this OO-stuff... could you give an
example where implementing something would be problematic in ML or not
as expressive as in a object-oriented language or otherwise not as nice
as the OO-implementation?

The shape example seems to be common for inheritance and the way I
understand it inheritance basically avoids redundant code. I think
that higher-order functions and modules (functors) provide a more
general way of eliminating code redundancy, but again, I lack experience
with actual OO programming.

> 
> The reasons for this are apparently technical. How do you manage the
> structure of records (in memory) if _any_ record can contain _any_ field?
> C++ solves this by separating function pointers from their closures (from
> the ML point of view) into tables and requiring that the interface be
> inherited in order for C++ to arrange the function pointer tables so that
> the object can be upcast into any of its superclasses (which are
> interfaces in proper OO programming). However, Ocaml object types (when
> objects are passed, for example, to functions as parameters) are specified
> by what services they must _at least_ provide and are in no way related to
> class definitions or inheritance. This would suggest generic polymorphic
> records are not impossible to implement efficiently with respect to time
> and memory consumption.

I think part of the problem might also be that records AFAIK weren't
really designed to be objects/classes. Records are a set of (mutable) named
fields and not 'objects', though as you point out closures can be used
as a sort of method.

> 
> The direction I see type systems as heading (if only there was any
> progress :)) is "requirement" types: functions that specify what fields a
> record should at least have, what possible alternatives a variant should
> at most have, and what types a tuple should begin with. Truly polymorphic
> (strong) type systems are the key to flexibility in programming.
> 

If I understand this correctly, it sounds like defining a rather
unspecific interface. How is the person that wants to use the "object"
supposed to know what methods he can use? It overall seems to boil down
to people only being able to use those "minimum requirement fields",
because he can't safely assume that any others are implemented.

I don't have the exact citation details but "Objective ML: An effective
object-oriented extension to ML" by Didier Remy and Jerome Vouillon
describes the OO-implementation of Ocaml. I haven't read it yet, though.

> Panu Kalliokoski
> 
> Am fuar -> symb <- am fesh
> atehwa@iki.fi
> 

Markus Kliegl 





------------------------------

Date: Fri, 17 Aug 2001 13:52:51 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Tabarnac, a new tarpit, which uses two function stacks

Thank you for the clarifications. The language is very neat. Could you add
it to http://www.purists.org/esoteric?

On Thu, 16 Aug 2001, Charles Lamontagne wrote:

> Here's the 'switch' program, with the stack diagrams. It's a complicated
> program, but it seems to work on the interpret.

... and double thank you for the effort.

Panu





------------------------------

Date: Fri, 17 Aug 2001 14:49:30 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [ML] [long] OO, type systems

On Fri, 17 Aug 2001, Markus Kliegl wrote:

> > pragmatic arguments against me.) An object is a set of closely-related
> > services, which guarantee certain behavior. Whether they have no
>
> Abstraction. More generally, an object can also have "private" methods.

The means the object uses to provide its interface are not significant
very significant IMO. A private method is just a way to share code.

> > Thus, a function pointer is a parameterless object that provides one
> > service.
>
> I don't understand what you mean by function pointer here.

A C-style function pointer, i.e. an action without associated parameters.
(The point is just that they don't have a closure and thus no
parametrism.)

> > What's missing? Now, a principal idea in object-oriented programming - one
> > might say it's really the only real point of object-oriented programming,
> > as opposed to object-based programming - is that you can make many
> > internally-different services that can be used via the same interface.
>
> That last part sounds a lot like ML-style modules, which are an IMHO a
> lot more interesting aspect of ML. Interfaces where the implementation

I can't much compare how interesting they are, but here are some
properties of records of functions compared to modules (structures):

Property		Recs		Structures
--------		----		----------
matching of interfaces	explicit	implicit
parametric		yes		yes, except not higher-order in
					some implementations
first-class values	yes		no, but Struct.type (which
					abstracts state) is
mixing in variable-	yes		no
length data structures
nice syntax		well...		better

... but you have to help me here: if I have

signature STACK = sig type t ... end
structure stack_impl1 :> STACK = struct type t = ... end
structure stack_impl2 :> STACK = struct type t = ... end

Are stack_impl1.t and stack_impl2.t always of the same type (by the virtue
of being restricted to STACK.t)? I think not, and this is a major obstacle
for object-oriented programming - now it does not suffice to know the
interface to an object, you also have to know how the object was built. I
think this is why modules are called "static".

> (this is Ocaml now, but SML is very similar)

I know, it's easy enough to read both but tiresome to try to write first
in one and then in the other.

> The difference is, though, that a module isn't an object itself, but
> rather provides an interface and implementation of a bunch of functions
> to allow the creation of an object, etc. (instead of saying
> let x = new <some_class>, it's let x = <module>.create :-)

This is not insignificant in all cases. Suppose we have a module which
just exports functions, ie it does not provide them for a specific data
type defined in the module. Now if we want to add parametrism to the
"class" represented by the module, we have to change user code. This means
that *modules do not abstract whether the services are parametric or not*.
(This can be circumvented by writing the module always as if it had
parameters, say provide a type t = unit, but few people do this.)

> I find this Ocaml code posted by Markus Mottl to comp.lang.functional a
> while ago to be a good example of what I think you are suggesting:
>
>   type 'a obj =
>     {
>       add : 'a -> unit;
>       print : unit -> unit;
>     }

A good example of a parametric class, but not of polymorphic data
structures. You can't place int_obj's and float_obj's in the same array.
The technique is quite neat, however. Here is another example, which does
use polymorphic data structures (I'll use the type declaration above):

>   let make_int_obj init =
>     let state = ref init in
>     {
>       add = (fun x -> state := x + !state);
>       print = (fun () -> Printf.printf "%d\n" !state);
>     }

let make_remote_int_obj (connection:DB.Conn_t) (myvar:string) =
   {
	add = (fun x -> DB.Set connection myvar (string_of_int x))
	print = (fun () -> int_of_string (DB.Retrieve connection myvar))
   }

Now records made with make_int_obj and make_remote_int_obj are both of
type int obj, and can be placed in the same array or pointed to by the
same reference (in succession, of course, not simultaneously).

> As I said, I'm not at all into this OO-stuff... could you give an

Most functional programmers aren't. I wouldn't say you definitely need it,
just that it's nice to have at hand when it would be beneficial.

> example where implementing something would be problematic in ML or not
> as expressive as in a object-oriented language or otherwise not as nice
> as the OO-implementation?

A lot of code to write, but is it enough to explain?

Suppose we have a, say, computer RPG. All entities in the world are
treated as objects. There are some objects that are visible (like
monsters) and some that aren't (like program clock, the process creating
monsters, communication channels etc.). Moreover, there are some objects
that are active (like monsters) and some that aren't (like collectable
artifacts). There might be some more classifications like this. Now we
want to have a list (or array) of visible objects (for updating the
screen), and similarly for active objects (to give them the possibility to
act), and possibly others for other purposes. For each of these lists, the
object should have an interface to enable it to be called by that service
(and to fit to the list type).  But making an object have multiple
interfaces is cumbersome in ML.

Another one is the "neat-but-not-necessary" technique of building classes
from pieces, inheriting some methods from here and some from there (nice
if you have 2 implementations of do_stuff and 3 implementations of
call_do_stuff). The modules system supports this by functors, but functors
are hierarchic, so mutual usage of services has to be explicitly arranged.
Not hard but not as neat. (Compare artificial who-calls-whom chains with
nice-and-handy coroutines.)

> The shape example seems to be common for inheritance and the way I
> understand it inheritance basically avoids redundant code. I think
> that higher-order functions and modules (functors) provide a more
> general way of eliminating code redundancy, but again, I lack experience
> with actual OO programming.

Usually parametrism (functors) is a neater way to eliminate code
reduplication. There just exist cases. The point of multiple interfaces is
more important.

> I think part of the problem might also be that records AFAIK weren't
> really designed to be objects/classes. Records are a set of (mutable) named
> fields and not 'objects', though as you point out closures can be used
> as a sort of method.

Having not been designed for the purpose, records work very well for it.
The only problem is the type system. But think about the benefits of
polymorphic records for ordinary functional programming: you could have a
function

let dist_2d r = sqrt (r.x *. r.x +. r.y *. r.y)
dist_2d : { x:float, y:float, ..> } -> float = <fun>

You could use it with _any_ record with fields x and y.

> If I understand this correctly, it sounds like defining a rather
> unspecific interface. How is the person that wants to use the "object"
> supposed to know what methods he can use? It overall seems to boil down

Functions that use methods add and print should require the object to have
at least the methods add and print, and possibly others. This is
equivalent to the field example above. This means you can't pass the
function an object that doesn't _at least_ provide the methods the
function uses, so the function can be sure it always can use the methods
it uses. :)

> to people only being able to use those "minimum requirement fields",
> because he can't safely assume that any others are implemented.

The minimum requirements are supposed to be inferred from the function
code. For example:

let inc obj = obj.add 1
inc : { add: int -> 'a, ..> } -> 'a = <fun>

> I don't have the exact citation details but "Objective ML: An effective
> object-oriented extension to ML" by Didier Remy and Jerome Vouillon
> describes the OO-implementation of Ocaml. I haven't read it yet, though.

Interesting. Maybe I should go read it.

Panu






------------------------------

Date: Fri, 17 Aug 2001 15:50:16 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [ML] [long] OO, type systems

Panu A Kalliokoski wrote:
> To explain these ideas, let's get back to what an object is. (If you
> happen to disagree with my definition, please do not use historical but
> pragmatic arguments against me.) An object is a set of closely-related
> services, which guarantee certain behavior.

Basically, I can live with that.  A "set of closely-related services
which guarantee a certain behaviour" could be used to describe things
that aren't always called "objects", though, too: API's, interfaces,
plug-ins, behaviours and such.

> All we still need is putting many services into one first-class value.
> This is possible via the usage of tuples or records. Records are probably
> more appropriate for the task, because they enable one to name the
> services.

I've tried using records for this in Erlang, and it works fairly well
although gets a bit clumsy sometimes.  An alternate strategy is to use a
module as an 'object class' a bit like Perl does.  The object's 'type'
is the name of the module, the services are the functions defined in
that module, and the instance is a record of the 'state' of the object. 
In Erlang this is a 'behaviour' and it's implemented basically as a set
of callback functions.

> This demonstrates another important point which is often obscured by most
> conventional object-oriented languages. It is the fact that _the
> criterion_ of a specific class / object implementing a given interface (=a
> specification of behavior) is not that it is inherited from it (though
> this is often required for technical reasons) nor that it has every method
> the interface has (though this is one of the minimum requirements). The
> criterion is that, considering the behavior specified by the interface,
> the class / object services behave in the way specified by the interface -
> ie. the code using the class (via the interface) gets the results it
> expects to get.

Ah - so you're saying that compatible behaviour is key (rather than
"ancestry" or "prototype")?  I'd mostly agree with that, too.

> The reasons for [no partial records in ML]
> are apparently technical. How do you manage the
> structure of records (in memory) if _any_ record can contain _any_ field?

Hash table?

> The direction I see type systems as heading (if only there was any
> progress :))

Yeah, I see them going backwards, or perhaps sideways...

> is "requirement" types: functions that specify what fields a
> record should at least have, what possible alternatives a variant should
> at most have, and what types a tuple should begin with. Truly polymorphic
> (strong) type systems are the key to flexibility in programming.

This is why I like Erlang, whose type system looks 'weak' initially, but
is actually very flexible and no more bug-prone than any other type
system I've tried. Your "requirements" are Erlang's "guards", that allow
you to write a function such as:

fib(X) when integer(X) -> ...
sqrt(X) when X > 0 -> ...
stuff(Tuple) when record(Tuple, desired_type) -> ...

and so forth.

Chris




------------------------------

Date: Sat, 18 Aug 2001 01:01:34 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [ML] [long] OO, type systems

On Fri, 17 Aug 2001, Chris Pressey wrote:

> Panu A Kalliokoski wrote:
> > pragmatic arguments against me.) An object is a set of closely-related
> > services, which guarantee certain behavior.
>
> Basically, I can live with that.  A "set of closely-related services
> which guarantee a certain behaviour" could be used to describe things
> that aren't always called "objects", though, too: API's, interfaces,
> plug-ins, behaviours and such.

I admit a tendency to see these as objects. Most people will probably not
regard these as objects because they do not have "encapsulated" state, but
I think it is part of object abstraction that the user of the object does
not know whether it has state or not.

> > All we still need is putting many services into one first-class value.
> > This is possible via the usage of tuples or records. Records are probably
> > more appropriate for the task, because they enable one to name the
> > services.
>
> I've tried using records for this in Erlang, and it works fairly well
> although gets a bit clumsy sometimes.  An alternate strategy is to use a
> module as an 'object class' a bit like Perl does.  The object's 'type'

Weakly typed languages (that do runtime checking of types) do not run into
nearly as much trouble with implementing polymorphic OO. It's not hard to
imagine polymorphic data struuctures of different implementations of the
same interface in a language that does not even complain if you put
arbitrarily strings and ints into the same array (or list). It does fail
if you do reduce(op+) on that list, but does so at run time. Hooray.

> > criterion is that, considering the behavior specified by the interface,
> > the class / object services behave in the way specified by the interface -
> > ie. the code using the class (via the interface) gets the results it
> > expects to get.
>
> Ah - so you're saying that compatible behaviour is key (rather than
> "ancestry" or "prototype")?  I'd mostly agree with that, too.

Exactly. I remember discussing this earlier :) but I've nowadays adopted
the habit of speaking of behavior-oriented programming instead of
object-oriented programming when I want to emphasise the point of
object-oriented programming (as I see it). It has the adde3d merit that
people don't have stupid prejudices on the word.

> > The reasons for [no partial records in ML] > are apparently
> > technical. How do you manage the > structure of records (in memory) if
> > _any_ record can contain _any_ field?
>
> Hash table?

That's what weakly typed languages (usually) do. It's a tremendous waste
of both memory and cpu time. One possible solution would be to give any
field name a unique id (starting from 1), and try to arrange the id's so
as to minimise fragmentation. But that's not that much better memory-wise
(cpu-wise it's a lot better).

> system I've tried. Your "requirements" are Erlang's "guards", that allow
> you to write a function such as:
>
> fib(X) when integer(X) -> ...
> sqrt(X) when X > 0 -> ...
> stuff(Tuple) when record(Tuple, desired_type) -> ...

Are these checks performed at compile time or at runtime? If they're done
at runtime, they don't add much value (an incorrect use of a value will
fail anyway).

Panu






------------------------------

Date: Fri, 17 Aug 2001 17:37:52 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [ML] [long] OO, type systems

Panu A Kalliokoski wrote:
> On Fri, 17 Aug 2001, Chris Pressey wrote:
> > Panu A Kalliokoski wrote:
> > > pragmatic arguments against me.) An object is a set of closely-related
> > > services, which guarantee certain behavior.
> >
> > Basically, I can live with that.  A "set of closely-related services
> > which guarantee a certain behaviour" could be used to describe things
> > that aren't always called "objects", though, too: API's, interfaces,
> > plug-ins, behaviours and such.
> 
> I admit a tendency to see these as objects. Most people will probably not
> regard these as objects because they do not have "encapsulated" state, but
> I think it is part of object abstraction that the user of the object does
> not know whether it has state or not.

Yes.  I think that too.

> > Ah - so you're saying that compatible behaviour is key (rather than
> > "ancestry" or "prototype")?  I'd mostly agree with that, too.
> 
> Exactly. I remember discussing this earlier :) but I've nowadays adopted
> the habit of speaking of behavior-oriented programming instead of
> object-oriented programming when I want to emphasise the point of
> object-oriented programming (as I see it). It has the adde3d merit that
> people don't have stupid prejudices on the word.

Behaviour-oriented is definately a less polluted term :)

> > system I've tried. Your "requirements" are Erlang's "guards", that allow
> > you to write a function such as:
> >
> > fib(X) when integer(X) -> ...
> > sqrt(X) when X > 0 -> ...
> > stuff(Tuple) when record(Tuple, desired_type) -> ...
> 
> Are these checks performed at compile time or at runtime?

I believe that's a "local issue" with respect to the language.  The
standard Erlang/OTP package uses runtime checks.  I believe other Erlang
compilers have been written that use static checking when possible.  I
know there is a seperate sound-inferred-type-checker for Erlang
available, but I don't think it has the ability to also optimize the
program based on it.

In (my) ideal world, it would be a local issue, and in the ideal
implementation the checks would be performed statically when that's
possible, dynamically when it's not.

> If they're done
> at runtime, they don't add much value (an incorrect use of a value will
> fail anyway).

It will fail, but if you have *planned* for failure (catch/throw), that
is not necessarily a bad thing.  The Erlang approach is to avoid writing
"error clauses" into a function, and to simply let unmatched arguments
fail and let that failure be caught by the caller.  This is an approach
that is in some ways the opposite of strong typing, some call it
"fault-tolerant" programming.

I used to be greatly in favour of strong typing and optimizing the hell
out of code to make it as small and as fast as possible.  And I still
am, for firmware.  But for software on modern-day machines, I'm not sold
on it anymore.  Run-time type checking definately has flexibility
benefits.

Chris




------------------------------

Date: Sat, 18 Aug 2001 10:44:44 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] Re: [ML] [long] OO, type systems



On Fri, 17 Aug 2001, Panu A Kalliokoski wrote:

> On Fri, 17 Aug 2001, Markus Kliegl wrote:
> 
> > > What's missing? Now, a principal idea in object-oriented programming - one
> > > might say it's really the only real point of object-oriented programming,
> > > as opposed to object-based programming - is that you can make many
> > > internally-different services that can be used via the same interface.
> >
> > That last part sounds a lot like ML-style modules, which are an IMHO a
> > lot more interesting aspect of ML. Interfaces where the implementation
> 
> I can't much compare how interesting they are, but here are some
> properties of records of functions compared to modules (structures):
> 
> Property		Recs		Structures
> --------		----		----------
> matching of interfaces	explicit	implicit
> parametric		yes		yes, except not higher-order in
> 					some implementations
> first-class values	yes		no, but Struct.type (which
> 					abstracts state) is
> mixing in variable-	yes		no
> length data structures
> nice syntax		well...		better

Sorry, vim messed up the formatting of that table.

What do you mean by 'matching of interfaces' and 'mixing in
variable-length data structures'?

What you should be comparing is records with the ADTs of the module
(i.e. Struct.type) as those are the 'objects'. Again, the difference
here is that the functions in the module operate on an object of the
type they define passed to them, rather than the functions/methods being
part of the object. If I understand 'mixing in variable-length data
structures' correctly, we can, for example, have a 'int Stack.t list'.

The original idea was that a record's type denotes the interface and I
was claiming that modules can be used nicely for creating interfaces.
Comparing records and modules is comparing (simulated) objects and 
implementations of ADTs and a record might be used as the ADT implemented
by the module, though probably not trying to simulate an object (i.e. the
methods are functions of the module and not closures that are part of the
record).

> 
> ... but you have to help me here: if I have
> 
> signature STACK = sig type t ... end
> structure stack_impl1 :> STACK = struct type t = ... end
> structure stack_impl2 :> STACK = struct type t = ... end
> 
> Are stack_impl1.t and stack_impl2.t always of the same type (by the virtue
> of being restricted to STACK.t)? I think not, and this is a major obstacle
> for object-oriented programming - now it does not suffice to know the
> interface to an object, you also have to know how the object was built. I
> think this is why modules are called "static".

That would eliminate the entire point of abstraction. The point is that
we do not need to know how the type and the functions that work on it
are implemented. stack_impl1.t and stack_impl2.t may not be of the same
type, but if you change the entire program to use stack_impl2 instead of
stack_impl1 it shouldn't change the behavior at all.

Why do you conclude that we have to know in what way the object was
built? And modules certainly aren't static, as we can create new ones
during runtime ("dynamically") with functors.

> 
> > (this is Ocaml now, but SML is very similar)
> 
> I know, it's easy enough to read both but tiresome to try to write first
> in one and then in the other.
> 

Agreed. I learned a lot of ML from SML, but I only use Ocaml.

> > The difference is, though, that a module isn't an object itself, but
> > rather provides an interface and implementation of a bunch of functions
> > to allow the creation of an object, etc. (instead of saying
> > let x = new <some_class>, it's let x = <module>.create :-)
> 
> This is not insignificant in all cases. Suppose we have a module which
> just exports functions, ie it does not provide them for a specific data
> type defined in the module. Now if we want to add parametrism to the
> "class" represented by the module, we have to change user code. This means
> that *modules do not abstract whether the services are parametric or not*.
> (This can be circumvented by writing the module always as if it had
> parameters, say provide a type t = unit, but few people do this.)

It's hard for me to understand what you mean here. What is the
difference between the 'class' and the 'object'?
If we implement something as an ADT, we create a module with type t as
the ADT and a bunch of functions to operate on that type t. Thus, in my
comparison, type t is the type of object and a method of type t is
called as <module>.<method> and not as
<object_of_type_<module>.t>.method.

If we don't abstract a type in a module, the module isn't being used to
implement an ADT, but probably to group a set of functions together or
avoid name clashes. Such a module doesn't wish to implement a "class".

You can't abstract whether a method takes an argument or not. How is the
user supposed to know how to call the method then? You can't abstract a
method like that in C++ either.

If you change a method to take an argument, you change the interface of
the module and the user will have to change his code then. The same
holds for C++, too.

> 
> > I find this Ocaml code posted by Markus Mottl to comp.lang.functional a
> > while ago to be a good example of what I think you are suggesting:
> >
> >   type 'a obj =
> >     {
> >       add : 'a -> unit;
> >       print : unit -> unit;
> >     }
> 
> A good example of a parametric class, but not of polymorphic data
> structures. You can't place int_obj's and float_obj's in the same array.
> The technique is quite neat, however. Here is another example, which does
> use polymorphic data structures (I'll use the type declaration above):
> 
> >   let make_int_obj init =
> >     let state = ref init in
> >     {
> >       add = (fun x -> state := x + !state);
> >       print = (fun () -> Printf.printf "%d\n" !state);
> >     }
> 
> let make_remote_int_obj (connection:DB.Conn_t) (myvar:string) =
>    {
> 	add = (fun x -> DB.Set connection myvar (string_of_int x))
> 	print = (fun () -> int_of_string (DB.Retrieve connection myvar))
>    }
> 
> Now records made with make_int_obj and make_remote_int_obj are both of
> type int obj, and can be placed in the same array or pointed to by the
> same reference (in succession, of course, not simultaneously).

Just that what you did here was evil :-)
You have two implementations implementing the same interface, but they
have entirely different semantics (except for your print function having
type unit -> int, not unit -> unit).
If the user calls the add function of every object with an argument of
say 3, he's adding the number 3 to the current value of the object if
it's an int_obj and adding the number 3 to the database if it's a
remote_int_obj.

> 
> > As I said, I'm not at all into this OO-stuff... could you give an
> 
> Most functional programmers aren't. I wouldn't say you definitely need it,
> just that it's nice to have at hand when it would be beneficial.

Well, if I ever come across such a problem, I can use Ocaml's objects,
which might just make it a little easier than trying to fake objects
with records ;-)

> 
> > example where implementing something would be problematic in ML or not
> > as expressive as in a object-oriented language or otherwise not as nice
> > as the OO-implementation?
> 
> A lot of code to write, but is it enough to explain?
> 
> Suppose we have a, say, computer RPG. All entities in the world are
> treated as objects. There are some objects that are visible (like
> monsters) and some that aren't (like program clock, the process creating
> monsters, communication channels etc.). Moreover, there are some objects
> that are active (like monsters) and some that aren't (like collectable
> artifacts). There might be some more classifications like this. Now we
> want to have a list (or array) of visible objects (for updating the
> screen), and similarly for active objects (to give them the possibility to
> act), and possibly others for other purposes. For each of these lists, the
> object should have an interface to enable it to be called by that service
> (and to fit to the list type).  But making an object have multiple
> interfaces is cumbersome in ML.
> 
> Another one is the "neat-but-not-necessary" technique of building classes
> from pieces, inheriting some methods from here and some from there (nice
> if you have 2 implementations of do_stuff and 3 implementations of
> call_do_stuff). The modules system supports this by functors, but functors
> are hierarchic, so mutual usage of services has to be explicitly arranged.
> Not hard but not as neat. (Compare artificial who-calls-whom chains with
> nice-and-handy coroutines.)

I did once program in a MUD using a language called LPC (which is still
one of my favorite languages... C-like syntax, but it has closures) and
(multiple) inheritance was indeed very practical there.

So yes, OO definitely beats ML at stuff like that. I wouldn't dare
consider using C++ as a language for a mud either, though. I think a
lisp-like language would be best, but this is getting rather off-topic.

> 
> > I think part of the problem might also be that records AFAIK weren't
> > really designed to be objects/classes. Records are a set of (mutable) named
> > fields and not 'objects', though as you point out closures can be used
> > as a sort of method.
> 
> Having not been designed for the purpose, records work very well for it.
> The only problem is the type system. But think about the benefits of
> polymorphic records for ordinary functional programming: you could have a
> function

Let's get some terminology straightened out.
type 'a some_rec = { foo: 'a; bar: 'a -> 'a } is a type that takes another
type as argument (a higher-order type?).
let create_rec x y = { foo = x; bar = y } has type
'a -> ('a -> 'a) -> 'a some_rec. create_rec is a polymorphic function
because all the functions that operate on its arguments (i.e. none)
don't require them to be of a specific type, or simply: they are all
polymorphic functions, as well.

So what, by your definition, is a polymorphic record then?

> 
> let dist_2d r = sqrt (r.x *. r.x +. r.y *. r.y)
> dist_2d : { x:float, y:float, ..> } -> float = <fun>
> 
> You could use it with _any_ record with fields x and y.

I don't get it. dist_2d is only usable with records of type
{ x:float; y:float }. I don't see how else it should be usable, as sqrt
and *. and +. only work with floats.

Like you say, the fields define their record, therefore you can only
have one type of record with the fields x and y. What you could do, is
for example:
type ('a,'b) foo = { x: 'a; y: 'b }
let create x y = { x = x; y = y }
create has type 'a -> 'b -> ('a, 'b) foo and is polymorphic (see my
definition/reason above). It would also work if it used functions like (=)
which are polymorphic.

What you're talking about sounds more like function overloading and
there is an experimental version of Ocaml around (called G'Caml) that
implements that. Also known as generic functions and "extensional
polymorphism" apparently.

http://pauillac.inria.fr/~furuse/generics/

> 
> > If I understand this correctly, it sounds like defining a rather
> > unspecific interface. How is the person that wants to use the "object"
> > supposed to know what methods he can use? It overall seems to boil down
> 
> Functions that use methods add and print should require the object to have
> at least the methods add and print, and possibly others. This is
> equivalent to the field example above. This means you can't pass the
> function an object that doesn't _at least_ provide the methods the
> function uses, so the function can be sure it always can use the methods
> it uses. :)
> 
> > to people only being able to use those "minimum requirement fields",
> > because he can't safely assume that any others are implemented.
> 
> The minimum requirements are supposed to be inferred from the function
> code. For example:
> 
> let inc obj = obj.add 1
> inc : { add: int -> 'a, ..> } -> 'a = <fun>

Ahh, is this what you mean with multiple interfaces? Like having an
interface 'number' that requires the functions add, multiply, etc. and then
being able to have functions that work on records that implement (at
least) interface 'number'.

That would indeed be quite interesting. Though, of course, for it to be
considered in ML, you'd need to construct a proof that it's type-safe or
figure out how to implement it in such a way that it is type-safe.

> 
> > I don't have the exact citation details but "Objective ML: An effective
> > object-oriented extension to ML" by Didier Remy and Jerome Vouillon
> > describes the OO-implementation of Ocaml. I haven't read it yet, though.
> 
> Interesting. Maybe I should go read it.

You can get it at citeseer
http://citeseer.nj.nec.com/remy98objective.html, where you can find the
exact citation details as well.

> 
> Panu
> 
> 

Markus





------------------------------

Date: Sun, 19 Aug 2001 16:45:29 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [ML] [long] OO, type systems

On Sat, 18 Aug 2001, Markus Kliegl wrote:

> > matching of interfaces	explicit	implicit
> What do you mean by 'matching of interfaces' and

A small detail: when you assign an interface to a module, the matching of
components (methods) to the signature (interface) is implicit: STACK.pop
gets automatically bound to MyStackImplementation.pop. With records, you
have to explicitly assign the functions to the fields of the record. This
offers more flexibility (the usefulness of which is doubtful) and some
more effort.

> > mixing in variable-	yes		no
> > length data structures
> 'mixing in variable-length data structures'?

A neat example of this is the int_cells vs remote_int_cells below. You
can't mix alternative structures - or rather, struct.t's (implementations)
of the same signature (interface) in the same data structure, say, list.

I find this very hard to explain because modules export their state type,
struct.t, whereas with records of functions it is implicit, in the
closure. Why is exporting struct.t so bad? Because to enable runtime
polymorphism on ADT's, the _object_ (i.e. value of type struct.t) should
contain enough information in it to choose between routines to call on it.
Abstracting the type is enough for encapsulation but not for runtime
polymorphism - and the latter is the "big idea" of OO.

Here is an example. Let's stick to the RPG example again.

signature ANIMATE = sig
	type internals
	update : internals -> unit
	talk_with : internals -> string -> string
	take_attack : internals -> attack -> unit
	...
end;;

structure Snake : ANIMATE =
	type internals = ...
	...
end;;

structure Human : ANIMATE =
	type internals = ...
	...
end;;

(You might say that structures are ill-suited for this purpose, but that's
exactly what I'm trying to show.) Now, even though both human and Snake
fulfill the type ANIMATE and even though both juggle state around as
ANIMATE.internals, you have to say

Human.talk_with myhuman "Hello"
Snake.talk_with mysnake "Boo!"

I.e. ANIMATE.internals does not carry enough information with it to decide
which function (method) should be called with it. This is reflected in the
type system, so that Human.internals and Snake.internals are not of the
same type. Net result: you can't put humans (states of type
Human.internals) and snakes (ditto) into the same list. Compare:

type animate =
{
	update : unit -> unit;
	talk_with : string -> string;
	take_attack : attack -> unit;
	...
}

let make_human ... =
	let state = { mutable hp = ... } in
	{
		update = (fun ...);
		...
	}
;;

let make_snake ... ;;

Now the records returned by make_human and make_snake are of the same
type, carry with them enough information to know which method to invoke
(is it the update defined in make_human or the update defined in
make_snake?) so you can put them into the same list, forgetting about
whther they were snakes or humans, but have them act appropriately when
talked to.

> What you should be comparing is records with the ADTs of the module
> (i.e. Struct.type) as those are the 'objects'. Again, the difference

I know. I'm doing that. Struct Human corresponds to make_human ("class");
Human.type corresponds to the closure of make_human's inner functions
("object internal state"); signature corresponds to the record type
("interface").

> Comparing records and modules is comparing (simulated) objects and
> implementations of ADTs and a record might be used as the ADT implemented
> by the module, though probably not trying to simulate an object (i.e. the

Of course. But often the module simply is not necessary. And pure-and-bare
module interfaces have two shortcomings: 1) they don't abstract away
whether the services have state or not (is there a module.t or not?) 2)
they require you to know what module you're using: no myobject.dosomething
but rather Modulebeingused.dosomething myobject.

> > Are stack_impl1.t and stack_impl2.t always of the same type (by the virtue
> > of being restricted to STACK.t)? I think not, and this is a major obstacle
> > for object-oriented programming - now it does not suffice to know the
> > interface to an object, you also have to know how the object was built. I
> > think this is why modules are called "static".
>
> That would eliminate the entire point of abstraction. The point is that
> we do not need to know how the type and the functions that work on it
> are implemented. stack_impl1.t and stack_impl2.t may not be of the same
> type, but if you change the entire program to use stack_impl2 instead of
> stack_impl1 it shouldn't change the behavior at all.

But you have to change the whole program. With the OO approach, all you
change is how the stacks are created (make_stack1 or make_stack2). All
other code can use both kinds of stack unchanged. This is something you
can achieve with templates, too. Mixing of different implementations in
the same array or list can only be achieved with dynamically-bound
interfaces (true OO).

> Why do you conclude that we have to know in what way the object was built?

Because we have to know whether it is stack1.t or stack2.t to know whether
to use stack1.pop or stack2.pop.

> If we don't abstract a type in a module, the module isn't being used to
> implement an ADT, but probably to group a set of functions together or
> avoid name clashes. Such a module doesn't wish to implement a "class".

I think you see objects too tightly connected with data. It's part of
object abstraction whether the _services_ have data or not.

> You can't abstract whether a method takes an argument or not. How is the
> user supposed to know how to call the method then? You can't abstract a
> method like that in C++ either.

I've been talking about parameters in the sense of "data that affects the
object's behavior". Thus, not only arguments are parameters, but also the
closure in which the object was built. Modules are unsuitable for OO
(partly) because of exactly what you said above, namely that you can't
abstract whether a method/function takes an argument, but modulesh handle
the state via argument passing. Result: no abstraction whether they have
state or not.

> > >   let make_int_obj init =
> > >     let state = ref init in
> > >     {
> > >       add = (fun x -> state := x + !state);
> > >       print = (fun () -> Printf.printf "%d\n" !state);
> > >     }
> >
> > let make_remote_int_obj (connection:DB.Conn_t) (myvar:string) =
> >    {
> > 	add = (fun x -> DB.Set connection myvar (string_of_int x))
> > 	print = (fun () -> int_of_string (DB.Retrieve connection myvar))
this should of course have been:
	print = (fun () -> Printf.printf "%d\n" (int_of_string
			(DB.Retrieve connection myvar)))

> >    }
> >
> > Now records made with make_int_obj and make_remote_int_obj are both of
> > type int obj, and can be placed in the same array or pointed to by the
> > same reference (in succession, of course, not simultaneously).
>
> Just that what you did here was evil :-)

It's funny you see this as evil, because it's the major boon of OO.
Suppose int obj's have a specification: add: int->unit adds its argument
to the int represented by the object, leaving it to the new value. print:
unit->unit prints the value represented by the cell. Now neither of the
implementations above break the specification. What's so evil here?

> If the user calls the add function of every object with an argument of
> say 3, he's adding the number 3 to the current value of the object if
> it's an int_obj and adding the number 3 to the database if it's a
> remote_int_obj.

Exactly. This is the kind of implementation abstraction modules do not
provide: runtime interface-based polymorphism.

Would it sound more sensible to you if some int obj's would trigger side
effects when being changed and some not? That's also achievable by this
technique. Or some ints printing debug output whe3n they're being changed.
As long as they don't break the specification, they don't break code.

> > Most functional programmers aren't. I wouldn't say you definitely need it,
> > just that it's nice to have at hand when it would be beneficial.
>
> Well, if I ever come across such a problem, I can use Ocaml's objects,
> which might just make it a little easier than trying to fake objects
> with records ;-)

I've tried them both, and in my humble opinion the record solution is a
lot cleaner, easier and focused-to-the-point OO construct than Ocaml
classes are. Except for the weakness in records' type scheme.

> So yes, OO definitely beats ML at stuff like that. I wouldn't dare

It's interesting you say "OO" beats "ML" (the former is a design
technique, the latter is a family of languages). AThe whole point of my
original posting is that you can do good OO in ML via structures of
function pointers, and the only problem is that the type system does not
allow for polymorphic record types.

> consider using C++ as a language for a mud either, though. I think a

The more I work with garbage-collected languages the more irritated I
become by the primitive memory handling of C++. It's better than C but not
that much better. That andusing 120% of syntax space is what irritates me
in C++. (The latter also applies to Ocaml.) And again, OO is not a
language property but rather a design technique.  There are some languages
that are too weak to make OO in (like Pascal), but for example C is fine
for OO.

> > polymorphic records for ordinary functional programming: you could have a
> > function
>
> Let's get some terminology straightened out.

Right. There are of course many ways for types to be polymorphic. What I
here mean by polymorphic record is types that specify (in the function
prototype) the minimum requirements of the record to be given as argument;
ie. what fields it should at least have and what their types should be.
Such a thing does not exist in ML, it's a proposal.

It would be like this:

type record1 = { mutable a: int; b: int; c:int }
type record2 = { mutable a: int; d: int; e:int }
let (change_a: { mutable a; ..> } as 'a -> 'a) rec = rec.a <- 0; rec
change_a {a=1;b=2;c=3}  (evaluates to {a=0;b=2;b=3})
change_a {a=3;d=0;e=1}  (evaluates to {a=0;d=0;e=1})

> > let dist_2d r = sqrt (r.x *. r.x +. r.y *. r.y)
> > dist_2d : { x:float, y:float, ..> } -> float = <fun>
> >
> > You could use it with _any_ record with fields x and y.
>
> I don't get it. dist_2d is only usable with records of type
> { x:float; y:float }. I don't see how else it should be usable, as sqrt
> and *. and +. only work with floats.

I should have said: for any record with fields x and y of type float. The
point is that the records could have other fields, too - and you could
use dist_2d on all those record types.

> Like you say, the fields define their record, therefore you can only
> have one type of record with the fields x and y. What you could do, is

This is exactly the restriction I'd like to lift.

> > let inc obj = obj.add 1
> > inc : { add: int -> 'a, ..> } -> 'a = <fun>
>
> Ahh, is this what you mean with multiple interfaces? Like having an
> interface 'number' that requires the functions add, multiply, etc. and then
> being able to have functions that work on records that implement (at
> least) interface 'number'.

Kind of. Better still, they could only require the part of interface they
use, like "add" if they use it (and then not require the other functions
in the interface 'number' because it does not use them). . This is the
same as in the examples above requiring the record only to have those
fields that are required for the computation the function performs.

> That would indeed be quite interesting. Though, of course, for it to be
> considered in ML, you'd need to construct a proof that it's type-safe or
> figure out how to implement it in such a way that it is type-safe.

Ocaml implements it in the object extensions (have you read the part of
manual describing objects?), so I'm saved the trouble. My point is just
that you wouldn't need the object extension at all if you had polymorphic
(as described above) record types.

As for the soundness, it's been proven a couple of times. What is
important is what kinds of conversions and constructors these polymorphic
records provide. (Many OO people are scientific about their business, even
though the functional people tend to be more so.)

I find it very interesting how hostile the attitude of many smart people
is towards OO. It's a non-insignificant part of system design, so I think
it's useful for people to study, like other techniques discussed on this
list. OO is not about encapsulation (only); not only about abstraction,
though this is very important; definitely not about class hierarchies.
It's a technique to achieve varying actions via the same interface, so
that none of the actions break the behavioral specification. It's a
powerful technique to move choosing between actions from user code to
library code. (ML people are usually proud of the compiler warning of
inexhaustive matches when new alternatives have been added to a variant.
This is a problem much more elegantly solved by interfaces.)

Panu





------------------------------

Date: Sun, 19 Aug 2001 22:49:13 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] ,[system design] AOP, bJ


Just when you thought you had got over Panu's every-quarter-year posting
about "what OO _really_ is about", you're drawn to another design
technique: aspect-oriented programming. Aspect-oriented programming seems
to be, in my opinion, kind of an attempt to say: "okay - OO is fine, now
we're going to come up with something even better."

Like OOP, AOP seems to be a technique with much mumbo jumbo and some
genuinely interesting ideas. The ideas of AOP are, as much as I
understand, much simpler than in OOP, so maybe it will really have some
value for everyday programmers. Also like OOP, AOP has developped its own
terminology to confuse old school programmers and to impress"new school"
ones.

Straight from Xerox' AOP pages:
<quote>

Aspect-oriented programming (AOP) is a new programming methodology that
enables the modularization of crosscutting concerns. Experience has shown
that using standard procedural or object-oriented programming languages it
can be difficult to modularize design concerns such as:
  * error-checking strategies
  * design patterns
  * synchronization policies
  * resource sharing
  * distribution concerns
  * performance optimizations

</quote>

No generic FAQ or introduction I could find on AOP seemed to really give
any information - they only talk of the merits of AOP, not how they are
achieved. However, the #1 aspect language (or so it seems), AspectJ, had
(thank god) some online documentation of how aspects are dealt with.

If I've understood everything correctly, AspectJ defines a (syntactically)
neat way to hook almost whatever might happen in a Java program (AspectJ
is an extension to Java). This includes method calls, method execution,
exception throwing, exception handling and so on. Code can be executed
before or after anuy of these events (there is also a third order
specification, around, but I didn't yet read any examples that would use
it).

Okay, so the engine provides a way to get code executed at almost any
point. Because of this hook-like nature of specifying when some code gets
executed, one can place together the pieces of code that work together, ie
for the same purpose. They may also have private state, like objects.

I think some "pure" aspect languages include Beta-Juliet, Aardappel, and
many rewrite-rule-based languages. (Because hooks are sufficient for
control flow, why have anything else?) These bring into focus some points
which still can't be hooked: code pattern (for example, hook that's
activatd when foo has called bar which has called first baz and then
quux), data patterns, and hooks themselves (place a hook on a hook and
you'll see).

Of course, it's up to the programmer to arrange the hooks sensibly. I feel
AOP leads to programs that are easy to understand in the big picture but
very hard to see how a specific piece of execution goes. I guess they have
some kind of design strategy to build aspective programs without messing
themselves up (heavy encapsulations might be one).

***

Chris, how about changing the semantics of bJ so that "caused by" uses a
stack to unwind cascades, and "caused after" uses a queue? Or rather, both
use a deque, but "by" adds them to the consumption end and "after" adds
them to the other end?

By the way, here is a proof why bJ + Portia is not Turing-complete.

Consider the number of rules defined in a bJ + Portia program. There is a
finite number of rule definitions, some of which are expanded (by Portia)
to a set of rule definitions, the number of rules in which is a product of
the numbers of elements in Portia alphabets used in the rule template. The
number of these rules is thus also finite, because Portia alphabets have a
finite number of elements.

Now consider the states of a bJ program. tThey're defined by the order of
events happened. Because only the most recent one of the events counts,
the number of orderings is the factorial of the number of rules, which is
finite. Because the program has a finite number of states, it either stops
before that number of states has been reached, or it does not stop at all.
Thus no halting problem, and TC is impossible. (As you can see, I'm just
imitating whoever-it-was who posted the proof about SMETANA on the list).

Have I missed something?

Panu
-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Mon, 20 Aug 2001 23:08:38 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] Re: [ML] [long] OO, type systems


[I think I'm really the wrong person to argue with :-)]

On Sun, 19 Aug 2001, Panu A Kalliokoski wrote:

> On Sat, 18 Aug 2001, Markus Kliegl wrote:
> 
> > > mixing in variable-	yes		no
> > > length data structures
> > 'mixing in variable-length data structures'?
> 
> A neat example of this is the int_cells vs remote_int_cells below. You
> can't mix alternative structures - or rather, struct.t's (implementations)
> of the same signature (interface) in the same data structure, say, list.
> 
> I find this very hard to explain because modules export their state type,
> struct.t, whereas with records of functions it is implicit, in the
> closure. Why is exporting struct.t so bad? Because to enable runtime
> polymorphism on ADT's, the _object_ (i.e. value of type struct.t) should
> contain enough information in it to choose between routines to call on it.
> Abstracting the type is enough for encapsulation but not for runtime
> polymorphism - and the latter is the "big idea" of OO.
> 
> Here is an example. Let's stick to the RPG example again.
> 
> signature ANIMATE = sig
> 	type internals
> 	update : internals -> unit
> 	talk_with : internals -> string -> string
> 	take_attack : internals -> attack -> unit
> 	...
> end;;
> 
> structure Snake : ANIMATE =
> 	type internals = ...
> 	...
> end;;
> 
> structure Human : ANIMATE =
> 	type internals = ...
> 	...
> end;;
> 
> (You might say that structures are ill-suited for this purpose, but that's
> exactly what I'm trying to show.) Now, even though both human and Snake
> fulfill the type ANIMATE and even though both juggle state around as
> ANIMATE.internals, you have to say
> 
> Human.talk_with myhuman "Hello"
> Snake.talk_with mysnake "Boo!"
> 
> I.e. ANIMATE.internals does not carry enough information with it to decide
> which function (method) should be called with it. This is reflected in the
> type system, so that Human.internals and Snake.internals are not of the
> same type. Net result: you can't put humans (states of type
> Human.internals) and snakes (ditto) into the same list. Compare:
> 
> type animate =
> {
> 	update : unit -> unit;
> 	talk_with : string -> string;
> 	take_attack : attack -> unit;
> 	...
> }
> 
> let make_human ... =
> 	let state = { mutable hp = ... } in
> 	{
> 		update = (fun ...);
> 		...
> 	}
> ;;
> 
> let make_snake ... ;;
> 
> Now the records returned by make_human and make_snake are of the same
> type, carry with them enough information to know which method to invoke
> (is it the update defined in make_human or the update defined in
> make_snake?) so you can put them into the same list, forgetting about
> whther they were snakes or humans, but have them act appropriately when
> talked to.

Very clear example... thanks. I think I understand OO better now and I
was confusing ADTs with objects.

> 
> > > Are stack_impl1.t and stack_impl2.t always of the same type (by the virtue
> > > of being restricted to STACK.t)? I think not, and this is a major obstacle
> > > for object-oriented programming - now it does not suffice to know the
> > > interface to an object, you also have to know how the object was built. I
> > > think this is why modules are called "static".
> >
> > That would eliminate the entire point of abstraction. The point is that
> > we do not need to know how the type and the functions that work on it
> > are implemented. stack_impl1.t and stack_impl2.t may not be of the same
> > type, but if you change the entire program to use stack_impl2 instead of
> > stack_impl1 it shouldn't change the behavior at all.
> 
> But you have to change the whole program. With the OO approach, all you
> change is how the stacks are created (make_stack1 or make_stack2). All
> other code can use both kinds of stack unchanged. This is something you
> can achieve with templates, too. Mixing of different implementations in
> the same array or list can only be achieved with dynamically-bound
> interfaces (true OO).
> 
> > Why do you conclude that we have to know in what way the object was built?
> 
> Because we have to know whether it is stack1.t or stack2.t to know whether
> to use stack1.pop or stack2.pop.

Ok, that is a significant difference between methods in the module and
methods in the object.

> 
> > If we don't abstract a type in a module, the module isn't being used to
> > implement an ADT, but probably to group a set of functions together or
> > avoid name clashes. Such a module doesn't wish to implement a "class".
> 
> I think you see objects too tightly connected with data. It's part of
> object abstraction whether the _services_ have data or not.

A module function operates on an ADT, whereas a method operates on the
object it belongs to, regardless of whether or not the object has data?

You've convinced me that records are a better simulation of objects than
modules. It just seems to me that OO seems to advertise data abstraction
a lot. Though rereading Bjarne Stroustrup's "What is object-oriented
programming?" (1991 revised version), he does seem to make a distinct
separation of data abstraction and object-orientation. I don't know
if Stroustrup is an authority in OO concepts.

> 
> > > >   let make_int_obj init =
> > > >     let state = ref init in
> > > >     {
> > > >       add = (fun x -> state := x + !state);
> > > >       print = (fun () -> Printf.printf "%d\n" !state);
> > > >     }
> > >
> > > let make_remote_int_obj (connection:DB.Conn_t) (myvar:string) =
> > >    {
> > > 	add = (fun x -> DB.Set connection myvar (string_of_int x))
> > > 	print = (fun () -> int_of_string (DB.Retrieve connection myvar))
> this should of course have been:
> 	print = (fun () -> Printf.printf "%d\n" (int_of_string
> 			(DB.Retrieve connection myvar)))
> 
> > >    }
> > >
> > > Now records made with make_int_obj and make_remote_int_obj are both of
> > > type int obj, and can be placed in the same array or pointed to by the
> > > same reference (in succession, of course, not simultaneously).
> >
> > Just that what you did here was evil :-)
> 
> It's funny you see this as evil, because it's the major boon of OO.
> Suppose int obj's have a specification: add: int->unit adds its argument
> to the int represented by the object, leaving it to the new value. print:
> unit->unit prints the value represented by the cell. Now neither of the
> implementations above break the specification. What's so evil here?

The interface, in my opinion, defines what methods and types, etc. are
exported and (perhaps through comments or documentation) provides a
semantics of what those methods do and what arguments should be passed,
etc. The idea is that the implementation is abstracted, so that if we
decide to represent the type in some way and rewrite the methods in an
entirely different way, we can still implement the interface (including
the semantics) and the program won't be broken.

Using the same interface for different semantics eliminates the point of
data abstraction (and different semantics would cause the usefulness of
having those different objects in the same structure to be questionable
as well).

> 
> > If the user calls the add function of every object with an argument of
> > say 3, he's adding the number 3 to the current value of the object if
> > it's an int_obj and adding the number 3 to the database if it's a
> > remote_int_obj.
> 
> Exactly. This is the kind of implementation abstraction modules do not
> provide: runtime interface-based polymorphism.
> 
> Would it sound more sensible to you if some int obj's would trigger side
> effects when being changed and some not? That's also achievable by this
> technique. Or some ints printing debug output whe3n they're being changed.
> As long as they don't break the specification, they don't break code.

Different implementations (e.g. in one the function has a side-effect,
in the other not) are possible with modules, too. They can't be mixed in
data-structures, though. I still find the idea of undefined semantics to
be evil rather than an advantage.

> 
> > So yes, OO definitely beats ML at stuff like that. I wouldn't dare
> 
> It's interesting you say "OO" beats "ML" (the former is a design
> technique, the latter is a family of languages). AThe whole point of my
> original posting is that you can do good OO in ML via structures of
> function pointers, and the only problem is that the type system does not
> allow for polymorphic record types.

I consider ML and Lisp (which are both "multi-paradigm" languages) to be
design techniques or programming styles. ML for me is ML and not a
functional language, as the usual ML program consists of pattern
matching, use of higher-order functions and the ML module-system and
imperative constructs.

And to quote Bjarne Stroustrup: "A language is said to support a style
of programming if it provides facilities that makes it convenient
(reasonable easy, safe, and efficient) to use that style. A language
does not support a technique if it takes exceptional effort or skill to
write such programs; it merely enables that technique to be used."

Of course it's arguable whether or not your record-based objects in ML
take exceptional effort to use.

On a side-note, I think everyone should read this :-)
http://www.orton.demon.co.uk/ff/cpp_interview.html

> 
> > consider using C++ as a language for a mud either, though. I think a
> 
> The more I work with garbage-collected languages the more irritated I
> become by the primitive memory handling of C++. It's better than C but not
> that much better. That andusing 120% of syntax space is what irritates me
> in C++. (The latter also applies to Ocaml.) And again, OO is not a
> language property but rather a design technique.  There are some languages
> that are too weak to make OO in (like Pascal), but for example C is fine
> for OO.

C and Pascal are perfect victims of my Stroustrup quote above.
Personally, I've looked through several large C projects that didn't use
any OO simulations and were very clear and easy to understand, while
working with someone who was trying to figure out how some large Java
and C++ projects worked, I didn't stand a chance. The guy printed out
all sorts of diagrams that showed the relations between the objects and
what not (I think it was a cvs client of some sort and I can't imagine
what benefits such thorough use of OO should have in such a case).

But maybe those were just particular cases of real overuse of objects.
The point being that I'm not so sure OO is the "right" solution in very
many places and in those that it is, ML's records should suffice.

(I think I've contradicted my views at least two or three times in this
mail :-)

> 
> > > polymorphic records for ordinary functional programming: you could have a
> > > function
> >
> > Let's get some terminology straightened out.
> 
> Right. There are of course many ways for types to be polymorphic. What I
> here mean by polymorphic record is types that specify (in the function
> prototype) the minimum requirements of the record to be given as argument;
> ie. what fields it should at least have and what their types should be.
> Such a thing does not exist in ML, it's a proposal.
> 
> It would be like this:
> 
> type record1 = { mutable a: int; b: int; c:int }
> type record2 = { mutable a: int; d: int; e:int }
> let (change_a: { mutable a; ..> } as 'a -> 'a) rec = rec.a <- 0; rec
> change_a {a=1;b=2;c=3}  (evaluates to {a=0;b=2;b=3})
> change_a {a=3;d=0;e=1}  (evaluates to {a=0;d=0;e=1})

I don't like the idea of being able to pass any record with a mutable
field a to a function, unless I explicitly declare them to all belong to
a certain type... it disturbs my sense of type-safety. And I rather
doubt the usefulness of something like that... it sounds more like a
neat feature.

You've convinced me that records provide quite a suitable replacement
for objects, but this really seems odd to me. What part of OO does it
resemble? Inheritance?

I don't think it's fair to call that "polymorphic" either, as it
requires a mutable field 'a' of type float. This, by comparison, seems
quite different from a function that, for example, takes something of
type 'a list as argument.

Besides that, the record itself isn't polymorphic in any way.
'Requirement type' is more fitting in my opinion :-)

Maybe another example would help.

> 
> > That would indeed be quite interesting. Though, of course, for it to be
> > considered in ML, you'd need to construct a proof that it's type-safe or
> > figure out how to implement it in such a way that it is type-safe.
> 
> Ocaml implements it in the object extensions (have you read the part of
> manual describing objects?), so I'm saved the trouble. My point is just
> that you wouldn't need the object extension at all if you had polymorphic
> (as described above) record types.
> 
> As for the soundness, it's been proven a couple of times. What is
> important is what kinds of conversions and constructors these polymorphic
> records provide. (Many OO people are scientific about their business, even
> though the functional people tend to be more so.)
> 
> I find it very interesting how hostile the attitude of many smart people
> is towards OO. It's a non-insignificant part of system design, so I think
> it's useful for people to study, like other techniques discussed on this
> list. OO is not about encapsulation (only); not only about abstraction,
> though this is very important; definitely not about class hierarchies.
> It's a technique to achieve varying actions via the same interface, so
> that none of the actions break the behavioral specification. It's a
> powerful technique to move choosing between actions from user code to
> library code. (ML people are usually proud of the compiler warning of
> inexhaustive matches when new alternatives have been added to a variant.
> This is a problem much more elegantly solved by interfaces.)

There's several reasons for my prejudices towards OO:

a) It's one of those buzzwords and OO is _the_ thing. I generally avoid
that kind of stuff. In the same way, I don't think functional
programming is the answer to everything, either. I believe in using
higher-order functions when it's a good idea, just as using OO when it's
a good idea is reasonable.

Of course functional programming is more than OO, as it adds the
'everything is an expression' and no state stuff. But again, Haskell and
Clean seem to be pretty alone in that 'pure' functional programming
field and the use of records for example is simply pragmatic.

Ocaml and Lisp are both such multi-paradigm languages as I like them.
I still think Lisp is by far superior to Ocaml, as it is incredibly flexible 
and allows for any new programming style to easily be used in it.

b) All serious (i.e. not in some documentation) uses of OO (except for in
a MUD) I've seen were unjustified and complete over-uses. It seems that
people believe that OO is good no matter what and it solves all
problems. So code clarity doesn't matter, as long as they have at least
two hundred classes.

So, I'm not directly opposed to OO (I actually think it's a nice thing
to have in a language). I just think having an actual implementation of
an object system makes more sense than to tweak the type system as to
allow simulation of objects.

Another nice thing about Ocaml and Lisp is that the object system is
separate, so nobody's actually forced to use it. The same holds for the
module system in Ocaml.

So, in summary: records, as you say, are a suitable replacement of
objects in some case. In other cases, use Ocaml's object system, as I
suggest, or a different approach to solving the problem, or perhaps an
entirely different language. I don't think requirement types would add
much to the flexibility of the language.

> 
> Panu
>

Markus





------------------------------

Date: Mon, 20 Aug 2001 16:00:53 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: ,[system design] AOP, bJ

Panu A Kalliokoski wrote:
> Straight from Xerox' AOP pages:
> <quote>
> 
> Aspect-oriented programming (AOP) is a new programming methodology that
> enables the modularization of crosscutting concerns. Experience has shown
> that using standard procedural or object-oriented programming languages it
> can be difficult to modularize design concerns such as: [...]
>   * design patterns [...]
> </quote>

Part of my understanding of design patterns is that if X can be
modularized, X is not a design pattern.  So Xerox is quite plainly
babbling nonsense at this point.

> Of course, it's up to the programmer to arrange the hooks sensibly.

Therein lies the problem!  "Everything is an event" is great, but how is
AOP supposed to make the aforementioned things any easier to
modularize?  There must be more to it.  Patterns or spans of events, or
something, so that one piece of code can be applied to many events "at
once".

> Chris, how about changing the semantics of bJ so that "caused by" uses a
> stack to unwind cascades, and "caused after" uses a queue? Or rather, both
> use a deque, but "by" adds them to the consumption end and "after" adds
> them to the other end?

The implementation would probably be simpler that way.  I think I use a
queue for "caused after," but I do function recursion for "causes". 
It's been a while, I forget.

> By the way, here is a proof why bJ + Portia is not Turing-complete.
> 
> Consider the number of rules defined in a bJ + Portia program. There is a
> finite number of rule definitions, some of which are expanded (by Portia)
> to a set of rule definitions, the number of rules in which is a product of
> the numbers of elements in Portia alphabets used in the rule template. The
> number of these rules is thus also finite, because Portia alphabets have a
> finite number of elements.
> 
> Now consider the states of a bJ program. tThey're defined by the order of
> events happened. Because only the most recent one of the events counts,
> the number of orderings is the factorial of the number of rules, which is
> finite. Because the program has a finite number of states, it either stops
> before that number of states has been reached, or it does not stop at all.
> Thus no halting problem, and TC is impossible. (As you can see, I'm just
> imitating whoever-it-was who posted the proof about SMETANA on the list).
> 
> Have I missed something?

I don't think so.  You're not going to be happy until it's fully
reflective too, are you?  :)  I think it might have to go that way to be
Turing-complete.  Either that or some way to aggregate alphabet symbols
into larger, scaleable numbers, and parse them somehow.  I dunno.  I
have to go about posting these proofs.

But I also got an e-mail from someone who says he has a proof that
Smetana *IS* T-C, but I haven't heard from him since, I'll bug him about
it.

Chris




------------------------------

Date: Mon, 20 Aug 2001 16:20:20 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [ML] [long] OO, type systems

Markus Kliegl wrote:
> On a side-note, I think everyone should read this :-)
> http://www.orton.demon.co.uk/ff/cpp_interview.html

I knew it!

> It seems that
> people believe that OO is good no matter what and it solves all
> problems. So code clarity doesn't matter, as long as they have at least
> two hundred classes.

Attack of the Rabid Taxonomists

Chris




------------------------------

Date: Mon, 20 Aug 2001 23:37:26 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] Re: [ML] [long] OO, type systems



On Fri, 17 Aug 2001, Chris Pressey wrote:

> Panu A Kalliokoski wrote:
> 
> > is "requirement" types: functions that specify what fields a
> > record should at least have, what possible alternatives a variant should
> > at most have, and what types a tuple should begin with. Truly polymorphic
> > (strong) type systems are the key to flexibility in programming.
> 
> This is why I like Erlang, whose type system looks 'weak' initially, but
> is actually very flexible and no more bug-prone than any other type
> system I've tried. Your "requirements" are Erlang's "guards", that allow
> you to write a function such as:
> 
> fib(X) when integer(X) -> ...
> sqrt(X) when X > 0 -> ...
> stuff(Tuple) when record(Tuple, desired_type) -> ...
> 
> and so forth.

Actually, I think that's quite different from what Panu meant. Erlang,
IIRC, is derived from Prolog and thus is a dynamically typed language
and guards aren't anything more than
fib(X) :- integer(X), ...
in Prolog (i.e. if integer(X) fails it tries the next fib(X)), except that
the order in which the fib/1's are put, doesn't matter. (Wouldn't it
have to be fib(X, Y) or does Erlang use functions rather than
predicates?) These guards aren't even an option in a statically typed
language like ML.

I don't think the requirement types as Panu suggests can be described in
terms of Prolog in any way (it doesn't have records with fields or
anything, so there is no such thing as every record with the fields x
and y).

> 
> Chris
>

Markus





------------------------------

Date: Mon, 20 Aug 2001 16:45:22 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [ML] [long] OO, type systems

Markus Kliegl wrote:
> On Fri, 17 Aug 2001, Chris Pressey wrote:
> > fib(X) when integer(X) -> ...
> 
> Actually, I think that's quite different from what Panu meant. Erlang,
> IIRC, is derived from Prolog and thus is a dynamically typed language
> and guards aren't anything more than
> fib(X) :- integer(X), ...
> in Prolog (i.e. if integer(X) fails it tries the next fib(X)), except that
> the order in which the fib/1's are put, doesn't matter. (Wouldn't it
> have to be fib(X, Y) or does Erlang use functions rather than
> predicates?)

Erlang uses functions.  There are things that look and work like
predicates, but they are really functions, mostly (forgiving some syntax
quirks w.r.t that.)  Yes, it works a lot like Prolog, but with no
backtracking, so in many respects it works more like a 'functional'
language than a 'declarative' one.

I think of 'functional programming' as more of an engineering technique
or ideal, as well.  In the real world you almost always have to deal
with state at some point or another.  Like OO, use a pure functional
approach it when it makes sense, but don't go nuts.  I see Erlang as
being more practical than a language like Haskell, which strives to be
all pure and spiffy like that.

> These guards aren't even an option in a statically typed
> language like ML.

Well, where Erlang has guards, ML has pattern matching.  I think a neat
idea would be to be able to pattern-match on the type information.  I
think that would fill the same role.  (I don't know enough ML to give
you an example though)

Chris




------------------------------

Date: Mon, 20 Aug 2001 17:28:22 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [OS] LeetOS, ESO

I like some of the ideas in LeetOS; I've always wanted a computer
running the same fantasy operating system that computers run in
Hollywood movies.

But it's all user interface - I've been more concerned with how to build
the *guts* of an operating system that is both "really an operating
system" (?!?) and "esoteric".  I think Amiga had a good approach here,
with exec.library at a fixed address, and all other addresses to be
discovered by calls into exec.library.

I've been half-assedly familiar with the MS-DOS API (which seems to have
evolved from the CP/M API - int 21h and all that) for a while.  I've
seen the FreeBSD API a couple of times now but I've not delved into it
yet.

Most of these kernel functions - which I'd stick into an Amiga-esque
"exec.library" - deal with arbitration of resources.  Their complexity
varies with the complexity of the resources.  If all the resources are
well-abstracted, the kernel would be very small, at the cost of some
wasted memory usage perhaps - inapplicable options on resources.

The filesystem is a critical resource because of the bootstrapping
involved - the filesystem driver code presumably resides in files in the
filesystem.  Bit of a pickle... the filesystem might have to be part of
the kernel for simplicity.

I think an esoteric context should possibly abuse control signals. 
Every resource should have linear streams going into and coming out of
it, with no formal API.  And every object is a resource.  So if I want
to append to a file, I just send it bytes.  If I want to truncate it, I
send it a "^C" or something.  If I want to append ^C I send "\^C" or
something.  The screen device would probably work something like an
ANSI/VT-100 terminal.  Or, maybe like a web browser, interpreting
HTML-esque tags.  Or maybe something completely different.  But all
resources/devices/files should work like this, in my opinion. 
Everything's a pair of streams.

Chris

--
That dastardly Richard Kennaway never put my Opus-2 on his list...


------------------------------

Date: Tue, 21 Aug 2001 00:42:23 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] Re: [ML] [long] OO, type systems



On Mon, 20 Aug 2001, Chris Pressey wrote:

> Markus Kliegl wrote:
> > On Fri, 17 Aug 2001, Chris Pressey wrote:
> > > fib(X) when integer(X) -> ...
> > 
> > Actually, I think that's quite different from what Panu meant. Erlang,
> > IIRC, is derived from Prolog and thus is a dynamically typed language
> > and guards aren't anything more than
> > fib(X) :- integer(X), ...
> > in Prolog (i.e. if integer(X) fails it tries the next fib(X)), except that
> > the order in which the fib/1's are put, doesn't matter. (Wouldn't it
> > have to be fib(X, Y) or does Erlang use functions rather than
> > predicates?)
> 
> Erlang uses functions.  There are things that look and work like
> predicates, but they are really functions, mostly (forgiving some syntax
> quirks w.r.t that.)  Yes, it works a lot like Prolog, but with no
> backtracking, so in many respects it works more like a 'functional'
> language than a 'declarative' one.

I remember reading something about the people at Ericsson testing Lisp,
Prolog and Poplog and finally deciding to create an own language to be a
sort of combination of Lisp and Prolog or something like that. So does
Erlang even have logical variables? Mercury (rather oddly, as it aims to
be a "pure" logic language) has functions, but they kind of seem to be
syntactic sugar for predicates.

> 
> I think of 'functional programming' as more of an engineering technique
> or ideal, as well.  In the real world you almost always have to deal
> with state at some point or another.  Like OO, use a pure functional
> approach it when it makes sense, but don't go nuts.  I see Erlang as
> being more practical than a language like Haskell, which strives to be
> all pure and spiffy like that.

I like those "pure" languages for the sake of being able to do all sorts
of stuff while remaining "pure". Lots of nice theoretical aspects, I
just don't think Haskell and such languages are very suitable for "real"
use. Or at least I think it's not that great of a trade-off "pure" <->
ease of coding. Lisp and Ocaml are a lot more pragmatic about it.

> 
> > These guards aren't even an option in a statically typed
> > language like ML.
> 
> Well, where Erlang has guards, ML has pattern matching.  I think a neat
> idea would be to be able to pattern-match on the type information.  I
> think that would fill the same role.  (I don't know enough ML to give
> you an example though)

I think Prolog is where ML got the idea of pattern matching from (I don't
know Erlang, so I'll give examples in Prolog, which still seems to be quite
close to Erlang).

Here's a horribble example of a tail-recursive length function, but it
demonstrates the similarities.
let rec length x = function
    [] -> x
  | _::tl -> length (x + 1) tl

length(N, [], N).
length(N, [_|Xs], Y) :-
        N1 is N + 1,
        length(N1, Xs, Y).

In prolog, [Hd|Tl] is syntactic sugar for .(Hd, Tl), which is a simple
tuple, e.g. we can have foo(blah(X, Y), Z), too, where blah is a tuple.

But other than the pattern matching, the type systems of ML and Prolog
are completely different (well, Prolog doesn't really have a type
system :)

It's interesting, though, that Haskell brags about full referential
transparency and pattern matching... it's something Prolog's had all
along (perhaps more so).

This is quite an interesting thread about Haskell on comp.lang.lisp:
http://groups.google.com/groups?safe=off&th=a779ae54f9c3ba70,22

> 
> Chris
> 

Markus





------------------------------

Date: Tue, 21 Aug 2001 01:05:29 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: Re: [OS] LeetOS, ESO


Writing a whole OS is a lotta work, so I'd suggest using the OSKit for
a lot of the stuff (http://www.cs.utah.edu/flux/oskit/). So the idea
would basically be having a fully functional OS and working from there
(you could replace the filesystem of the oskit with an own filesystem
eventually, etc.) and of course the kernel is all your work :-)

I have a bunch of ideas for ESO myself, so maybe I'll write them down
sometime and post them here, but it's getting quite late now. I'm sure a
lot of people here would like to work on the OS (including myself), so
let's get a design for the actual OS together.

Suggestions so far have been: replacing library functions like printf,
having a weird shell and stuff like that, but that's not actually part
of the OS.

What makes up the OS? Here's a list of things that come to mind:
- filesystem
- bootloader (making a really nasty one could be fun :-)
- kernel (including memory management)
- exectuable format

I'm more in favor of developing a platform for all sorts of languages,
where we can embed brainfuck in other languages and the like. Maybe have
a debugger integrated in the OS. I'd say use a real language, maybe
forth or scheme, as the common denominater.

Markus



------------------------------

Date: Mon, 20 Aug 2001 17:54:42 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] [fractal] [2D] fractal-based programming language

OK, propelled by Jeff's encouragement, I have sort of an idea for a
fractal-based programming language.  Not really - it's not one of those
complex fractals like a Mandelbrot set, it's just a reductive
self-similarity.

We have a recursive plateau with four elements, like this:

  AB
  CD

If each letter can be assigned a binary digit, then we have 16
combinations.  If each combination reduces to a single binary digit then
we can build great big nested structures.  Using the example rule
"reduction is true iff at least 2 of A,B,C,D are true" we have

  00
  00 = 0

  10
  00 = 0

  01
  00 = 0

  11
  00 = 1

  00
  10 = 0

  10
  10 = 1

  01
  10 = 1

  11
  10 = 1

  00
  01 = 1

[...etc, all of these are 1...]

  11
  11 = 1

(This may not be the best rule in the real world but it makes for a
simple example.)

If each of these combinations is assigned a code, a set of semantics
could be established.  The recursive nature means the entire program can
be reduced to a single symbol within this 16-symbol set, or indeed, a
single bit.  For example:

  0010
  1001
  0100
  0011

reduces to

  01
  01

which reduces to 1.

But what's to be done with that?  I dunno.  Perhaps the semantics of
(01,01) or something else could cause the language to look at the source
as if it were more or less reduced.  It could interpret all the
semantics it sees at once, then switch to a different 'zoom level' and
interpret those.  Of course this means the semantics have to be
applicable concurrently or in combination, rather than sequentially.

There's also a principle of overlapping which was supposed to be in
Boo-yah! but never materialized (finding semantics which play nice with
these syntaxes is tough sometimes.)  For example in the very center of
the above example there's a (00,10) pattern; if the whole thing was
shifted one cell northwest, with wrap, it could be an entirely different
reduction.  There's got to be some ways to abuse this further.

Chris

--
I blame the magic-marker fumes.  I nearly went into a trance.




------------------------------

Date: Mon, 20 Aug 2001 18:17:12 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [ML] [long] OO, type systems

Markus Kliegl wrote:
> 
> On Mon, 20 Aug 2001, Chris Pressey wrote:
> 
> > Markus Kliegl wrote:
> > > On Fri, 17 Aug 2001, Chris Pressey wrote:
> > > > fib(X) when integer(X) -> ...
> > >
> > > Actually, I think that's quite different from what Panu meant. Erlang,
> > > IIRC, is derived from Prolog and thus is a dynamically typed language
> > > and guards aren't anything more than
> > > fib(X) :- integer(X), ...
> > > in Prolog (i.e. if integer(X) fails it tries the next fib(X)), except that
> > > the order in which the fib/1's are put, doesn't matter. (Wouldn't it
> > > have to be fib(X, Y) or does Erlang use functions rather than
> > > predicates?)
> >
> > Erlang uses functions.  There are things that look and work like
> > predicates, but they are really functions, mostly (forgiving some syntax
> > quirks w.r.t that.)  Yes, it works a lot like Prolog, but with no
> > backtracking, so in many respects it works more like a 'functional'
> > language than a 'declarative' one.
> 
> I remember reading something about the people at Ericsson testing Lisp,
> Prolog and Poplog and finally deciding to create an own language to be a
> sort of combination of Lisp and Prolog or something like that.

Yep, it's something like that.

> So does Erlang even have logical variables?

What's a logical variable?

Erlang has variable binding (A = 5 binds 5 to the local A, which cannot
be subsequently changed - single-assignment.)  But 'logical' values are
just another atom (true or false).

> Mercury (rather oddly, as it aims to
> be a "pure" logic language) has functions, but they kind of seem to be
> syntactic sugar for predicates.

Mercury's whacked, IMO  :)

> Lots of nice theoretical aspects, I
> just don't think Haskell and such languages are very suitable for "real"
> use.

Yeah, exactly.  Haskell is a nice place to learn and practice a
functional coding style.

> Here's a horribble example of a tail-recursive length function, but it
> demonstrates the similarities.
> let rec length x = function
>     [] -> x
>   | _::tl -> length (x + 1) tl
> 
> length(N, [], N).
> length(N, [_|Xs], Y) :-
>         N1 is N + 1,
>         length(N1, Xs, Y).

Yes, Erlang is very close to Prolog in some respects.  But it's also not
unlike ML.

  length(N, []) -> N;
  length(N, L)  -> length(N + 1, tl(L)).

  length(L) when list(L) -> length(0, L).

where length/1 and length/2 are entirely different Erlang functions.

> But other than the pattern matching, the type systems of ML and Prolog
> are completely different (well, Prolog doesn't really have a type
> system :)

Erlang's type system is more like Lisp's... kind of gory, but with the
full assortment of atoms, numbers, tuples, lists, binaries, and records.

Basically, if Panu is looking for something that would provide a fine
control over the allowable types of something, I think it would have to
be expressed in some sort of pattern-match, whether it be a "guard" or
not.

Chris




------------------------------

Date: Tue, 21 Aug 2001 02:47:25 +0300
From: Juha =?ISO-8859-1?Q?J=E4rvi?= <mooz@welho.com>
Subject: Re: [OS] LeetOS, ESO

Chris Pressey wrote:

 > I like some of the ideas in LeetOS; I've always wanted a computer
 > running the same fantasy operating system that computers run in
 > Hollywood movies.

Seems like a popular topic especially after User Friendly pointed it out.

 > But it's all user interface - I've been more concerned with how to build
 > the *guts* of an operating system that is both "really an operating
 > system" (?!?) and "esoteric".  I think Amiga had a good approach here,
 > with exec.library at a fixed address, and all other addresses to be
 > discovered by calls into exec.library.

Goes to show it's on the 'spec' stage :)
So far memory protection and multitasking are giving me enough concern
given the choice of platform, but then again it would be a machine
someone with the inclination could build from scratch with moderate
skill (which I throughly lack) and trouble. I'm not going to look into
IPC and beasts like that just yet.

 > I've been half-assedly familiar with the MS-DOS API (which seems to have
 > evolved from the CP/M API - int 21h and all that) for a while.  I've
 > seen the FreeBSD API a couple of times now but I've not delved into it
 > yet.

Given that the instructions get 'emulated' one could turn a brain-dead
instructions like ld d,d into a syscall. This would give 7 syscall
handlers at least, and parameters could be passed like in DOS
(Z80 and 8086 do have things in common so why not this as well)

 > Most of these kernel functions - which I'd stick into an Amiga-esque
 > "exec.library" - deal with arbitration of resources.  Their complexity
 > varies with the complexity of the resources.  If all the resources are
 > well-abstracted, the kernel would be very small, at the cost of some
 > wasted memory usage perhaps - inapplicable options on resources.

Have you looked at the free-for-private-use QNX distro? It has pretty
much everything packed into modules while the kernel is extremely
small. At least you can send kill signals to funny things, like
filesystem, input driver, font server, PCI handler...

 > The filesystem is a critical resource because of the bootstrapping
 > involved - the filesystem driver code presumably resides in files in the
 > filesystem.  Bit of a pickle... the filesystem might have to be part of
 > the kernel for simplicity.

Yes, that's what I had in mind, though heavily relying on modules still
(like compression, of course bootstrap code couldn't be compressed,
encryption and such).

I've given thought to the design in that it should be possible to have
it list each file that belongs to an executable, and for each file
what executables are capable of opening it. Filetypes should be built
into filesystem level as well as links between programs, libraries
and datafiles. A library has to know whether it's still used by someone
or not.

QNX has an interesting filesystem where files are mounted straight from
.tar.gz-packages and only copied to the 'real' tree if they get changed.
Thus recovery of files is also always possible and all that would happen
is that the file gets removed and its name wiped from a textfile (necessary
if you needed to erase a mounted file)

Something made me think it would be a good idea if as much stuff as
possible was packaged inside the executable, which could then be
transparently mounted when it gets run. The administrator would of course
have tools to modify the contents of these files if absolutely necessary.
On filesystem-level the executable and 'resources' could be stored in
separate parts to avoid data loss.

 > I think an esoteric context should possibly abuse control signals.
 > Every resource should have linear streams going into and coming out of
 > it, with no formal API.  And every object is a resource.  So if I want
 > to append to a file, I just send it bytes.  If I want to truncate it, I
 > send it a "^C" or something.  If I want to append ^C I send "\^C" or
 > something.  The screen device would probably work something like an
 > ANSI/VT-100 terminal.  Or, maybe like a web browser, interpreting
 > HTML-esque tags.  Or maybe something completely different.  But all
 > resources/devices/files should work like this, in my opinion.
 > Everything's a pair of streams.

This would be interesting when applied to bitmap/vector-graphics,
miscellaneous data files etc. Especially if you referred to
all objects in the filesystem, not just ones opened for access.

-mooz



------------------------------

Date: Tue, 21 Aug 2001 02:24:33 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] Re: [ML] [long] OO, type systems



On Mon, 20 Aug 2001, Chris Pressey wrote:

> Markus Kliegl wrote:
> > 
> > On Mon, 20 Aug 2001, Chris Pressey wrote:
> > 
> > > Markus Kliegl wrote:
> > > > On Fri, 17 Aug 2001, Chris Pressey wrote:
> > > > > fib(X) when integer(X) -> ...
> > > >
> > > > Actually, I think that's quite different from what Panu meant. Erlang,
> > > > IIRC, is derived from Prolog and thus is a dynamically typed language
> > > > and guards aren't anything more than
> > > > fib(X) :- integer(X), ...
> > > > in Prolog (i.e. if integer(X) fails it tries the next fib(X)), except that
> > > > the order in which the fib/1's are put, doesn't matter. (Wouldn't it
> > > > have to be fib(X, Y) or does Erlang use functions rather than
> > > > predicates?)
> > >
> > > Erlang uses functions.  There are things that look and work like
> > > predicates, but they are really functions, mostly (forgiving some syntax
> > > quirks w.r.t that.)  Yes, it works a lot like Prolog, but with no
> > > backtracking, so in many respects it works more like a 'functional'
> > > language than a 'declarative' one.
> > 
> > I remember reading something about the people at Ericsson testing Lisp,
> > Prolog and Poplog and finally deciding to create an own language to be a
> > sort of combination of Lisp and Prolog or something like that.
> 
> Yep, it's something like that.
> 
> > So does Erlang even have logical variables?
> 
> What's a logical variable?
> 
> Erlang has variable binding (A = 5 binds 5 to the local A, which cannot
> be subsequently changed - single-assignment.)  But 'logical' values are
> just another atom (true or false).

true and false are of the boolean logic, which is different than
predicate calculus.

It's hard for me to explain logical variables, but here's an example:
?- length([1,2,3],N).

N = 3

Yes
?- length([1,2,3],3).

Yes
?- length([1,2,3],5).

No
?- N is 3 + 5, N is 7.

No

It's the concept of unification. In the last case N is unified with
3 + 5 (i.e. it is bound to it, because it isn't bound to any other value
yet), in the second goal it is already bound so unifying N with 7 fails,
because N isn't bound to 7. If N werent't bound yet, it would simply be
bound to 7 there. This allows for nice stuff like (using backtracking):
?- append(X,Y,[1,2,3,4]).

X = []
Y = [1, 2, 3, 4] ;

X = [1]
Y = [2, 3, 4] ;

X = [1, 2]
Y = [3, 4] ;

X = [1, 2, 3]
Y = [4] ;

X = [1, 2, 3, 4]
Y = [] ;

No

> 
> > Mercury (rather oddly, as it aims to
> > be a "pure" logic language) has functions, but they kind of seem to be
> > syntactic sugar for predicates.
> 
> Mercury's whacked, IMO  :)

I rather like Mercury... it seems a lot more pragmatic to me than
Haskell, for example. All it requires for "purity", is threading input
and output states through the entire program, but it provides a nice
syntax for that: (example taken from the Mercury Tutorial)

:- pred main(io__state::di, io__state::uo) is det.

main --> io__write_string("Hello World!").
% is equivalent to:
% main(IO_In, IO_Out) :-
%         io__write_string("Hello World!\n", IO_In, IO_Out). 

If you call a non-io predicate (i.e. it shouldn't automatically pass
IO_In and IO_Out as arguments to the predicate), you just have to
surround it by curly braces.

That "nice syntax", btw, is called DCG (Definitive Clause Grammar) and
is used in Prolog, too, to describe grammars. I recommend the books
found at http://www.comsem.org for a nicer explanation. Look at
Appendix D of the first volume for a nice introduction to prolog.

> 
> > Lots of nice theoretical aspects, I
> > just don't think Haskell and such languages are very suitable for "real"
> > use.
> 
> Yeah, exactly.  Haskell is a nice place to learn and practice a
> functional coding style.
> 
> > Here's a horribble example of a tail-recursive length function, but it
> > demonstrates the similarities.
> > let rec length x = function
> >     [] -> x
> >   | _::tl -> length (x + 1) tl
> > 
> > length(N, [], N).
> > length(N, [_|Xs], Y) :-
> >         N1 is N + 1,
> >         length(N1, Xs, Y).
> 
> Yes, Erlang is very close to Prolog in some respects.  But it's also not
> unlike ML.
> 
>   length(N, []) -> N;
>   length(N, L)  -> length(N + 1, tl(L)).
> 
>   length(L) when list(L) -> length(0, L).
> 
> where length/1 and length/2 are entirely different Erlang functions.

Yeah, we could have added that to the prolog version:
length(L, N) :- length(0, L, N).
In Ocaml, we would have had to have renamed the above function to
length_aux and created a function length:
let length = length_aux 0
which is a nice example of currying.

> 
> > But other than the pattern matching, the type systems of ML and Prolog
> > are completely different (well, Prolog doesn't really have a type
> > system :)
> 
> Erlang's type system is more like Lisp's... kind of gory, but with the
> full assortment of atoms, numbers, tuples, lists, binaries, and records.
> 
> Basically, if Panu is looking for something that would provide a fine
> control over the allowable types of something, I think it would have to
> be expressed in some sort of pattern-match, whether it be a "guard" or
> not.

Well, ML is a strong-typed language, so pattern-matching can only occur
over constructs of one specific type, e.g.:
type xyz = Foo of int | Bar of char

let do_xyz = function
    Foo x -> print_int x
  | Bar x -> print_char x

This would also allow for something like this:
type rec1 = { mutable a: float; b: int }
type rec2 = { mutable a: float; c: int }
type recs = Rec1 of rec1 | Rec2 of rec2

let set_to_zero = function
    Rec1 x -> x.a <- 0
  | Rec2 x -> x.a <- 0

but that's redundant code and exactly what Panu wants to avoid
(including having to define a type like the 'recs' above) and besides
that it won't be usable (at least in Ocaml), as this demonstrates:
# let x = { a=1.2; b=1 };;
Characters 8-22:
The record field label b belongs to the type rec1
but is here mixed with labels of type rec2

which, to be honest, surprised me. I would have thought Ocaml would use
all fields to distinguish different record types. Bah, now I'm starting
to confuse myself :-)

Panu wants something like:
let set_to_zero x = x.a <- 0

> 
> Chris
> 

Markus





------------------------------

Date:	Tue, 21 Aug 2001 03:22:26 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [ML] [long] OO, type systems

Hi all, I just subscribed an hour or so ago.

On Tue, 21 Aug 2001, Markus Kliegl wrote:

> This would also allow for something like this:
> type rec1 =3D { mutable a: float; b: int }
> type rec2 =3D { mutable a: float; c: int }
> type recs =3D Rec1 of rec1 | Rec2 of rec2

[snip]
> but that's redundant code and exactly what Panu wants to avoid
> (including having to define a type like the 'recs' above) and besides
> that it won't be usable (at least in Ocaml), as this demonstrates:
> # let x =3D { a=3D1.2; b=3D1 };;
> Characters 8-22:
> The record field label b belongs to the type rec1
> but is here mixed with labels of type rec2
>
> which, to be honest, surprised me. I would have thought Ocaml would use
> all fields to distinguish different record types. Bah, now I'm starting
> to confuse myself :-)

I think this is disallowed because it would break type reconstruction for
x in the related selection expressions x.a and { x with a =3D 1.2 }.

=D8rjan.





------------------------------

Date: Mon, 20 Aug 2001 22:08:51 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: [lang] Re: [fractal] [2D] fractal-based programming language


woohoo!!!  Keep it coming!  Looks good :)
Jeff

On Mon, 20 Aug 2001, Chris Pressey wrote:

> OK, propelled by Jeff's encouragement, I have sort of an idea for a
> fractal-based programming language.  Not really - it's not one of those
> complex fractals like a Mandelbrot set, it's just a reductive
> self-similarity.
>
> We have a recursive plateau with four elements, like this:
>
>   AB
>   CD
>
> If each letter can be assigned a binary digit, then we have 16
> combinations.  If each combination reduces to a single binary digit then
> we can build great big nested structures.  Using the example rule
> "reduction is true iff at least 2 of A,B,C,D are true" we have
>
>   00
>   00 = 0
>
>   10
>   00 = 0
>
>   01
>   00 = 0
>
>   11
>   00 = 1
>
>   00
>   10 = 0
>
>   10
>   10 = 1
>
>   01
>   10 = 1
>
>   11
>   10 = 1
>
>   00
>   01 = 1
>
> [...etc, all of these are 1...]
>
>   11
>   11 = 1
>
> (This may not be the best rule in the real world but it makes for a
> simple example.)
>
> If each of these combinations is assigned a code, a set of semantics
> could be established.  The recursive nature means the entire program can
> be reduced to a single symbol within this 16-symbol set, or indeed, a
> single bit.  For example:
>
>   0010
>   1001
>   0100
>   0011
>
> reduces to
>
>   01
>   01
>
> which reduces to 1.
>
> But what's to be done with that?  I dunno.  Perhaps the semantics of
> (01,01) or something else could cause the language to look at the source
> as if it were more or less reduced.  It could interpret all the
> semantics it sees at once, then switch to a different 'zoom level' and
> interpret those.  Of course this means the semantics have to be
> applicable concurrently or in combination, rather than sequentially.
>
> There's also a principle of overlapping which was supposed to be in
> Boo-yah! but never materialized (finding semantics which play nice with
> these syntaxes is tough sometimes.)  For example in the very center of
> the above example there's a (00,10) pattern; if the whole thing was
> shifted one cell northwest, with wrap, it could be an entirely different
> reduction.  There's got to be some ways to abuse this further.
>
> Chris
>
> --
> I blame the magic-marker fumes.  I nearly went into a trance.
>
>
>
>





------------------------------

Date: Tue, 21 Aug 2001 17:33:31 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] [BF] bfkern


I was playing around with the OSKit libraries and the result is a simple
brainfuck to kernel compiler.

What it does is compile the brainfuck into simple C instructions and
insert those in a bunch of C code, greatly copied from the tty example
of the OSKit and then link that code with the OSKit libraries.

Then one can create a bootable image of the thing and voila: an
operating system written in brainfuck. I've tested this with hello
world, cat and 99 bottles of beer programs.

Let me know if the shell-script isn't as portable as I hope I made it
(though the OSKit currently only works on x86 platforms).

Hmm... let's write ESO in brainfuck! :-)

Markus


-- Attached file included as plaintext by Listar --
-- File: bfkern

#! /bin/sh
#
# bfkern -- compile brainfuck code into a kernel that is then linked
#           with libraries from the OSKit to produce a fully functional
#           operating system
#
# Markus Kliegl <markus.kliegl@t-online.de>
#
# In order to use this, you will need two things:
# - the OSKit, which can be found at http://www.cs.utah.edu/flux/oskit/
# - a bootloader... I recommend GRUB (http://www.gnu.org/software/grub/)
#
# Change the variables CC and CFLAGS so that they'll work on your system
# and run ./bfkern bfc to produce a brainfuck to C compiler.
# Instead of using bfc, which doesn't do optimizations of any sort, you might
# want to change the variable BF to another BF->C compiler, just make sure
# that compiler emits 'rchar();' for commas and 'wchar();' for periods. You'll
# probably have to tweak the C code below a bit to fit another BF->C compiler.
#
# You'll probably have to change the command for linking at the end of this
# file. A good way to find out how to link the kernel, is to go to the
# directory $OSKIT/examples/x86 and type 'rm tty && make tty'.
#
# Using GRUB to boot the OS, just do something like:
# find /bf-kern
# root (hd0,1)      # where (hd0,1) is the output from the previous command
# kernel /bf-kern
# boot
#

if [ ! "$#" = 1 ] ; then
  echo "Usage: $0 <basename> -- compile <basename>.b into a Kernel"
  echo "                        and link it with the OSKit"
  echo "       $0 bfc -- compile the BF->C compiler included here"
  exit 1
else
  NAME=$1
fi

# Directory where you compiled OSKit
OSKIT=/usr/src/oskit/oskit-20010214
BFARRSIZE=30000
BF=./bfc
# What extension the brainfuck programs have
BFEXT=b
CC=gcc
CFLAGS=-O2
LD=ld
LDFLAGS='-Ttext 100000'
# What program to use to create a bootable image
MKBOOTIMAGE=$OSKIT/boot/multiboot/mkmbimage
KERNEXT=kern

if [ "$1" = "bfc" ] ; then
  cat > bfc.c <<EOF
#include <stdio.h>

static void do_indent(int level);

static void do_indent(int level)
{
    while (level--)
        printf("    ");
}

int main(void)
{
    char c;
    int indent = 1, i;

    while ((c = getchar()) != EOF) {
        switch(c) {
        case '+': do_indent(indent); puts("a[p]++;"); break;
        case '-': do_indent(indent); puts("a[p]--;"); break;
        case '>': do_indent(indent); puts("p++;"); break;
        case '<': do_indent(indent); puts("p--;"); break;
        case ',': do_indent(indent); puts("rchar();"); break;
        case '.': do_indent(indent); puts("wchar();"); break;
        case '[': do_indent(indent++); puts("while (a[p]) {"); break;
        case ']': do_indent(--indent); puts("}"); break;
        default:
        }
    }

    return 0;
}
EOF
  $CC $CFLAGS -o bfc bfc.c
  exit 0
fi

cat > $NAME.c <<EOF
#include <stdio.h>

#include <oskit/startup.h>
#include <oskit/clientos.h>
#include <oskit/io/ttystream.h>
#include <oskit/fs/file.h>
#include <oskit/dev/dev.h>
#include <oskit/dev/tty.h>
#include <oskit/dev/freebsd.h>
#include <oskit/dev/osenv.h>

static void rchar(void);
static void wchar(void);

static char a[$BFARRSIZE];
static int p = 0;
static oskit_ttystream_t *ttystrm;

static void rchar(void)
{
    oskit_u32_t bytes_read;

    oskit_ttystream_read(ttystrm, &a[p], 1, &bytes_read);
    if (bytes_read == 0)
        a[p] = 0;
}

static void wchar(void)
{
    oskit_ttystream_write(ttystrm, &a[p], 1, NULL);
}

int main(void)
{
    oskit_ttydev_t **ttydev;
    oskit_osenv_t *osenv;

    oskit_clientos_init();
    osenv = start_osenv();

    oskit_dev_init(osenv);
    oskit_freebsd_init_osenv(osenv);
    oskit_freebsd_init_sc();
    oskit_dump_drivers();

    oskit_dev_probe();
    oskit_dump_devices();

    osenv_device_lookup(&oskit_ttydev_iid, (void***)&ttydev);
    oskit_ttydev_open(ttydev[0], OSKIT_O_RDWR, &ttystrm);

`$BF < $NAME.$BFEXT`

    return 0;
}
EOF

$CC $CFLAGS -c -o $NAME.o $NAME.c -I$OSKIT/
$LD $LDFLAGS -L$OSKIT/lib \
        -o $NAME $OSKIT/lib/multiboot.o $NAME.o \
        -loskit_startup -loskit_clientos \
        -loskit_freebsd_dev -loskit_dev -loskit_kern -loskit_lmm \
        -loskit_c $OSKIT/lib/crtn.o
$MKBOOTIMAGE -o $NAME-$KERNEXT $NAME
strip $NAME-$KERNEXT


------------------------------

From: Steve Mosher <goat@isn.net>
Subject: [lang] Re: [BF] bfkern
Date: Tue, 21 Aug 2001 12:43:05 -0300

On Tuesday 21 August 2001 12:33, Markus Kliegl wrote:
> I was playing around with the OSKit libraries and the result is a simple
> brainfuck to kernel compiler.

What about building a brainfuck interpreter into the kernal... nay AS the 
kernel? Then you could have the whole OS as native BF code. That would be 
super (software) sexy.

-- 
Steve Mosher,
Mad Scientist




------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [Redundant] OS/2 API documents
Date: Tue, 21 Aug 2001 19:43:47 +0100

LeetOS in Brainfuck is a bright idea, but it has stiff competition from IBM
in terms of unusability: OS/2.

I don't exactly remember if I posted some of these, or all, or none,
earlier. Here is a list of comments taken straight outta OS/2 programmers
helpfiles. Have fun.

----------
WinCreateSwitchEntry()
"There is a system limit to the number of Window List entries. However, this
is a large number (several hundred) and is unlikely to be reached in
practice since other system limits, such as memory size, are likely to be
reached first."

WinQuerySysPointer()
"If the handle is a system-pointer handle ... it is possible that another
application is also accessing the bit-map handle. If this is so, selecting
the bit map into a presentation space may fail. Note: This rule is not
enforced by the system; therefore, ensure that the program handles selection
failures correctly."

DosSetExceptionHandler()
"A procedure must not call DosSetExceptionHandler if it performs
language-specific exception or unwind handling. This restriction is not
enforced, but unpredictable results could occur if it is violated."

WinInitialize()
"The operating system does not generally use the information supplied by the
hab parameter to its calls; instead, it deduces it from the identity of the
thread that is making the call. Thus an OS/2 application is not required to
supply any particular value as the hab parameter."

_Dll_InitTerm()
"When the OS/2 operating system starts executing a DLL, it sets the CPU
registers to known values, but only for 16-bit DLLs."

DosOpen()
"When designing an application which uses DosOpen, keep in mind that other
threads within the same process that issue other DOS file system API
requests (except DosRead and DosWrite) may be blocked until DosOpen
processing is complete. Because of this serialization, a DosOpen call to a
relatively slow device may cause other threads within the same process to
appear to be hung until DosOpen is complete. To prevent this, a
multi-process design can be used instead of a multi-thread design, or you
can ensure that the device is ready when the DosOpen is issued to minimize
the wait time."

DBG_C_SStep (Debug Command 9 - Single Step Command)
"Usually, the DBG_N_Exception notification is returned, but any notification
may be returned. ....
Only that thread is executed, even if it is single-stepping a kernel
function that can potentially cause a deadlock condition. ....
When a single-step operation is interrupted by an exception, the EIP
(instruction pointer) should be moved to the next RING3 instruction. This
may be in ring 3 system code. The single-step notification will be issued at
this time.
The DBG_C_SStep command correctly single-steps most instructions."

DosCreateThread
"When the system allocates the stack for the thread, a guard page is set up
to facilitate dynamic stack growth. When a thread attempts to use stack in
or "below" the guard page, a guard-page exception is generated. The default
system action for this exception is to attempt to grow the stack by
committing another page and moving the guard page. Since only a single guard
page is committed at a time, and the page size of the 80386 processor is
4KB,a local stack allocation that is greater than 4KB must be handled by a
stack probe that is performed by a compiler-generated routine."

OS/2 Object Module Format Relocation
"If t=1, the target is defined by a target thread whose thread number is
given in the 2 bit target field. The target field contains a number between
0 and 3 that refers to a previous thread subrecord containing the target
method. The P bit, combined with the 2 low-order bits of the method field in
the thread subrecord determines the target method."

WinCreateWindow()
"Because windows are often created with zero height or width and sized
later, it is good practice not to perform any size-related processing if the
size of the window is zero."

WinDlgBox()
The only dialogbox function in the world, where
a) you have to set both a "parent window" and a "owner window",
b) and if you set the owner window to HWND_OBJECT - something the
documentation allows you to do - you get an invisible and uncloseable
dialog.

WinSetPointer()
"This call is very efficient if hptrNewPointer is the same as the current
(old) pointer."

From OS/2 FAQs

Q: How big should my stacksize be?
A: It is critical to avoid stack sizes where byte 2 has a value of 2 or 4,
e.g.:
* 0x00020000 (128k)
* 0x00040000 (256k)
* 0x33023678
* 0x11041111
Otherwise, when executing under OS/2 2.0GA there may be various and always
differing runtime error behaviors.

Q: Why does my Warp Server system not work with a 10GB drive after applying
fix pack 42, when fixpack 40 fixes this problem for my Warp version 3
system?
A: You are correctly assuming that all Warp fix packs are cumulative for
fixes. However there has been a change that alters this "rule". Starting
with fix pack 41 (and fix pack 11 for Warp version 4), device driver files
are no longer included in the Warp base fix pack, and are instead located in
a separate device driver fix pack.


Q: After migrating my application from OS/2 Version 2 to Warp, why do my
DLL's with long file names no longer load?
A: For performance considerations, all DLL file names are now stored in
memory by 8 character file names whether or not HPFS is installed. This is
applicable to Version 3 and Version 4 releases. Attempting to load a DLL
with a file name which is greater than 8 characters may result in an
exception for the DosLoadModule API. Recompile the source ensuring that all
DLL file names are unique and less than or equal to 8 characters with the
extension of DLL.

Q: Is there a way to tell if a message was sent by a thread different from
the one processing the message?
A: Yes. WinInSendMsg will provide that information, but it won't tell you
which thread sent the message.

My Presentation Manager application worked fine on OS/2 Warp version 3, but
it seems to generate regular traps on version 4. What's wrong?
A: Are you sure it's really a valid Presentation Manager application?
Version 4 is less tolerant of a program that isn't fully compliant with the
definition of a Presentation Manager program. In particular, make sure that
your PM thread includes a WinInitialize call.



------------------------------

Date: Thu, 23 Aug 2001 18:08:07 +0300
From: Juha =?ISO-8859-1?Q?J=E4rvi?= <mooz@welho.com>
Subject: [OS] More rambling about datatypes

Thinking about Chris' suggestion of handling all objects
as a pair of streams, what if we introduced hierarchial
types for files and stream handlers for each node of the
tree?

For example:

  v Datafile
  |--v Image
  |  |--v Bitmap
  |  |  |--> PNG
  |  |  |--> JPG
  |  |  +--> ...
  |  +--v Vector
  |     +--> SomeFileType
  |--v Text
  |  +--> FormattedSomething
  |--v Audio
...

Now, for example to convert any vector image into any type
of bitmap one would only call the appropriate handlers.
Text or audio into image or vice versa or any other conversion
would only be limited by the number of formats the generic
functions can export to.

Each filetype could have a list of supported export formats,
which could be extended with modules. a PNG image might only
be converted into a bitmap, but that in turn could be OCR'd
into text, traced to vector or turned into a heightfield with
the proper plugins. The user would only need to specify any
format to convert the file to, and the OS would check the
path between the two nodes and try to perform the conversion
by calling as few conversion routines in the path as possible.

Working in the shell would be greatly affected by not needing
to call any commands to perform such tasks. The shell might
use C-like expressions and type casting to convert a file into
another such as:

destination=(Image/vector/foo)Name_of_a_wav_file
or perhaps just destination=(foo)FileName

and get for example the waveform in vector format (or whatever
way the conversion routine might choose to visualize it).
Existing files could be referred to like functions accepting
other files as parameters that are used to modify the contents
in a filetype-specific way and return the result like a result
of the function.

Pluses could be used to concatenate streams and conversion-
specific parameters delimited by commas. This would provide
a rather flexible way to handle files. Example procedure:

Create a textfile specifying a 3D plane, a 3D scene in a file
of type 3D model file and a textfile to be used as texture and
then issue:

Scene_with_plane=3D_scene+((3Dobject)Text_specifying_plane)((Bumpmap)Texture_text)

to convert the text into a bumpmap (it will probably become a
generic bitmap in the middle) and turn the other textfile into
a 3D object, to which the bumpmap is passed as a parameter.
Then render it (the final rendered size should be set in the
modeler) and put it into another image at pos x,y:

Rendered_image_file=(PNG)Scene_with_plane
Final_image_file=Background_image_file(Rendered_image_file,x,y)

Bumpmap needs of course to be under bitmap in the filetype
tree, and if for example 3D object was under bitmap and its
handler reported to support bitmap input the text
that was supposed to specify the object might instead be
turned into a bitmap first causing havoc :)
A logical tree would however be a nice timesaver.

When a file is passed as a parameter to another file the stream
handler checks the type and behaves accordingly. If several
files are bound together by using pluses the handler gets them
all as parameters and has to combine them as well as it can.

When the same routine gets called due to another object being
casted into its type it behaves basically as if it was passed
as a parameter into an empty file of the same type.

Just an idea, sorry if something similar has already been pointed out.
-mooz



------------------------------

Date:	Thu, 23 Aug 2001 18:47:55 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Bag language

I recall reading somewhere, possibly in the Klouwer Encyclopedia of
Mathematics, although I can't find it again now, about a certain
Turing-complete formalism.

A "program" consists of a list of positive fractions (rational
numbers), and the state of the "computer" is a positive integer n.
Naturally, input is whatever n you start with.

Computation consists of going through the list from top to bottom
until you find a fraction p/q such that np/q is an integer.  Then n is
replaced by np/q, and the search is restarted from the top.  The
program stops if you reach the end of the list without a match, and
the final n is the output.

Now some of you might find this esoterically interesting to program
directly, but I thought a bit about why this must be Turing-complete,
and came to an equivalent formalism which makes a simple programming
language, and without the need to invent and multiply primes all the
time.  It seems like this must have been thought of before, if nothing
else by the person who proved the fraction computer Turing-complete.

Basically, by the fundamental theorem of arithmetic, a fraction is a
product of prime powers (some negative if the fraction is not an
integer), and the primes serve sort of as variable names.  So here is
a syntax for the equivalent formalism in yacc/lex format (though I
haven't written an interpreter/compiler yet):

program : /* empty */
        | program transformation
;
transformation : tokenlist ':' tokenlist ';' ;
tokenlist : /* empty */
          | tokenlist tokenterm ;
tokenterm : TOKEN
          | NUMBER TOKEN
;

[ \t\n\r]+      { /* skip space */ }
[#].*           { /* skip comments */ }
[:]             { return ':' }
[;]             { return ';' }
[0-9][1-9]*     { ...; return NUMBER; }
[']([^']|[\\].|[\\][0-9]+)[']   { ... ; return NUMBER; }
[-_.[:alpha:]][-_.[:alpha:]0-9]*
                { ...; return TOKEN; }


Here, "number token" is simply an abbreviation for several
appearances of a token in the list, and the number could be given
by a character, i.e. 'a' =3D 65.  The current state of the program is
itself a tokenlist.

Now the computation becomes as follows:  Search through the program
until reaching a transformation such that the current state of the
program contains all the tokens on the left hand side of the
transformation, and as least as many times.  Then remove that many of
those tokens, and add those on the right hand side of the
transformation.  Then, as before, repeat from the top of the program.

The positions of a token in a tokenlist don't matter, only its total
number of occurrences.  I.e. a tokenlist is a "bag".

For convenience, a token will be allowed to occur both on the left
and on the right hand side of a transformation, although this is not
strictly permitted in the fraction case;  it would be simple enough to
simulate with temporary renaming.

So, here is an example (untested, naturally) program to multiply two
numbers, given as the number of occurrences of X and Y, respectively,
and returning the result in Z:

T Y: T Y2 Z;
T: ;
Y2: Y;
X: T;

Now once we have this formulation, new opportunities for I/O present
themselves, by making special tokens.  I.e.

Get,    a token that causes a character to be read, and that number
        of Input tokens to be added, or an EOF token;
Put,    a token that causes a character to be written, corresponding to
        the number of Output tokens;
Exit,   a token for exiting the program immediately.

Even general file I/O could be done by adding stream tokens and the
like.  Anyhow, "cat" is then simple:

EOF: Exit;
Input: Output;
Output: Output Put;
: Get;

I note that the Exit is necessary only because of the ": Get;" which
makes it impossible to exit the program by falling off the end.  If
the program instead had a Start token to begin with, a different
possibility would be:

EOF Start: ;
Input: Output;
Output: Output Put;
Start : Start Get;

Anyhow, I suppose a suitable name for this language would be "Bag",
although I am very open to suggestions as well as to being informed
that this has been done before...

Greetings,
=D8rjan.





------------------------------

Date:	Fri, 24 Aug 2001 08:10:45 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Intercal Unlambda interpreter

This is to announce that I have written an Unlambda interpreter in
Intercal.  I have just put it in

<http://home.nvg.org/~oerjan/unl-int/>

Greetings,
=D8rjan Johansen.





------------------------------

Date: Fri, 24 Aug 2001 02:54:23 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [OS] LeetOS, ESO

Juha Järvi wrote:
> Goes to show it's on the 'spec' stage :)
> So far memory protection and multitasking are giving me enough concern
> given the choice of platform, but then again it would be a machine
> someone with the inclination could build from scratch with moderate
> skill (which I throughly lack) and trouble. I'm not going to look into
> IPC and beasts like that just yet.

I don't think an OS is *necessarily* a massively complicated project. 
If it doesn't do much, it doesn't have to be that complicated.  Basing
it off an existing package like OSKit makes things easier, but it's also
a bit of a cop-out (admit it :)  It's very cool that Brainfuck and OSKit
can be merged.  But there are still some drawbacks - the OSKit
distribution is (IIRC) big and complicated and it's just not as macho as
writing the entire thing to be esoteric, even if a from-scratch OS would
lack advanced functionality.  But that aside, it's still debatable
whether it would be more 'esoteric' to be elegant, or to be simply
disgusting.  A lot of the ideas for LeetOS (metadata, rich process
descriptors, etc) strike me as being on the 'elegant' side of things. 
As opposed to say Gerson's suggestions which are generally the epitome
of obfuscation.

>  > I've been half-assedly familiar with the MS-DOS API (which seems to have
>  > evolved from the CP/M API - int 21h and all that) for a while.  I've
>  > seen the FreeBSD API a couple of times now but I've not delved into it
>  > yet.
> 
> Given that the instructions get 'emulated' one could turn a brain-dead
> instructions like ld d,d into a syscall. This would give 7 syscall
> handlers at least, and parameters could be passed like in DOS
> (Z80 and 8086 do have things in common so why not this as well)

The emulation would help deal with the multitasking and memory
protection (and yes, you could do syscalls with it too I suppose.)  But
would you be emulating a Z80 inside a Z80 emulator to prototype it?  Not
that there's anything wrong with that :)  There's plenty of Z80
emulation code available.

And yes, I think there's a fast Z80 compatible CPU, but I don't know how
fast.  I know there's a Z180 that has paged memory not unlike the
80286.  But I don't know if there's a fast Z180.

OK, some justification for why I'm looking at
streams-with-control-characters for everything: a lot of esoteric
languages don't have any syscalls except I/O.  Some don't even have a
way to scaleablely create functions which would map to syscalls
(Befunge, Brainfuck, etc.)  So the simplest, easiest way to hook
syscalls into these languages, would be like Apple did with AppleDOS:
use escape/control characters on the I/O streams.

With these escape sequences, you could do file I/O, graphics, sound,
etc., equally easily in Befunge or Brainfuck - just write the right
characters to 'standard output', which would actually be the way to
communicate with anything else at all, with the right commands - no
longer a 'standard' output as much as an 'everything' output,
multiplexed, sorta.

It's not elegant at all, but it's a lowest-common-denominator thing.  I
would myself prefer to write the thing from scratch and target it either
for the 6502 (yumm) or a completely fictional chip with some designation
like 666 (Satan's Very Own CPU).  I would probably try to write the core
component as a Sally/Shelta-ish compiler with a command line, in a small
amount of 6502(/666) assembly - dismiss memory protection on the naive
assumption that correct programs are correct, use non-pre-emptive
multitasking with dead-headed context switching, use streams as the only
syscall abstraction...

Maybe the next Essies should be an operating-system writing contest (ha
ha ha ha ha ha ha...)

Chris

--
This statement is complete.  But, this one.


------------------------------

Date: Fri, 24 Aug 2001 12:10:01 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [ML] [long] OO, type systems

On Mon, 20 Aug 2001, Markus Kliegl wrote:
> [I think I'm really the wrong person to argue with :-)]

I don't really see it as arguing. Actually, discussions with the
functional people (into which you might count yourself) have often proved
quite enlightening, at least to me, and hopefully to those people, too.

I sometimes see OOP and FP as two ways to group program code: in FP, you
group together the code that does "the same thing"; in OOP, you group
together the code that "concerns the same service". The implications of
this are, of course, quite ramified. It is also the main reason why OO
programs are hard to read for those that are not used to it: they're
written in a way as to make it as easy as possible to understand well the
way a given component in the program works, but if you start tracking the
execution flow (which FP tends to emphasise), it jumps between objects so
much that it's a really hard to track.

This "aspectiveness" of code grouping is why I see such paradigms like
AOP, which tries to modularise everything, as very doomed: a given piece
of code has its place in a multi-dimensional space: it concerns certain
data, certain group of functions that are there to accomplish some
complicated thing, certain error conditions, certain services, certain
abstraction, certain partner code (coworkers) et cetera ad infinitum. When
you group code, a given piece of code can be properly placed with respect
to usually at most two of these factors - usually only one.

> > > If we don't abstract a type in a module, the module isn't being used to
> > > implement an ADT, but probably to group a set of functions together or
> > > avoid name clashes. Such a module doesn't wish to implement a "class".
> >
> > I think you see objects too tightly connected with data. It's part of
> > object abstraction whether the _services_ have data or not.
>
> A module function operates on an ADT, whereas a method operates on the
> object it belongs to, regardless of whether or not the object has data?

Yes. This sounds weird if you think of an object as a collection of
methods and variables, but if you use my definition of an object ("an
interface to a service" or thereabouts), it should make more sense...

> You've convinced me that records are a better simulation of objects than
> modules. It just seems to me that OO seems to advertise data abstraction

Encapsulation-based abstraction is part of object-based programming (kind
of phase 1 of object-oriented programming). Data abstraction, however, is
a very generic concept not restricted to objectists (<- a fine word, I
tell you). All of these are very polluted terms, I know...

> if Stroustrup is an authority in OO concepts.

<shrug> Many "big names" know very little of OO. Stroustrup does not seem
to be one of those - besides, he's very practical about his views. I
usually see OO as the "tools" it provides, not as the "paradigm" one
should think in. Abstraction is not needed in a project you can fit in
your head in one go, so why use abstraction in such a project?

I've got a fellow programmer who almost never programs in real OO style,
but places all his code in classes anyway, because this allows for
inheritance-based specialisation of code - like, you spot the code that
should go like A for service S and like B for service R, then separate it
into its own method M, and then make a common base class which you inherit
for S and R and provide a different M for each of these classes. This has
nary anything to do with object-oriented design, but it's a tool provided
by languages that feature inheritance. Why not use it?

> > It's funny you see this as evil, because it's the major boon of OO.
> > Suppose int obj's have a specification: add: int->unit adds its argument
> > to the int represented by the object, leaving it to the new value. print:
> > unit->unit prints the value represented by the cell. Now neither of the
> > implementations above break the specification. What's so evil here?
>
> The interface, in my opinion, defines what methods and types, etc. are
> exported and (perhaps through comments or documentation) provides a
> semantics of what those methods do and what arguments should be passed,

Totally agreed.

> etc. The idea is that the implementation is abstracted, so that if we
> decide to represent the type in some way and rewrite the methods in an
> entirely different way, we can still implement the interface (including
> the semantics) and the program won't be broken.

Here I'd like to make a major point. If one thinks about what is semantics
and what is "just" implementation, one notices that it's just a matter of
level of detail in which the specification of behavior of the object goes.

For example, if we had dictionary services A (implemented by hash tables),
B (implemented by binary search trees) and C (implemented by http'ing to
babelfish to translate a word), whether they have the same semantics or
not only depends on how their behavior is specified. If the specification
is "The service takes a word and returns the corresponding word", all
three are implementations of these semantics. If the spec goes "implements
a service to store and retrieve data by string indexes", A and B implement
these semantics but C doesn't. If the specification continues, "will have
a mean retrieval time of O(1)", only A implements it. If it says instead,
"is guaranteed to have a retrieval time of O(1)", none of the above
implement it.

This is why I made a specification of behavior above on the interface of
'a obj: { add: 'a -> unit; print: unit -> unit }. If you compare the
specification with the implementations, you can see that neither int_cell
nor remote_int_cell break it. Moral: breaking specification of behavior
(having unexpected semantics) is evil, making alternative implementations
as long as they match the specification is not.

> Using the same interface for different semantics eliminates the point of
> data abstraction (and different semantics would cause the usefulness of
> having those different objects in the same structure to be questionable
> as well).

Totally agreed upon.

> I consider ML and Lisp (which are both "multi-paradigm" languages) to be
> design techniques or programming styles. ML for me is ML and not a
> functional language, as the usual ML program consists of pattern
> matching, use of higher-order functions and the ML module-system and
> imperative constructs.

True... a random ML'ist would not probably program in the same style as
you do, so the coherence of the "ML way of programming" is questionable.
However, I seem to happen to agree with you about the "point of ML".

> And to quote Bjarne Stroustrup: "A language is said to support a style
> of programming if it provides facilities that makes it convenient
> (reasonable easy, safe, and efficient) to use that style. A language
> does not support a technique if it takes exceptional effort or skill to
> write such programs; it merely enables that technique to be used."
>
> Of course it's arguable whether or not your record-based objects in ML
> take exceptional effort to use.

I'd say they don't. Besides, Stroustrup IMO exaggerates the trouble of
using OO constructs in, say, C. But it _is_ handy to be able to turn your
ADT's into virtually-bound interfaces when the need for alternative
implementations (to be mixed in runtime) arises.

> But maybe those were just particular cases of real overuse of objects.

The massive "one big fault of OO" is the overdesign. But it has the
benefit that short-sighted people get the (although learned, not
intuitive) ability to see a little further. In the meanwhile, they waste a
lot of resources in the work.

> I don't like the idea of being able to pass any record with a mutable
> field a to a function, unless I explicitly declare them to all belong to
> a certain type... it disturbs my sense of type-safety. And I rather

In OO (the real(tm)), the key point of flexibility is that you arrange the
program in such a way (interfaces, specs of behavior) that you need not
know what types might be passed to a function. Ie. enabling old code to
use new code.

> You've convinced me that records provide quite a suitable replacement
> for objects, but this really seems odd to me. What part of OO does it
> resemble? Inheritance?

Um... the record type corresponds to the interface. The record itself
(runtime record) corresponds to the "public side" of an object.

ML:				C++:

type animate =			class Animate
{				{
	talk: string -> unit;		virtual void talk( string& ) = 0;
	update: unit -> unit		virtual void update() = 0;
}				}

let new_human x =		class Human: Animate
{				{
	let state = ref ... in	    private: ... state;
	{			    public:
					Human( ... x ) {...}
		talk = (fun...);	virtual void talk( string& s ) {...}
		update = (fun...);	virtual void update() {...}
	}
}				}

let myhuman = new_human blah	Animate myhuman = new Human( blah );

(As you can see, the ML syntax is nicer. But it has the well-known "binary
operations problem".)

> I don't think it's fair to call that "polymorphic" either, as it
> requires a mutable field 'a' of type float. This, by comparison, seems
> quite different from a function that, for example, takes something of
> type 'a list as argument.

Probably. As I said, polymorphism can mean quite many things. The type 'a
list, though, must be a list, so it's not fully polymorphic, either...

> Besides that, the record itself isn't polymorphic in any way.

Actual types, runtime types, are never polymorphic. (If somebody can give
a counterexample, I'd appreciate that.) They're what they are because they
have to be something and not anything else :)

> Ocaml and Lisp are both such multi-paradigm languages as I like them.
> I still think Lisp is by far superior to Ocaml, as it is incredibly flexible
> and allows for any new programming style to easily be used in it.

ML is notorious to offer almost as much flexibility as possible while
still being a compiled, not-runtime-checked language.

> b) All serious (i.e. not in some documentation) uses of OO (except for in
> a MUD) I've seen were unjustified and complete over-uses. It seems that
> people believe that OO is good no matter what and it solves all
> problems. So code clarity doesn't matter, as long as they have at least
> two hundred classes.

OO projects are clear (or, often, unclear) in different ways than
fast-code projects or functional projects. The world is full of bad
programmers, and most of them are currently doing OO. I'd also like to
make a difference between OOP (techniques) and OOD (principles). The world
still faces overuse of OOD and underuse of OOP.

> So, I'm not directly opposed to OO (I actually think it's a nice thing
> to have in a language). I just think having an actual implementation of
> an object system makes more sense than to tweak the type system as to
> allow simulation of objects.

Really? I'm from the "make good tools to be combined" camp. The type
system enhancements were not only aimed for OOP, they were meant to be
all-beneficial features...

> Another nice thing about Ocaml and Lisp is that the object system is
> separate, so nobody's actually forced to use it. The same holds for the

I don't think it's possible to force people to use an object system. But
whatever.

Panu







------------------------------

Date: Fri, 24 Aug 2001 13:23:39 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [SPAM?] Re: [ML] [long] OO, type systems

On Tue, 21 Aug 2001, Orjan Johansen wrote:

> > # let x = { a=1.2; b=1 };;
> > Characters 8-22:
> > The record field label b belongs to the type rec1
> > but is here mixed with labels of type rec2
>
> I think this is disallowed because it would break type reconstruction for
> x in the related selection expressions x.a and { x with a = 1.2 }.

My suggestion was to enhance the type system so that x.a _would_ be
allowed for any record with at least field a, so that x.a would bring a
partially inferred type { a: 'a; ..> }.

Of course, it would be an error if it would be impossible to deduce x's
type at all (during the compile phase), but I don't think that's possible:
records can be constructed only in a type-complete way.

Panu





------------------------------

Date: Fri, 24 Aug 2001 13:38:55 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Bag language

On Thu, 23 Aug 2001, Orjan Johansen wrote:

> Computation consists of going through the list from top to bottom
> until you find a fraction p/q such that np/q is an integer.  Then n is
> replaced by np/q, and the search is restarted from the top.  The
> program stops if you reach the end of the list without a match, and
> the final n is the output.

Urg. Is there some way to transform (for example) Turing Machine programs
into this codification? Are multiple state bits represented by multiplying
primes into the state? (Reading further, I see they are.)

> Now the computation becomes as follows:  Search through the program
> until reaching a transformation such that the current state of the
> program contains all the tokens on the left hand side of the
> transformation, and as least as many times.  Then remove that many of
> those tokens, and add those on the right hand side of the
> transformation.  Then, as before, repeat from the top of the program.

Add order, and you've got a semi-Thue grammar.

> The positions of a token in a tokenlist don't matter, only its total
> number of occurrences.  I.e. a tokenlist is a "bag".

I've used to call this kind of stuff a "set".

> T Y: T Y2 Z;
> T: ;
> Y2: Y;
> X: T;

It would be useful to say which tokens represent the result and which
represent the input :) And what the heck is "X" down there?

Panu






------------------------------

Date: Fri, 24 Aug 2001 13:46:09 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Intercal Unlambda interpreter

On Fri, 24 Aug 2001, Orjan Johansen wrote:

> This is to announce that I have written an Unlambda interpreter in
> Intercal.  I have just put it in
>
> <http://home.nvg.org/~oerjan/unl-int/>

Did you code this by hand? It shows great aptitude in the intercal-way of
thinking... (PLEASE DON'T PAY ATTENTION TO THIS SENTENCE)

Panu






------------------------------

Date: Fri, 24 Aug 2001 13:55:02 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [SPAM?] Re: [OS] LeetOS, ESO

On Fri, 24 Aug 2001, Chris Pressey wrote:

> I don't think an OS is *necessarily* a massively complicated project.

I think Forth systems nicely demonstrate this. Come to think of it, LISP
systems are not far, either... (Does anybody still use good old LISP
machines? I've heard they rock.)

> The emulation would help deal with the multitasking and memory
> protection (and yes, you could do syscalls with it too I suppose.)  But
> would you be emulating a Z80 inside a Z80 emulator to prototype it?  Not
> that there's anything wrong with that :)  There's plenty of Z80
> emulation code available.

A couple of my friends are writing a Unix-like OS, with CP/M as the
interface, on Z80. Memory protection is handled by a special-purpose RAM
banking chip, ie. 64k mem for each process with 4k page granularity out of
several megs of real memory. Low addresses or I/O ports are used to change
the mappings.

They've implemented IPC and some multitasking already, but the filesystem
and I/O controllers are lacking.

> (Befunge, Brainfuck, etc.)  So the simplest, easiest way to hook
> syscalls into these languages, would be like Apple did with AppleDOS:
> use escape/control characters on the I/O streams.

Ugly but does the job. This is how TTY's (mostly) work in Unices, and
that's the reason TTY's are tough to handle...

The Unix solution is ioctl's. This is more like object interfaces. I like
this solution more, but of course there could be services translating
pure-character streams into read/write/ioctl.

Panu




------------------------------

From: "joe" <josephhill@ntlworld.com>
Subject: [lang] 
Date: Fri, 24 Aug 2001 18:39:33 +0100


Hi, I'm new here, and I'd like to create an Esoteric language but I don't have a clue how. Can anyone help?

~Joe





------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: RE: [lang] 
Date: Fri, 24 Aug 2001 20:08:25 +0100

Esoteric Language Tutorial in 3 quick steps.

1 - Design an ugly syntax. Make sure it doesn't resemble perl too much or it
will be unusable.
2 - Implement it.
3 - Add an EMACS node for it.

That was easy. However, I have a feeling this may not have helped you much.
So, what kind of help are you looking for?


-----Original Message-----
From: lang-bounce@esoteric.sange.fi [mailto:lang-bounce@esoteric.sange.fi]On
Behalf Of joe
Sent: Friday, August 24, 2001 6:40 PM
To: Esoteric Langs
Subject: [lang]

Hi, I'm new here, and I'd like to create an Esoteric language but I don't
have a clue how. Can anyone help?




------------------------------

Date: Fri, 24 Aug 2001 22:24:41 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: pick a language, any language, and don't show it to me...

On Fri, 24 Aug 2001, joe wrote:

> Hi, I'm new here, and I'd like to create an Esoteric language but I
> don't have a clue how. Can anyone help?

Couldn't have said that one better. Well, if your Esoteric language will
serve some specific purpose, think how that goal might be achieved and
make the language so that it has those means. If, on the other hand,
you're making the language only for fun and want to get tons of peers'
respect, you should be as original and innovative as possible.

How about this: look through the languages on
http://www.purists.org/esoteric/	and
http://www.catseye.mb.ca/lala/
then, make a language that does not resemble any of these, and an
implementation, some example code, and documentation. Most of us are not
so diligent.

Panu

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi







------------------------------

Date:	Fri, 24 Aug 2001 21:59:41 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [ML] [long] OO, type systems

On Fri, 24 Aug 2001, Panu A Kalliokoski wrote:

> This "aspectiveness" of code grouping is why I see such paradigms like
> AOP, which tries to modularise everything, as very doomed: a given piece
> of code has its place in a multi-dimensional space: it concerns certain
> data, certain group of functions that are there to accomplish some
> complicated thing, certain error conditions, certain services, certain
> abstraction, certain partner code (coworkers) et cetera ad infinitum. Whe=
n
> you group code, a given piece of code can be properly placed with respect
> to usually at most two of these factors - usually only one.

A point from this amateur (I am really a mathematician):

This seems to assume that code must be flat text.  Using some hyperlinking
or database arrangement, it could be possible to place each piece of code
in several categories, and if wanted generate different indices, views or
listings of the program automatically.

Greetings,
=D8rjan.





------------------------------

From: "joe" <josephhill@ntlworld.com>
Subject: [lang] 
Date: Fri, 24 Aug 2001 20:57:28 +0100


Ok...How do I actually design an interpreter?


 ~Joe


------------------------------

From: "joe" <josephhill@ntlworld.com>
Subject: [lang] My language
Date: Fri, 24 Aug 2001 21:01:31 +0100


Ok...the concept of my language is this:

It is designed for Fun only. It is set in the format of a childrens story, to start the program, you write "ONCE APON A TIME" in capitals and to end the program, you write "AND THEY ALL LIVED HAPPILY EVER AFTER" the Variables are characters in the story, etc. 

Thoughts?

~Joe


------------------------------

Date: Fri, 24 Aug 2001 23:12:36 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [ML] [long] OO, type systems

On Fri, 24 Aug 2001, Orjan Johansen wrote:

> > you group code, a given piece of code can be properly placed with respect
> > to usually at most two of these factors - usually only one.
>
> A point from this amateur (I am really a mathematician):
>
> This seems to assume that code must be flat text.  Using some hyperlinking
> or database arrangement, it could be possible to place each piece of code
> in several categories, and if wanted generate different indices, views or
> listings of the program automatically.

Good point. Incidentally, the topic was discussed on the list some 6
months ago, and before that, 2 years ago. :) Also, because
hyperlink/database arrangements can be produced from the flat source text,
you can do all these things from flat source files, too.

This "grouping" can only be the adjacency in source code, but it can also
have more deep-cut implications, like boundaries for sharing data,
invariant check boundaries, and what dimensions you're easily able to
extend the program in.

Panu.

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date:	Fri, 24 Aug 2001 22:41:18 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: Bag language

On Fri, 24 Aug 2001, Panu A Kalliokoski wrote:

> On Thu, 23 Aug 2001, Orjan Johansen wrote:
>
> > Computation consists of going through the list from top to bottom
> > until you find a fraction p/q such that np/q is an integer.  Then n is
> > replaced by np/q, and the search is restarted from the top.  The
> > program stops if you reach the end of the list without a match, and
> > the final n is the output.
>
> Urg. Is there some way to transform (for example) Turing Machine programs
> into this codification? Are multiple state bits represented by multiplyin=
g
> primes into the state? (Reading further, I see they are.)

Yes.  I suppose once one has a transformation into the more readable
syntax I suggested, "suitable" primes and fractions can easily be
generated automatically.

Now let's see how one might go about translating a Turing machine.

If (s) is the number of distinct symbols, let the number of tokens Left
and Right represent the tape to the left and right as integers using base
(s) notation.  Also Current for the value on the tape at the current
point.

Pick a distinct token for each state of the turing machine.
Also some tokens for what to do next:  ReadWrite, MoveLeft and
MoveRight.

For each state St1 of the turing machine, add according to its table
entries transformations similar to the following, in reverse order of the
integer (nread):

ReadWrite St1 (nread) Current: MoveLeft St2 (nwritten) Current;

Then we need to "define" MoveLeft (and similarly MoveRight).

MoveLeft Right: MoveLeft (s) Current
MoveLeft: MoveLeft2
MoveLeft2 Current: MoveLeft2 Right
MoveLeft2: MoveLeft3
MoveLeft3 Left: MoveLeft3 Current
MoveLeft3: MoveLeft4
MoveLeft4 (s) Current: MoveLeft4 Left
MoveLeft4: ReadWrite

Initialize the machine with no Left, ((input) mod (s)) Current and
((input) div (s)) Right, 1 ReadWrite and 1 initial St0.

That seems to be all.  I suspect it would also be fairly simple to
translate partial recursive functions.

> > Now the computation becomes as follows:  Search through the program
> > until reaching a transformation such that the current state of the
> > program contains all the tokens on the left hand side of the
> > transformation, and as least as many times.  Then remove that many of
> > those tokens, and add those on the right hand side of the
> > transformation.  Then, as before, repeat from the top of the program.
>
> Add order, and you've got a semi-Thue grammar.

I suspected something like that.  I only saw mention of Thue before
posting that message, although I have now found a description.

Of course, I think the lack of order adds to the flavor of the language.

> > The positions of a token in a tokenlist don't matter, only its total
> > number of occurrences.  I.e. a tokenlist is a "bag".
>
> I've used to call this kind of stuff a "set".

Well, I would call it a "set" if it only mattered if a token was present
or not, and not how many times it was there.

An alternative view is to look at each token as an unsigned integer
variable, and its number of occurences as its value.  That would probably
be the way to implement it.

> > T Y: T Y2 Z;
> > T: ;
> > Y2: Y;
> > X: T;
>
> It would be useful to say which tokens represent the result and which
> represent the input :) And what the heck is "X" down there?

I thought I mentioned that:  X and Y are input, Z is output.  T and Y2 are
temporary.

Greetings,
=D8rjan.





------------------------------

Date:	Fri, 24 Aug 2001 22:54:51 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: Intercal Unlambda interpreter

On Fri, 24 Aug 2001, Panu A Kalliokoski wrote:

> On Fri, 24 Aug 2001, Orjan Johansen wrote:
>
> > This is to announce that I have written an Unlambda interpreter in
> > Intercal.  I have just put it in
> >
> > <http://home.nvg.org/~oerjan/unl-int/>
>
> Did you code this by hand? It shows great aptitude in the intercal-way of
> thinking... (PLEASE DON'T PAY ATTENTION TO THIS SENTENCE)

Why thanks, I am flattered.  And yes I coded it by hand.  I needed
something to balance the unexpected ease of doing Unlambda in Haskell.
Just ask these nice people in white coats...

Also, I decided to put on the page (which just moved to
<http://home.nvg.org/~oerjan/unlambda/>) some other things I committed:

interpreter.unl
      Unlambda in Unlambda
ulify2.scm
      An abstraction eliminator, based on the unlambdaify.scm in the
      Unlambda distribution, with some added optimizations.  Written
      in Scheme.
Unlambda.hs
      An Unlambda interpreter in Haskell

Greetings,
=D8rjan.





------------------------------

From: "joe" <josephhill@ntlworld.com>
Subject: [lang] worb
Date: Fri, 24 Aug 2001 22:14:49 +0100



As I said, I'm new here... has anyone programmed a good program in it... and how does it work?

 ~Joe


------------------------------

Date:	Sat, 25 Aug 2001 02:27:01 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Smetana+1

While I'm still having a burst of creativity...

I have been thinking about the language Smetana (the one with only two
instructions, "soto" and "swap instructions"), and how to modify it to
become Turing-complete.

The problem with the original language is that there is no way to
expand memory.  Also, in order for any newly allocated memory to be
usable, it seems to me that it must be linked with mutual gotos and
swaps in a somewhat complicated manner.

So my suggestion is to modify the language such that some statements
are patterns:  Instead of describing the content of a single step,
they describe an infinite number of them.  Thus, the program can be
seen either as infinite, or as automatically allocating new steps
according to the patterns.

So, here is my proposed syntax of Smetana+1, similarly to that of
Smetana:

Smetana+1       ::=3D Pattern {".\n" Pattern} ".".
Pattern         ::=3D "Step" Label (When | ) "." (GoTo | Swap).
GoTo            ::=3D "Go" "to" "step" Label.
Swap            ::=3D "Swap" "step" Label "with" "step" Label.
Label           ::=3D ((Integer | ) "N" (("+" | "-") Integer | ) | Integer)
When            ::=3D "When" "N" (">" | ">=3D") Integer
Integer         ::=3D "0".."9" {"0".."9"}.

Of course, this risks that more than one pattern describes a single
step in the code.  In this case the first pattern listed applies.
This way input can be defined by listing it first in the program,
modifying the default content of steps otherwise representing e.g. an
empty Turing tape.

The program is intended to describe the _initial_ state of memory;
when a step is actually accessed, its referenced labels are calculated
as integers and stored, so that if two steps are swapped, the
referenced integers are swapped rather than the defining patterns.

I believe that this is sufficient to make Smetana+1 Turing-complete.
For a start, here is a suitable pattern list for defining a two-symbol
Turing tape:

Step 26 N.      Go to step 26 N + 4
Step 26 N + 1.  Go to step 26 N + 6
Step 26 N + 2.  Go to step 26 N + 8
Step 26 N + 3.  Go to step 26 N + 17
Step 26 N + 4.  Go to step 10
Step 26 N + 5.  Go to step 11
Step 26 N + 6.  Swap step 26 N + 4 with step 26 N + 5
Step 26 N + 7.  Go to step 12
Step 26 N + 8.  Swap step 26 N with step 21
Step 26 N + 9.  Swap step 26 N + 1 with step 22
Step 26 N + 10. Swap step 26 N + 2 with step 23
Step 26 N + 11. Swap step 26 N + 3 with step 24
Step 26 N + 12. Swap step 26 N - 26 with step 21
Step 26 N + 13. Swap step 26 N - 25 with step 22
Step 26 N + 14. Swap step 26 N - 24 with step 23
Step 26 N + 15. Swap step 26 N - 23 with step 24
Step 26 N + 16. Go to 13
Step 26 N + 17. Swap step 26 N with step 21
Step 26 N + 18. Swap step 26 N + 1 with step 22
Step 26 N + 19. Swap step 26 N + 2 with step 23
Step 26 N + 20. Swap step 26 N + 3 with step 24
Step 26 N + 21. Swap step 26 N + 26 with step 21
Step 26 N + 22. Swap step 26 N + 27 with step 22
Step 26 N + 23. Swap step 26 N + 28 with step 23
Step 26 N + 24. Swap step 26 N + 29 with step 24
Step 26 N + 25. Go to 13

It references some "global" steps which I have numbered arbitrarily:

10 : where to jump to return a zero bit
11 : where to jump to return a one bit
12 : where to jump after inverting the bit
13 : where to jump after moving left or right on the tape

21 : where to jump to read the current bit (returns to either 10 or 11)
22 : where to jump to invert the current bit (returns to 12)
23 : where to jump to move left on the tape (returns to 13)
24 : where to jump to move right on the tape (returns to 13)

Note that steps 26 N .. 26 N + 3 are only as shown for a bit that is
_not_ the current bit; for the current bit these are temporarily
swapped into 21 .. 24, respectively.

Now again some opportunities present themselves for adding I/O to
this.  Basically, add a symbol IO which can be used similarly to N
(although probably without a multiplier), and with IO, IO+1 etc.
referring to special steps with side effects when jumped to.  These
can be swapped as well, of course, and may have to be if one wants the
operations to return again.

Greetings,
=D8rjan.





------------------------------

Date:	Sat, 25 Aug 2001 02:41:36 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: Smetana+1

By the way, I cannot seem to access any of Chris Pressey's Smetana pages
except for the main one.  (I was thinking about maybe actually
implementing some of this...)

Greetings,
=D8rjan.





------------------------------

From: "joe" <josephhill@ntlworld.com>
Subject: [lang] Re: My language
Date: Sat, 25 Aug 2001 07:36:15 +0100



Gerson Wrote,

> Hey Joe,
>
> take a look at my language Sorted!. It can be found at
> http://p-nand-q.com/sorted.htm. You can download the full sourcecode. It
has
> a fairly straightforward syntax (look at the sample sources!) and a very
> straightforward implementation. However, you should know some basics about
> parsers and lexers and such.
>
> -----Original Message-----
> From: lang-bounce@esoteric.sange.fi
[mailto:lang-bounce@esoteric.sange.fi]On
> Behalf Of joe
> Sent: Friday, August 24, 2001 9:02 PM
> To: Esoteric Langs
> Subject: [lang] My language
>
>
> Ok...the concept of my language is this:
>
> It is designed for Fun only. It is set in the format of a childrens story,
> to start the program, you write "ONCE APON A TIME" in capitals and to end
> the program, you write "AND THEY ALL LIVED HAPPILY EVER AFTER" the
Variables
> are characters in the story, etc.
>
> Thoughts?
>
> ~Joe
>



Amusing...Very funny.





------------------------------

From: "joe" <josephhill@ntlworld.com>
Subject: [lang] Implementations
Date: Sat, 25 Aug 2001 19:42:06 +0100



Could anyone direct me to a tutorial on writting Interp.'s or comp.'s?

I want to make one... 




------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [Brainfuck] CGI Interpreter using MySQL as memory
Date: Sat, 25 Aug 2001 20:56:47 +0100

As promised, here: http://www.p-nand-q.com/bf.htm

is my Brainfuck interpreter, written in Python, using a MySQL table as
memory shared between all brainfuck programs / clients in the world (which
severly restricts its usefullness, but maybe you're into the S&M thing and
like severe restrictions). Note that currently the memory is *not* all
zeros, so you cannot just copy your existing bf code and try it out.

Its the source, luke: http://p-nand-q.com/python/bf-cgi.txt




------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: RE: [lang] Implementations
Date: Sat, 25 Aug 2001 21:07:02 +0100

Here is "Let's Build a Compiler", by Jack Crenshaw:

http://compilers.iecc.com/crenshaw/

Its quite nice. Its a bit old (1988), and talks alot about Pascal, but it is
reasonably well written IIRC.

But, the next time, please don't post HTML to the ESOLANG list :)

Bye, Gerson.

-----Original Message-----
From: lang-bounce@esoteric.sange.fi [mailto:lang-bounce@esoteric.sange.fi]On
Behalf Of joe
Sent: Saturday, August 25, 2001 7:42 PM
To: Esoteric Langs
Subject: [lang] Implementations



Could anyone direct me to a tutorial on writting Interp.'s or comp.'s?

I want to make one...



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [BF] Liposuction your fat syntax
Date: Sat, 25 Aug 2001 23:20:51 +0100

Lets make a short brainfuck recap

'>' : move the memory pointer to the next cell,
'<' : move the memory pointer to the previous cell,
'+' : increment the memory cell under the memory pointer,
'-' : decrement the memory cell under the memory pointer,
',' : fills the memory cell under the memory pointer with the ASCII value of
next character from the input,
'.' : writes the contents of the memory cell under the memory pointer as a
character with the corresponding ASCII value,
'[' : moves to the command following the matching ']', if the memory cell
under the memory pointer is zero, and
']' : moves to the command following the matching '[', if the memory cell
under the memory pointer is not zero.

Of these, I think you can eliminate the '-' because if you increment long
enough, you get an overflow, so its just a matter of how many '+'s you write
until you get -1.

Next, eliminate '<' for the same reason: the memory pointer is an address,
which is an integer, which can be decrement by ingenious use of overflow.

I think we *might* be loosing turing completeness at this point (because of
the infinite tape and all such) - BUT, the sourcecode could be of infinite
length - only the memory cells not. So I don't know if this is a fatal
restriction.

Next, I think the language should still be turing complete if it had just
one of the two loop constructs; so lets eliminate ']'.

Next, I think I/O is no essential feature for turing completeness, because
one could encode the input data in the source, and require the output data
be the content of the memory after program execution. (Much like, when you
take first steps in assembler, you look in memory to see the output of your
program).

So, we're down to three instructions, '>', '+' and '[' !!! Or, was that
overflow-thing cheating ?

Another approach at language minimalism:

INSTRUCTION #1 - Rotate the INSTRUCTION #2 semantics.
INSTRUCTION #2 - Execute one of ('>','+','[')

So, for example, instead of writing >++> one could write

|.||..|

Starts from '>', execute, rotate once to get '+', execute twice, rotate
twice to '>' again.

But then again, maybe I've been listening too much to Speedfreak @
www.klubradio.de the last couple of days :9






------------------------------

Date:	Sun, 26 Aug 2001 00:04:08 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [BF] Liposuction your fat syntax

On Sat, 25 Aug 2001, Gerson Kurz wrote:

> I think we *might* be loosing turing completeness at this point (because =
of
> the infinite tape and all such) - BUT, the sourcecode could be of infinit=
e
> length - only the memory cells not. So I don't know if this is a fatal
> restriction.

It certainly is, unless you really mean for a single program to have
infinite length.

One necessary requirement for Turing completeness:  There must be some
specific program, with specific finite input, which when run consumes an
infinite amount of memory (possibly including program counters and the
like.)

Otherwise one could solve the halting problem for that language by
simulating it until the entire state of the simulation repeats.

Greetings,
=D8rjan.





------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: RE: [lang] Re: [BF] Liposuction your fat syntax
Date: Sun, 26 Aug 2001 06:23:32 +0100

On Sat 25, Aug 2001, Orjan Johansen wrote:

> On Sat, 25 Aug 2001, Gerson Kurz wrote:
>
> > I think we *might* be loosing turing completeness at this point
> (because of
> > the infinite tape and all such) - BUT, the sourcecode could be
> of infinite
> > length - only the memory cells not. So I don't know if this is a fatal
> > restriction.
>
> It certainly is, unless you really mean for a single program to have
> infinite length.
>
> One necessary requirement for Turing completeness:  There must be some
> specific program, with specific finite input, which when run consumes an
> infinite amount of memory (possibly including program counters and the
> like.)

I don't quite get this: I don't see how the limitation of the size of memory
is a limitation in terms of completeness, because, after all, all existing
computers out there have finite memory. The program doesn't need to be
stored in the "working memory" itself, right ? Construct a machine: a laser
scanner reads instruction symbols from paper, and works with existing
physical RAM. Why should that machine be incomplete?

Writing down a program in minimized-bF could be hairy, but what about this:
attach a repeat counter for each instruction? So, for example, standard
brainfuck says there are 30000 cells, and each has a byte in size. One could
write +29999 instead of -




------------------------------

Date:	Sun, 26 Aug 2001 06:57:27 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: RE: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Gerson Kurz wrote:

> On Sat 25, Aug 2001, Orjan Johansen wrote:
>
> > One necessary requirement for Turing completeness:  There must be some
> > specific program, with specific finite input, which when run consumes a=
n
> > infinite amount of memory (possibly including program counters and the
> > like.)
>
> I don't quite get this: I don't see how the limitation of the size of mem=
ory
> is a limitation in terms of completeness, because, after all, all existin=
g
> computers out there have finite memory. The program doesn't need to be
> stored in the "working memory" itself, right ? Construct a machine: a las=
er
> scanner reads instruction symbols from paper, and works with existing
> physical RAM. Why should that machine be incomplete?

Well, Turing completeness is not a property that existing physical
computers can have, it is a mathematical property of abstract computers
and programming languages.

For example, while programming Intercal recently, I noted that it is not
Turing complete either, despite the fact that you can easily define arrays
with more entries than there are atoms in the known universe.  The reason
is that you cannot arbitrary enlarge those arrays in a fixed program...

So if you want your language to be Turing complete, you cannot tie it to a
limited physical implementation.  You need to abstract away the physical
limits.

> Writing down a program in minimized-bF could be hairy, but what about thi=
s:
> attach a repeat counter for each instruction? So, for example, standard
> brainfuck says there are 30000 cells, and each has a byte in size. One co=
uld
> write +29999 instead of -

Should work.  By the way, that shows that standard brainfuck is not Turing
complete either.

Greetings,
=D8rjan.



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: RE: [lang] Re: [BF] Liposuction your fat syntax
Date: Sun, 26 Aug 2001 07:04:18 +0100

Hi Orjan,

> On Sat 26, Aug 2001, Orjan Johansen wrote:
> So if you want your language to be Turing complete, you cannot tie it to a
> limited physical implementation.  You need to abstract away the physical
> limits.

So which computer language is turing complete, then? Take C - doesn't it
limit the size of its pointers? So isn't the physically accessible memory
limited?

Is there a term "practically complete" or some such, as apposed to the
strict mathematical term?



------------------------------

Date:	Sun, 26 Aug 2001 07:57:27 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: RE: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Gerson Kurz wrote:

> Hi Orjan,
>
> > On Sat 26, Aug 2001, Orjan Johansen wrote:
> > So if you want your language to be Turing complete, you cannot tie it t=
o a
> > limited physical implementation.  You need to abstract away the physica=
l
> > limits.
>
> So which computer language is turing complete, then? Take C - doesn't it
> limit the size of its pointers? So isn't the physically accessible memory
> limited?

I don't know the C standard, so I cannot say for sure.  I would doubt that
it puts any particular limit on them, except lower limits.  Any particular
compiler will likely have a limit to how large memories it can handle.

> Is there a term "practically complete" or some such, as apposed to the
> strict mathematical term?

I think such a term would have to be somehow arbitrary.  You might ask if
you can simulate a computer with a suitably large memory.  Or, more
mathematically speaking, any finite state automaton of a certain size.

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: RE: [lang] Re: [BF] Liposuction your fat syntax
Date: Sun, 26 Aug 2001 08:35:44 +0100

> On Sun, 26 Aug 2001, Orjan Johansen wrote:
> I don't know the C standard, so I cannot say for sure.  I would doubt that
> it puts any particular limit on them, except lower limits.  Any particular
> compiler will likely have a limit to how large memories it can handle.

The standard says that there is no guarantee that a pointer can be
represented within the size of any integer data type. So I guess that means,
the pointer size can exceed the integer data size in the machine, so you're
right.

But then again, I think that an actual implementation with "infinite sized
pointers" is not possible in an actual finite machine. (But then, I'm no
mathematician :)

Anyway, I've written up a parser for "mini-bf" (with a new semantics to
"["), and will hopefully be able to write a fibonacci in it. I'll post that
later.



------------------------------

Date: Sun, 26 Aug 2001 02:53:30 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [lang]

joe wrote:
> Hi, I'm new here, and I'd like to create an Esoteric language but I
> don't have a clue how. Can anyone help?

If you really must know the secret to creating an esoteric programming
language, I'll tell you.  Find the five most annoying, most aggravating
features in your favourite programming language, then find a way to put
those bad boys together so's that you can do everything imaginable with
just those features in some way that is really unexpected at first but
in retrospect looks completely bloody obvious.

Later, joe wrote:
> Ok...the concept of my language is this:
> It is designed for Fun only. It is set in the format of a childrens
> story, to start the program, you write "ONCE APON A TIME" in capitals
> and to end the program, you write "AND THEY ALL LIVED HAPPILY EVER
> AFTER" the Variables are characters in the story, etc.
> Thoughts?

Go for it!  I love fairytales :)

Chris




------------------------------

Date: Sun, 26 Aug 2001 03:21:45 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [lang] Re: [BF] Liposuction your fat syntax

Orjan Johansen wrote:
> For example, while programming Intercal recently, I noted that it is not
> Turing complete either, despite the fact that you can easily define arrays
> with more entries than there are atoms in the known universe.  The reason
> is that you cannot arbitrary enlarge those arrays in a fixed program...

If that's the case, I should note that many BASICs aren't
Turing-Complete, either.

Thanks for pointing that out.  Now I have a purely mathematical reason
to hate my day job.

Chris


------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [LANG][BFmin1 + BFmin2]
Date: Sun, 26 Aug 2001 12:16:26 +0100

As promised: BFmin1 is a three-instruction brainfuck, as uncomplete as the
bloated eight-instruction-BF, BFmin2 is an optimized syntax for BFmin1. Both
include parsers, and a fibonacci sample code ready for downloading.

http://p-nand-q.com/bfmin.htm

Note that the BFmin1 source for fibonacci is 50107 bytes - I should think
the worlds largest source for fibonacci...



------------------------------

From: "joe" <josephhill@ntlworld.com>
Subject: [lang] 
Date: Sun, 26 Aug 2001 11:19:00 +0100


Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


Here is a short (incomplete) summary of my language with a Hello, World =
program attached.

Tell me what you think.=20

But I really need something to implement it with...I do not know how to =
write an implementation.





-- Binary/unsupported file stripped by Listar --
-- Type: application/x-zip-compressed
-- File: CAP.zip



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: RE: [lang] 
Date: Sun, 26 Aug 2001 12:50:18 +0100

Here is an interpreter in python:

variables, strnicmp = {}, lambda a,b: a[:len(b)].upper() == b.upper()
for line in open("Z:\\hello.cap").readlines():
    if strnicmp(line,'THERE WAS A LITTLE PIECE OF STRING CALLED'):
        variables[line[42:].strip()] = ""
    elif strnicmp(line,'THERE WAS A LITTLE FISH CALLED'):
        variables[line[31:].strip()] = 0.0
    elif strnicmp(line,'THERE WAS A LITTLE RABBIT CALLED'):
        variables[line[33:].strip()] = 0
    elif strnicmp(line,'AND '):
        line = line[4:]
        for k in variables.keys():
            if strnicmp(line,k):
                line = line[len(k)+1:]
                if strnicmp(line,'SAID '):
                    variables[k] = eval(line[5:])
                break
    else:
        for k in variables.keys():
            if strnicmp(line,k):
                line = line[len(k)+1:]
                if strnicmp(line,"SHOWED HIMSELF"):
                    print variables[k]

But, so far you cannot do much but assign values and print them, because
your syntax doesn't imply anything else. And I don't think seeing this code
will help you in your quest.

So, have you *read* the compiler tutorial I mentioned before?
(http://compilers.iecc.com/crenshaw/) Did you have any probs with it?

-----Original Message-----
From: lang-bounce@esoteric.sange.fi [mailto:lang-bounce@esoteric.sange.fi]On
Behalf Of joe
Sent: Sunday, August 26, 2001 11:19 AM
To: Esoteric Langs
Subject: [lang]



Here is a short (incomplete) summary of my language with a Hello, World
program attached.

Tell me what you think.

But I really need something to implement it with...I do not know how to
write an implementation.



------------------------------

Date: Sun, 26 Aug 2001 18:56:26 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Orjan Johansen wrote:

> > Writing down a program in minimized-bF could be hairy, but what about this:
> > attach a repeat counter for each instruction? So, for example, standard
> > brainfuck says there are 30000 cells, and each has a byte in size. One could
> > write +29999 instead of -
>
> Should work.  By the way, that shows that standard brainfuck is not Turing
> complete either.

Funnily, this same thing was discussed on the list when we argued on
whether a certain language named beta-Juliet is Turing-complete. (See
http://www.catseye.mb.ca/esoteric/b-juliet/index.html) Is there somewhere
a list for requirements for a Turing-complete system? This "infinite
number of states" is the most often violated one, but it's not very
"cool", because programs in languages not TC in this way can still work as
if they were, for a limited set of inputs...

By the way, the 30000 cells is "standard" only in the way that the
original implementation had an array of this size. Many implementations
exist where the infinite memory is implemented (at least as long as the
underlying machine permits). ENSI brainfuck, both version 1.0 and 2.0,
feature arbitrary-length integers and infinite (in both directions) tape.
Frank Faase also sees bf cells as holding integers, not some finite number
of bits (or anything other that could overflow). This prevents the
elimination of -.

Panu

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi




------------------------------

Date: Sun, 26 Aug 2001 18:58:58 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re:  RE: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Gerson Kurz wrote:

> But then again, I think that an actual implementation with "infinite sized
> pointers" is not possible in an actual finite machine. (But then, I'm no
> mathematician :)

This is nitpicking, but I think the standard does not say C should be
implemented on an actual finite machine, either...

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi




------------------------------

Date: Sun, 26 Aug 2001 12:26:36 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Orjan Johansen wrote:
> On Sat, 25 Aug 2001, Gerson Kurz wrote:
> > I think we *might* be loosing turing completeness at this point (because of
> > the infinite tape and all such) - BUT, the sourcecode could be of infinite
> > length - only the memory cells not. So I don't know if this is a fatal
> > restriction.
> It certainly is, unless you really mean for a single program to have
> infinite length.
> One necessary requirement for Turing completeness:  There must be some
> specific program, with specific finite input, which when run consumes an
> infinite amount of memory (possibly including program counters and the
> like.)

Untrue, if you're going to get nitpicky enough to state it.  A Turing
Complete system is one which can generate any recursively-enumerable
set (don't get excited guys--an "r.e. set" is just one that can be
defined as the range of a mathematical function for which the entire
range (given the domain of natural numbers) is defined (in the set of 
natural numbers)) or some equivalent derivation.  How it accomplishes 
this is irrelevant.

I'll grant you that, with modern technology, it's unlikely that one can
walk through the (infinite) set of natural numbers, but that has
nothing to do with the language, itself, but is rather a function of
the underlying hardware.

There must, therefore, be a way of specifying unbounded computation
(with a finitely-sized program, obviously), but there needn't be any
form of infinite storage.

> Otherwise one could solve the halting problem for that language by
> simulating it until the entire state of the simulation repeats.

Also untrue.  You can't solve the Halting Problem through simulation,
because you will not (in the general case) determine if a program is
unending, because if it is, the program won't terminate (obviously) for
you to find out.

Neither of this is to say that the particular dialect of BrainF*** is
Turing Complete.  In fact, relying on defects in the hardware to
provide computational ability suggests otherwise, as the source code
certainly can't grow fast enough to provide for the aforementioned
unbounded computations.





------------------------------

Date: Sun, 26 Aug 2001 12:47:42 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Panu A Kalliokoski wrote:
[...]
> Is there somewhere
> a list for requirements for a Turing-complete system?

No such thing, really, as the "requirement" are based on how you derive
the capabilities of a Turing Machine.  The best description is one of
"equivalent power":  If the system can compute the same functions (in
the sense of mapping from one set to another) as a known, Turing-
Complete system, then it, too, is (at least) Turing-Complete. 
Canonical examples of known Turing-Complete systems are Turing
Machines, the Lambda Calculus, and semi-Thue grammars. 

The easiest way of proving that all such mappings are possible is to
show that the known system can be simulated by the system in question;
in the classical (imperative-like) case, it's often easiest to show
that a state machine with sequentially-addressable memory can be built.

The hard way is to learn about Primitive Recursive Functions, NP
problem mapping, and all that other spooky stuff that few books touch
upon, and actually map the old system's "features" into the new.

[...]



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [LANG] The shakespeare language
Date: Sun, 26 Aug 2001 20:49:24 +0100

Nice language, probably not turing complete either, but very funny (and I
have to advertise it, because they mention my languages).

Hello World:
http://www.d.kth.se/~d98-kha/shakespeare/index.php?The%20Infamous%20Hello%20
World%20Program

Documentation:
http://www.d.kth.se/~d98-kha/shakespeare/report/shakespeare/index.html





------------------------------

Date: Sun, 26 Aug 2001 14:54:51 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat syntax

John Colagioia wrote:
> 
> On Sun, 26 Aug 2001, Panu A Kalliokoski wrote:
> [...]
> > Is there somewhere
> > a list for requirements for a Turing-complete system?
> 
> No such thing, really, as the "requirement" are based on how you derive
> the capabilities of a Turing Machine.  The best description is one of
> "equivalent power":  If the system can compute the same functions (in
> the sense of mapping from one set to another) as a known, Turing-
> Complete system, then it, too, is (at least) Turing-Complete.
> Canonical examples of known Turing-Complete systems are Turing
> Machines, the Lambda Calculus, and semi-Thue grammars.

So let's put the Halting Problem aside (silly thing anyway - I never
liked it much.)  The issue is whether these languages (Intercal,
SMETANA, beta-Juliet, Befunge, non-ENSI Brainfuck, many BASIC's) are
Turing-Complete.  These languages have finite, constant data/program
sizes which cannot grow at runtime.  This is not the same as the Turing
Machine's infinite tape, which can always grow.  In other words, the
Turing Machine has a runtime dynamic memory allocation facility which is
not arbitrarily bounded.  Going on capabilities alone, the Turing
Machine has a capability that the other languages don't have and can't
simulate - unbounded dynamic memory.  That would seem to imply that the
other languages are less powerful than Turing Machines and therefore not
Turing-Complete.

Chris


------------------------------

Date: Sun, 26 Aug 2001 18:01:25 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Chris Pressey wrote:
> John Colagioia wrote:
[...]
> > If the system can compute the same functions (in
> > the sense of mapping from one set to another) as a known, Turing-
> > Complete system, then it, too, is (at least) Turing-Complete.
> > Canonical examples of known Turing-Complete systems are Turing
> > Machines, the Lambda Calculus, and semi-Thue grammars.
[...]
> Going on capabilities alone, the Turing
> Machine has a capability that the other languages don't have and can't
> simulate - unbounded dynamic memory.  That would seem to imply that the
> other languages are less powerful than Turing Machines and therefore not
> Turing-Complete.

Pretty much.  They're all that "borderline complete" category that I
mentioned as uninteresting way-back-when.

But, also, no.  It's not just "finite memory+no codegrowth=non-TC," 
because loops and conditionals can substitute for memory, when
necessary (lots of compression can probably be done if you're willing
to wait for it...).  This is that space/time tradeoff that the
Algorithms people always talk about, which has gotten "all screwed up"
by the caching systems that make small programs run faster...

Note, incidentally, that with clever use of STASH/RETRIEVE and array-
resizing, INTERCAL-as-specified (not -as-implemented, of course) may
very well have infinite memory, assuming the stack depth and maximum
array sizes are unspecified (I fear the former may be, but probably not
the latter).



------------------------------

Date: Sun, 26 Aug 2001 18:07:13 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat syntax

John Colagioia wrote:
> 
> On Sun, 26 Aug 2001, Chris Pressey wrote:
> > John Colagioia wrote:
> [...]
> > > If the system can compute the same functions (in
> > > the sense of mapping from one set to another) as a known, Turing-
> > > Complete system, then it, too, is (at least) Turing-Complete.
> > > Canonical examples of known Turing-Complete systems are Turing
> > > Machines, the Lambda Calculus, and semi-Thue grammars.
> [...]
> > Going on capabilities alone, the Turing
> > Machine has a capability that the other languages don't have and can't
> > simulate - unbounded dynamic memory.  That would seem to imply that the
> > other languages are less powerful than Turing Machines and therefore not
> > Turing-Complete.
> 
> Pretty much.  They're all that "borderline complete" category that I
> mentioned as uninteresting way-back-when.

This is the point where I usually wish there was some sort of metric,
even if it was necessarily somewhat arbitrary, like a Beaufort scale.

> But, also, no.  It's not just "finite memory+no codegrowth=non-TC,"
> because loops and conditionals can substitute for memory, when
> necessary (lots of compression can probably be done if you're willing
> to wait for it...).  This is that space/time tradeoff that the
> Algorithms people always talk about, which has gotten "all screwed up"
> by the caching systems that make small programs run faster...

That code and data can be interchanged is not the issue... my point is
that, TC aside, a language which cannot create/find/specify an arbitrary
amount of new code/data at runtime is not as powerful as a language
which can.

I don't find it uninteresting in the least, in fact I find it
fascinating - it's one of the reasons I wrote beta-Juliet in the first
place, to pose the question.  beta-Juliet is really more like a hardware
design language.  And hardware typically doesn't grow more of itself at
runtime (aside from Eric Cartman's TrapperKeeper-2000 o' course.)

One could build an electronic circuit that hardcodes every possible
Befunge-93 program.  It'd be one friggin' huge circuit, but you could do
it.  But you can't do the same thing with Befunge-98... there is no one
circuit that could simulate every possible Befunge-98 program.

Chris


------------------------------

Date: Sun, 26 Aug 2001 16:28:09 -0700
From: "Daniel." <voice@teleport.com>
Subject: [lang] [BF] BFmin1, and a plea to list members

Okay, I was going to ask about some gaps in the documentation, but I 
figured the stuff out by looking at your interpreter, which I assume 
anyone who wants to write a BFmin1 or BFmin2 program will do. So I 
won't bother. But I will note quickly that you have + and > 
interchanged in the interpreter. Also your first example program 
shouldn't work, either before or after fixing that interpreter bug.

And now, to everyone on this list: please please think twice before 
improving brainfuck. There are already about as many improved 
versions as there are brainfuck programs, and brainfuck itself is 
still my favorite of the family (and the most elegant language I 
know). Some things (e.g. array size) should be seen as parameters and 
not as language features, but other than that I suggest we leave the 
puppy alone for a while and write some more programs in it. Also 
(less importantly): censoring the name not only makes people seem 
fragile, it's also counterproductive. Anyone over age 4 knows what 
dirty word beginning with 'f' is meant; asterisks &c. just make the 
brain spend more time thinking about it rather than moving on. Also 
it would seem to me that the language's creator had the right to 
decide what the name should be.
Anyway.
-Daniel.




------------------------------

Date: Sun, 26 Aug 2001 18:45:28 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [OS] [ESO] other approaches

I have two alternate approaches in mind for an esoteric operating
system.

One which I'm persuing, sort of, is to build an entire (emulated)
esoteric computer, based on one of my all-time favourite chips, the
6502.  I found some emulator code and an assembler and have built a very
rudimentary virtual machine.  The only thing I've really put in it so
far is a memory-mapped screen implemented with curses.  And a
single-keystroke keyboard buffer (I'll have to improve that.)  I'm
debating with myself if or how or why I want to implement memory paging
and colour graphics in a portable manner.  Anyway, almost all of this is
on the abstraction level of emulated hardware, so there'd only be a very
small amount of 6502 code in the actual 'kernel' - pretty much just a
language compiler, which would serve as the API, and command line
interface for it.  Then the rest of the user interface could be
developed in that.

The other, more interesting approach is almost completely the opposite. 
The idea is to write a ENSI standard for "ESOTERIX" compatibility.  A
lot like POSIX.  (Some would argue that POSIX is already pretty
brain-damaged.  But I still feel we could do better :)  And then,
various operating systems could be developed with their various
different approaches, but they could all comply with ESOTERIX through
use of extensions or compatibility layers or whatnot.

What I would like to see put in to an ESOTERIX standard is the idea of
being able to inspect and manipulate operating system data by use of
just the standard input and output channels through use of escape
sequences.  Yes, Panu is right that ioctl is a better abstraction, but I
think he misunderstands me - there is no other abstraction available
that doesn't basically disrupt a bunch of esoteric languages - I mean,
how else can one put syscalls in Brainfuck without changing the language
by adding new instructions, disturbing the beautiful symmetry and making
it even more fat?  And Brainfuck is surely not the only esoteric
language with this limitation.

After Befunge-98 and it's awkward attempts to look at and/or affect
system data with the 'y' instruction, I think I've learned the lesson
that, at least for the sake of toy-language-developer-simplicity,
operating system stuff should be exposed by the operating system and NOT
by the language.  And in the case of language interpreters for other
platforms, like Unix or Windows, the language developer has the option
of implementing ENSI ESOTERIX hirself; if we got ambitious, ENSI could
even distribute libraries containing the revelant functions for parsing
the stdio streams and handling the various requests.  ESOTERIX could act
something like a 'thin interface' between the language and the syscalls,
and as a 'sandbox' or 'bastion' too.

Your opinions on these matters are always welcome of course.

Chris


------------------------------

Date: Sun, 26 Aug 2001 18:57:09 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [BF] BFmin1, and a plea to list members

"Daniel." wrote:
> And now, to everyone on this list: please please think twice before
> improving brainfuck.

Consider it done  :)  This is also a reason to agree on a
syscall-through-stdio standard... so we don't have to "improve"
Brainfuck with extra syscall instructions.

> Also
> (less importantly): censoring the name not only makes people seem
> fragile, it's also counterproductive.

The only reason I censor it on my page is because I don't want it to be
automatically kept away from the eyes of bright young programmers by
some netnanny program.  I could possibly use an image of a "u" in place
of the character "u" though, that would accomplish the same end.

Chris




------------------------------

Date: Sun, 26 Aug 2001 18:49:28 -0700
From: Brian Raiter <breadbox@muppetlabs.com>
Subject: [lang] Re: [BF] Liposuction your fat syntax

>> It certainly is, unless you really mean for a single program to have
>> infinite length.
>> One necessary requirement for Turing completeness:  There must be some
>> specific program, with specific finite input, which when run consumes an
>> infinite amount of memory (possibly including program counters and the
>> like.)

[...]

>> Otherwise one could solve the halting problem for that language by
>> simulating it until the entire state of the simulation repeats.
> 
> Also untrue.  You can't solve the Halting Problem through
> simulation, because you will not (in the general case) determine if
> a program is unending, because if it is, the program won't terminate
> (obviously) for you to find out.

I think you missed his point.... IF it is impossible to write a
program in the language that consumes storage endlessly, THEN the
Halting problem *can* be solved by simulation. (Because there can only
be a finite number of states that a program can be in, a program that
runs forever must, at some point, return to a state that it was in
previously. And thus a simulator that keeps track of every state the
program enters and stops if it enters a state it has seen before is
guaranteed to terminate.)

b




------------------------------

Date:	Mon, 27 Aug 2001 05:46:47 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, John Colagioia wrote:

> On Sun, 26 Aug 2001, Orjan Johansen wrote:

> > One necessary requirement for Turing completeness:  There must be some
> > specific program, with specific finite input, which when run consumes a=
n
> > infinite amount of memory (possibly including program counters and the
> > like.)
>
> Untrue, if you're going to get nitpicky enough to state it.  A Turing
> Complete system is one which can generate any recursively-enumerable
> set (don't get excited guys--an "r.e. set" is just one that can be
> defined as the range of a mathematical function for which the entire
> range (given the domain of natural numbers) is defined (in the set of
> natural numbers)) or some equivalent derivation.  How it accomplishes
> this is irrelevant.

Hm, good point.  Let me rephrase it.  First, let us assume that the
language is not _more_ than Turing complete.  In other words, that the
language can be implemented using a Turing machine or other abstract
computer using "memory" (with any recursion stack considered part of
memory.)  Let any such implementation be given.

Then there must be some specific program which when implemented and run
causes the implementation to consume an infinite amount of memory.

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date:	Mon, 27 Aug 2001 05:57:50 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [SPAM?] RE: Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, John Colagioia wrote:

> But, also, no.  It's not just "finite memory+no codegrowth=3Dnon-TC,"
> because loops and conditionals can substitute for memory, when
> necessary (lots of compression can probably be done if you're willing
> to wait for it...).

It does become just that, once you include as memory all remembered state,
including program counter and recursion stack.

> Note, incidentally, that with clever use of STASH/RETRIEVE and array-
> resizing, INTERCAL-as-specified (not -as-implemented, of course) may
> very well have infinite memory, assuming the stack depth and maximum
> array sizes are unspecified (I fear the former may be, but probably not
> the latter).

Indeed, array indices cannot be more than 32-bit unsigned integers, so you
can look at all the dimensions of variables mentioned in the program and
calculate an explicit upper bound on unstashed memory.

I guess STASH/RETRIEVE gives Intercal the power to simulate any
deterministic pushdown automaton.

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date:	Mon, 27 Aug 2001 08:51:30 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [SPAM?] RE: Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Panu A Kalliokoski wrote:

> ENSI

What is that?  Esoteric Net Standards Institute?

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date: Mon, 27 Aug 2001 01:02:12 -0700
From: "Daniel." <voice@teleport.com>
Subject: [lang] Re: [BF] BFmin1, and a plea to list members

>Consider it done  :)  This is also a reason to agree on a
>syscall-through-stdio standard... so we don't have to "improve"
>Brainfuck with extra syscall instructions.

Definitely.

>The only reason I censor it on my page is because I don't want it to be
>automatically kept away from the eyes of bright young programmers by
>some netnanny program.

AHHH. Hadn't thought of that. I wonder how much other stuff is kept 
away from bright kids by those. (It wouldn't be hard to extend their 
function to do ideological screening; it's as easy to scan for 
"imperialist" &c. as for "fuck" &c.)

>I could possibly use an image of a "u" in place
>of the character "u" though, that would accomplish the same end.

Right--except then if they aren't using the same font the "u" will 
stick out of the word. And if you make the whole word an image it'll 
stick out of the page. Hmm.

(Later) Okay, I'm irritated now. You'd think a browser would at least 
have the decency to ignore an unknown character, no? But Netscape, at 
least for Mac, and as recently as version 4.5, displays 
"brainfu&zwj;ck" as "brainfu&zwj;ck" and not as "brainfuck". ("zwj" 
specifies a zero-width joiner, which should be the right invisible 
character.) Also, it displays an ASCII BEL (07) and NAK (15H) as a 
space and a box, respectively. Probably it deals no better with other 
control characters. Nor will either Netscape or Explorer properly 
(fail to) display a zero-size image. Does anyone know enough about 
netnannies to know if they'd be fooled by, say, "brainfu<a></a>ck" 
(which IS displayed properly)? Or does anyone have any other bright 
ideas?
-Daniel.




------------------------------

Date: Mon, 27 Aug 2001 12:33:41 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [system design] AOP, bJ

On Mon, 20 Aug 2001, Chris Pressey wrote:

> > <quote>
> > that using standard procedural or object-oriented programming languag=
es it
> > can be difficult to modularize design concerns such as: [...]
> >   * design patterns [...]
> > </quote>
>
> Part of my understanding of design patterns is that if X can be
> modularized, X is not a design pattern.  So Xerox is quite plainly
> babbling nonsense at this point.

Yep. They seem to be blurting out every way to structure a program,
claiming that AOP can modularise it. Very nonsensical.

> > Of course, it's up to the programmer to arrange the hooks sensibly.
>
> Therein lies the problem!  "Everything is an event" is great, but how i=
s
> AOP supposed to make the aforementioned things any easier to
> modularize?  There must be more to it.  Patterns or spans of events, or
> something, so that one piece of code can be applied to many events "at
> once".

Yes, of course, they have very "sophisticated" ways of hooking execution
flow. The ability to hook is just a requisite: otherwise, you can't
arrange your program into any given grouping.

> > Have I missed something?
>
> I don't think so.  You're not going to be happy until it's fully
> reflective too, are you?  :)  I think it might have to go that way to b=
e

Actually, I'm not happy with my dis-proof, because I have a feeling that
there are other reasons why bJ can't be TC. The language Bag by =D6rjan
might prove me wrong. This is a matter I must study: I still don't
understand how one can represent referencing in a language that only has
separate symbols as data.

> Turing-complete.  Either that or some way to aggregate alphabet symbols
> into larger, scaleable numbers, and parse them somehow.  I dunno.  I
> have to go about posting these proofs.

A way to reference one event from another would be the easiest way. That
way, one'd be able to build infinite data structures.

Panu






------------------------------

Date: Mon, 27 Aug 2001 11:39:27 +0200
From: Frederic van der Plancke <fvdp@decis.be>
Subject: [lang] Re: [Brainfuck] CGI Interpreter using MySQL as memory

Gerson Kurz wrote:
> 
> As promised, here: http://www.p-nand-q.com/bf.htm
> 
> is my Brainfuck interpreter, written in Python, using a MySQL table as
> [...]

I've got problems:

Error that happens on '[' when current cell is null:
> Traceback (most recent call last):
>   File "bf-cgi.py", line 125, in ?
>     while i

Error that happens on ']' in some cases:
> Traceback (most recent call last):
>   File "bf-cgi.py", line 139, in ?
>     c=j[i]
> NameError: There is no variable named 'j'

These are maybe due to concurrent access to your interpreter
by several S&M players at once.

Frédéric vdP





------------------------------

Date: Mon, 27 Aug 2001 13:03:02 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Bag language

On Fri, 24 Aug 2001, Orjan Johansen wrote:

> If (s) is the number of distinct symbols, let the number of tokens Left
> and Right represent the tape to the left and right as integers using base
> (s) notation.  Also Current for the value on the tape at the current
> point.

Okay - this was the bit I wasn't able to come up with by myself: how to
represent the infinite tape in a data model without references. I didn't
think about the fact of Turing Machines' alphabets being finite. Thank
you.

This just goes off to show that the lack of arbitrary-length integers in
referenceless languages like beta-Juliet is crucial.

> > Add order, and you've got a semi-Thue grammar.
>
> I suspected something like that.  I only saw mention of Thue before
> posting that message, although I have now found a description.

Yes. (Semi-)Thue grammars is a very interesting subject, but I haven't had
time to study it thoroughly. Some "esoteric" references include:

http://www.catseye.mb.ca/esoteric/thue/index.html
(mixed with other stuff) http://fvdp.homestead.com/files/eso_index.html

> Of course, I think the lack of order adds to the flavor of the language.

It sure does. Semi-Thue grammars feel highly abstract compared to Bag.

Panu Kalliokoski





------------------------------

Date: Mon, 27 Aug 2001 13:17:46 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [BF] Liposuction your fat syntax

On Sat, 25 Aug 2001, Gerson Kurz wrote:

> So, we're down to three instructions, '>', '+' and '[' !!! Or, was that
> overflow-thing cheating ?

Yes, because the original "specification" of bf, distributed with the
interpreter, defines the number implementation to be similar to that of C,
which in turn does not guarantee overflow.

If you're interested in imperative tarpits, check
http://sange.fi/~atehwa-u/small-esoteric/iag.c

> Another approach at language minimalism:
>
> INSTRUCTION #1 - Rotate the INSTRUCTION #2 semantics.
> INSTRUCTION #2 - Execute one of ('>','+','[')

Still another:
Inst #1 - add high bit to bit stream
Inst #2 - add low bit to bit stream

Interpret the bit stream as 6502 machine code. You can't go under two
instructions, however...

I did think about these kinds of languages when designing iag. The only
restriction I could come up with is that there should be no state which is
only bound to how instructions are executed. Very bad definition... maybe
this would be better: "the meaning of an instruction should not be
dependent of its place in program code in a solvable (i.e.
guaranteed-to-stop-analysis) way".

Panu






------------------------------

Date: Mon, 27 Aug 2001 13:22:59 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [SPAM?] Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat

On Sun, 26 Aug 2001, John Colagioia wrote:

> On Sun, 26 Aug 2001, Panu A Kalliokoski wrote:
> [...]
> > Is there somewhere
> > a list for requirements for a Turing-complete system?
>
> No such thing, really, as the "requirement" are based on how you derive
> the capabilities of a Turing Machine.  The best description is one of
> "equivalent power":  If the system can compute the same functions (in

I know, I'm not looking for a description, but rather some quick tests
which could prove a given system TC / not TC.

> The hard way is to learn about Primitive Recursive Functions, NP
> problem mapping, and all that other spooky stuff that few books touch
> upon, and actually map the old system's "features" into the new.

/Hard/ way? I think Turing Machines are an ugly kludge to be able to
practically automate the expressive power of nice, simple, T-C systems
like lambda calculus. Most all of the properties of Turing Machines are
proven by showing Turing Machines equivalent to lambda calculus, and then
proving the properties in lambda calculus.

Panu




------------------------------

From: shafalus@yahoo.co.uk
Date: Mon, 27 Aug 2001 13:37:57 +0200
Subject: [lang] Re: [BF] BFmin1, and a plea to list members

On 27 Aug 2001, at 1:02, Daniel. wrote:

> Does anyone know enough about 
> netnannies to know if they'd be fooled by, say, "brainfu<a></a>ck" 
> (which IS displayed properly)? Or does anyone have any other bright 
> ideas?
> -Daniel.
> 

How about brainf&#117;ck?

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com





------------------------------

Date: Mon, 27 Aug 2001 13:37:07 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [SPAM?] [BF] BFmin1, and a plea to list members

On Sun, 26 Aug 2001, Daniel. wrote:

> And now, to everyone on this list: please please think twice before
> improving brainfuck. There are already about as many improved

Hee, hee. I see bf as the great spawning-bed of imperative tarpits... bf
can be a source of inspiration, but you can't change it. :)

> know). Some things (e.g. array size) should be seen as parameters and
> not as language features, but other than that I suggest we leave the
> puppy alone for a while and write some more programs in it. Also

... and let it drag more people to the community. I'm not very interested
in writing bf programs nowadays, though: the representations of various
things in bf are self-evident for anybody who has programmed in any
"common" programming language, the "," and "." instructions are ugly, and
the original specification leaves so much of the memory model unspecified
that it has fueled over 10 completely pointless discussions which I have
seen (array semantics, integer semantics &c). But bf is a good
starting-point.

> (less importantly): censoring the name not only makes people seem
> fragile, it's also counterproductive. Anyone over age 4 knows what
> dirty word beginning with 'f' is meant; asterisks &c. just make the
> brain spend more time thinking about it rather than moving on. Also

Chris made a good point about this once: he censored it on his pages to
avoid the pages being marked as adults-only in search machines etc.  I
myself find it as easy to read "brainfuck" as "brainf***" or whatever, but
there are some media where I would use the latter anyway. Just to point
out that this is not because I have difficulties using the word, I insert
it here a couple of times: fuck, fuck, fuck, fuck, fuck.

Panu






------------------------------

Date: Mon, 27 Aug 2001 13:44:51 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [OS] [ESO] other approaches

On Sun, 26 Aug 2001, Chris Pressey wrote:

> The other, more interesting approach is almost completely the opposite.
> The idea is to write a ENSI standard for "ESOTERIX" compatibility.  A
> lot like POSIX.  (Some would argue that POSIX is already pretty
> brain-damaged.  But I still feel we could do better :)  And then,

This is a very good approach. But the standard should be a "proper"
standard, because arbitrary obfuscations are very tiresome to implement.

> sequences.  Yes, Panu is right that ioctl is a better abstraction, but I
> think he misunderstands me - there is no other abstraction available
> that doesn't basically disrupt a bunch of esoteric languages - I mean,

If I remember correctly, I was replying to someone else's views on the
matter. You're correct about the importance of the stream abstraction for
a couple of languages. Still, rather than to define escape sequences for
various "method-like" services the files provide, make a pure
control-stream bound to stdin and stdout, through which different
messages, like POSIX calls or something equivalent, can be multiplexed.

> of implementing ENSI ESOTERIX hirself; if we got ambitious, ENSI could
> even distribute libraries containing the revelant functions for parsing
> the stdio streams and handling the various requests.  ESOTERIX could act

Exactly. This is ENSI libeso for you, and plays the role of libc in
Unices.

Panu



------------------------------

Date: Mon, 27 Aug 2001 14:06:41 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [ENSI] recall

On Mon, 27 Aug 2001, Orjan Johansen wrote:
> > ENSI
> What is that?  Esoteric Net Standards Institute?

Almost correct. It's the Esoteric Non-Standards Institute. It was not my
idea, but of the two (!) standards which ENSI has released, ENSI brainfuck
1.0 and ENSI brainfuck 1.2, I wrote the latter. (I'll be pleased to add
the former to the repository, if somebody can still find it.)

A complete listing of ENSI standards is available at:
http://esoteric.sange.fi/ENSI/

As you can see, the rush to write new ENSI standards has been quite
feeble, if not even nonexistent. However, now that the subject has popped
up again, new standards are welcome.

Panu






------------------------------

Date: Mon, 27 Aug 2001 04:28:23 -0700
From: "Daniel." <voice@teleport.com>
Subject: [lang] Here's the first ENSI post again: [BF] ENSI standardization

>Hi,
>
>there are so many brainfuck implementations and they all differ, so I
>thought there's a need to standardize brainfuck. I got together with ENSI
>and worked out this draft proposal.
>
>ENSI BrainFuck
>
>ENSI, the Esoteric Non-existant Standards Institute, now officially does
>not exist in order to standardize unstandardized standardizable things.
>This is important for the development of non-standard-compliance in
>esoteric languages.
>
>ENSI currently has one (for some odd reason) existant member, 203
>non-existant members and 3 members that we know exist, but deny it.
>
>Feel free to join ENSI (at a rate of 2000 Zorkmids per year)!
>
>This document specifies a draft proposal for a standardized brainfuck as
>worked out by the non-existant subcommitee XYZZY-1234.
>
>Meetings are held every first Kermet-The-Frog-Day of a month. Registration
>costs are 420 Zorkmids.
>
>ENSI Brainfuck
>~~~~~~~~~~~~~~
>
>0. Overview of the language Brainfuck
>    There's an array a and a pointer p.
>    Brainfuck has eight standard commands: + - > < [ ] , .
>    Use of any other characters in a brainfuck source file results in
>    undefined behaviour.
>
>1. Array-Size
>    The array-size is implementation-dependant.
>
>2. Pointer and Array-Element initializations.
>    The initial pointer and array-element values are
>    implementation-dependant.
>
>3. The '+' command
>    Use of the '+' command results in undefined behaviour.
>
>4. The '-' command
>    Use of the '-' command results in implemenation-dependant behaviour.
>
>5. The '>' command
>    Use of the '>' command results in undefined behaviour.
>
>6. The '<' command
>    Use of the '<' command results in undefined behaviour.
>
>7. The '.' command
>    Use of the '.' command results in implemenation-dependant behaviour.
>
>8. The ',' command
>    Use of the ',' command results in undefined behaviour.
>
>9. The '[' command
>    Use of the '[' command results in undefined behaviour.
>
>10. The ']' command
>    Use of the ']' command results in undefined behaviour.
>
>
>I hope this will let us work together on common interests in brainfuck in
>the future.
>
>Markus





------------------------------

Date: Mon, 27 Aug 2001 05:10:37 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: [OS] [ESO] other approaches


For the screen, I'd go with VT-100 escape sequences, limited to those that
ANSI knows about.. then choose another type of escape sequence (like
printers do) for the rest.  Can't have it too simple ;)

Congrats on the VM.. be sure to keep notes so that it can be diplicated
for other processors :)

I've been thinking about the GUI scaling problem and I think I'm close to
a breakthrough on that.. I'll post when I figure it out.

As far as what needs to be in the API.. I have a basic program that
implements windows and menus.. the functions there are probably a good
start.

Jeff

On Sun, 26 Aug 2001, Chris Pressey wrote:

> I have two alternate approaches in mind for an esoteric operating
> system.
>
> One which I'm persuing, sort of, is to build an entire (emulated)
> esoteric computer, based on one of my all-time favourite chips, the
> 6502.  I found some emulator code and an assembler and have built a very
> rudimentary virtual machine.  The only thing I've really put in it so
> far is a memory-mapped screen implemented with curses.  And a
> single-keystroke keyboard buffer (I'll have to improve that.)  I'm
> debating with myself if or how or why I want to implement memory paging
> and colour graphics in a portable manner.  Anyway, almost all of this is
> on the abstraction level of emulated hardware, so there'd only be a very
> small amount of 6502 code in the actual 'kernel' - pretty much just a
> language compiler, which would serve as the API, and command line
> interface for it.  Then the rest of the user interface could be
> developed in that.
>
> The other, more interesting approach is almost completely the opposite.
> The idea is to write a ENSI standard for "ESOTERIX" compatibility.  A
> lot like POSIX.  (Some would argue that POSIX is already pretty
> brain-damaged.  But I still feel we could do better :)  And then,
> various operating systems could be developed with their various
> different approaches, but they could all comply with ESOTERIX through
> use of extensions or compatibility layers or whatnot.
>
> What I would like to see put in to an ESOTERIX standard is the idea of
> being able to inspect and manipulate operating system data by use of
> just the standard input and output channels through use of escape
> sequences.  Yes, Panu is right that ioctl is a better abstraction, but I
> think he misunderstands me - there is no other abstraction available
> that doesn't basically disrupt a bunch of esoteric languages - I mean,
> how else can one put syscalls in Brainfuck without changing the language
> by adding new instructions, disturbing the beautiful symmetry and making
> it even more fat?  And Brainfuck is surely not the only esoteric
> language with this limitation.
>
> After Befunge-98 and it's awkward attempts to look at and/or affect
> system data with the 'y' instruction, I think I've learned the lesson
> that, at least for the sake of toy-language-developer-simplicity,
> operating system stuff should be exposed by the operating system and NOT
> by the language.  And in the case of language interpreters for other
> platforms, like Unix or Windows, the language developer has the option
> of implementing ENSI ESOTERIX hirself; if we got ambitious, ENSI could
> even distribute libraries containing the revelant functions for parsing
> the stdio streams and handling the various requests.  ESOTERIX could act
> something like a 'thin interface' between the language and the syscalls,
> and as a 'sandbox' or 'bastion' too.
>
> Your opinions on these matters are always welcome of course.
>
> Chris
>
>



------------------------------

Date: Mon, 27 Aug 2001 05:10:19 -0700
From: "Daniel." <voice@teleport.com>
Subject: [lang] Re: various

>How about brainf&#117;ck?

Hey, that's good. And assuming the netnannies work with the HTML and 
don't interpret it too much themselves, it should pass inspection.

>However, the implementation must ensure that the end user (tm) of the
>program somehow becomes aware of the current thing.

Wow. Although "end user (tm)" is undefined within the document, if it 
has anything like its colloquial meaning, this is an impossible 
requirement.

>I'm not very interested
>in writing bf programs nowadays, though: the representations of various
>things in bf are self-evident for anybody who has programmed in any
>"common" programming language,

Okay, but are the most concise ways to do things also self-evident? 
Personally I think I have more to learn from the language; if you 
don't, congratulations.

>the "," and "." instructions are ugly,

Hmm. De gustibus non whatever.

>the original specification leaves so much of the memory model unspecified
>that it has fueled over 10 completely pointless discussions which I have
>seen (array semantics, integer semantics &c).

Fair enough. That is something of a weakness. Those things should be 
marked as implementation-dependent or parameterized where convenient, 
and not relied on unnecessarily when writing brainfuck programs.

>Chris made a good point about this once: he censored it on his pages to
>avoid the pages being marked as adults-only in search machines etc.

I've granted he had a point there. I hadn't thought of it.

>Just to point
>out that this is not because I have difficulties using the word, I insert
>it here a couple of times: fuck, fuck, fuck, fuck, fuck.

(laughing)
-Daniel.




------------------------------

From: Steve Mosher <goat@isn.net>
Subject: [lang] Re: [BF] BFmin1, and a plea to list members
Date: Mon, 27 Aug 2001 09:25:58 -0300

On Sunday 26 August 2001 20:57, Chris Pressey wrote:
> "Daniel." wrote:
> > And now, to everyone on this list: please please think twice before
> > improving brainfuck.
>
> Consider it done  :)  This is also a reason to agree on a
> syscall-through-stdio standard... so we don't have to "improve"
> Brainfuck with extra syscall instructions.

Funny, I've been joking with people on IRC for about a month about "BeFucked" 
or "BrainFunge" - a Befunge/Brainfuck hybrid.

-- 
Steve Mosher,
Mad Scientist




------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [LIST-META][Various] Pornolize! (I did this just to get a [SPAM] attac
Date: Mon, 27 Aug 2001 15:23:13 +0100

LIST-META #1:
Whats up? So much traffic in one day? Got 59 posts. Yes Panu, I'm getting
everything double, because I mistakenly subscribed to lang & misc. But I
will spare you a discussion about that, because here is LIST-META #2:
Why do I get [SPAM], and even Re: [SPAM] Re: [SPAM]? Speaking of that, and
of the obnocious (**) F#? (*) in "brainfuck", check out

http://www.pornolize.com

Do it. I'll wait. Just type in an URL (such as Slashdot), and press
"Pornolize!". Go ahead, its good clean fun.

Chris pressey wrote:
> implement memory paging and colour graphics in a portable manner.
In a computer science course, we did a memory paging algorithm once that
utilized the serial port: you can switch the memory from outside. That is
excellent, because it keeps the ESO user busy. And, we can sell cheap
hardware for big $$$ that does the memory bank switiching automatically,
just like Apple does.

> What I would like to see put in to an ESOTERIX standard is the idea of
> being able to inspect and manipulate operating system data by use of
> just the standard input and output channels through use of escape
> sequences.
Good idea!

Frederic van der Plancke [fvdp@decis.be] wrote:
> about to bugs in bf-cgi.
Thanks, I fixed them. Should be OK now.

Daniel wrote:
> won't bother. But I will note quickly that you have + and >
> interchanged in the interpreter. Also your first example program
> shouldn't work, either before or after fixing that interpreter bug.
The example program on the site doesn't, but the downloadable fibonacci
(50K) does (it has + and > interchanged, too). Its output reads

Cells from 0..10 read: [0, 55, 89, 0, 0, 0, 0, 0, 0, 0]

where cell 1 is the 10th fibonacci number. I've fixed the documentation: it
is now officially switched. BFmin2 works similiarily, except to the +/>
thingy.

> please think twice before improving brainfuck.
OK, I'll call it brainfork then, which also solves the second problem with
the F#? word.

You'll be pleased to know that the next language I'm working on is a pun on
Perls "There is more than one way to do it" and will probably be called
"There is more than around 121+-4 ways to do it". This language will also be
not available for download, only for rent: my part in that whole ASP thing,
and yes, it will be like a very drugged out COBOL, with APL artefacts (**)
in it.



(*) Amiga-Style wildcard
(**) if that word exists



------------------------------

Date:	Mon, 27 Aug 2001 15:52:22 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: Bag language

On Mon, 27 Aug 2001, Panu A Kalliokoski wrote:

> On Fri, 24 Aug 2001, Orjan Johansen wrote:
>
> > If (s) is the number of distinct symbols, let the number of tokens Left
> > and Right represent the tape to the left and right as integers using ba=
se
> > (s) notation.  Also Current for the value on the tape at the current
> > point.
>
> Okay - this was the bit I wasn't able to come up with by myself: how to
> represent the infinite tape in a data model without references. I didn't
> think about the fact of Turing Machines' alphabets being finite. Thank
> you.

You don't really need them to be finite, it is possible to code stacks or
lists of unbounded integers in a single integer as well.  One such way is
the "product of prime powers" correspondence between Bag and the fraction
list I mentioned in my original Bag message.

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date: Mon, 27 Aug 2001 10:24:50 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Chris Pressey wrote:
> John Colagioia wrote:
[...]
> > > Going on capabilities alone, the Turing
> > > Machine has a capability that the other languages don't have and can't
> > > simulate - unbounded dynamic memory.  That would seem to imply that the
> > > other languages are less powerful than Turing Machines and therefore not
> > > Turing-Complete.
> > Pretty much.  They're all that "borderline complete" category that I
> > mentioned as uninteresting way-back-when.
> This is the point where I usually wish there was some sort of metric,
> even if it was necessarily somewhat arbitrary, like a Beaufort scale.

Hm.  OK, then I hereby propose the Clytelidhampstone Benchmark for
programming languages (to go with Whetstone and Dhrystone, obviously; 
and it's a "soft c," incidentally).  It's simply the ratio of the
growth rate of programs (in the language) to solve a given NP-Complete
problem (any will do, as all NP-Complete problems can be proven
equivalent) to the product of the problem growth-rate ("n") and the
maximum problem size solvable in the language.  Or, rather, the limit
of this ratio as the problem size approaches infinity.

A Turing Machine, for example, has (if we let "inf" stand for the
largest possible natural number) a Clytelidhampstone rating of
approximately (k)/(n*inf) = 0 (where k is some finite constant).  That
is, a Turing Machine with a specific, known number of states can
calculate (for example) the knapsack problem of any size.

I would imagine that BrainF*** (since "anyone can figure out what's
being censored," I propose those offended by the censorship exercise
that mental capacity, and everyone censor it differently), when
specified to use specific memory ranges and the like, has a
Clytelidhampstone rating of (n!)/(n*sqrt(memsize)) =
(n-1)!/(sqrt(memsize)) or so, which is definitely nonzero.
Essentially, because arbitrary-sized integers can't exist in BrainF***
(unless that's pretty much the only thing in memory, at least...), the
code must be enlarged to handle additional words in each number, which
decreases the size of memory altogether as well as increasing the size
of the overall program.

beta-Juliet would share traits of both examples, as it grows very
rapidly, with no limit on problem size.  Something like (2^n)/(n*inf) =
2^(n-1)/(inf), which is not necessarily defined, as we don't know the
nature of the non-finite value in the denominator.  I'd guess the final
value to be unity (1), though, just because that has a certain elegance
to it.

There are certainly better ways of going about this, but I've been away
from the pure theoretical end of things too long to work it through.

The TrapperKeeper-2000, of course, has a negative rating...

[...]



------------------------------

Date: Mon, 27 Aug 2001 10:36:35 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: [BF] Liposuction your fat syntax

On Sun, 26 Aug 2001, Brian Raiter wrote:
[...]
> I think you missed his point.... IF it is impossible to write a
> program in the language that consumes storage endlessly, THEN the
> Halting problem *can* be solved by simulation. (Because there can only
> be a finite number of states that a program can be in, a program that
> runs forever must, at some point, return to a state that it was in
> previously. And thus a simulator that keeps track of every state the
> program enters and stops if it enters a state it has seen before is
> guaranteed to terminate.)

Except that this isn't the case.  It doesn't take Turing Completeness
to write out digits of pi, for example, yet that program will never
terminate, and will never return to an identical state.  And you can't
"exclude" parts of the state, because that would be based on knowledge
from outside the program, which the Halting Problem is not permitted to
have.





------------------------------

Date: Mon, 27 Aug 2001 10:45:47 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: [SPAM?] RE: Re: [BF] Liposuction your fat syntax

On Mon, 27 Aug 2001, Orjan Johansen wrote:
[...]
> > Note, incidentally, that with clever use of STASH/RETRIEVE and array-
> > resizing, INTERCAL-as-specified (not -as-implemented, of course) may
> > very well have infinite memory, assuming the stack depth and maximum
> > array sizes are unspecified (I fear the former may be, but probably not
> > the latter).
> Indeed, array indices cannot be more than 32-bit unsigned integers, so you
> can look at all the dimensions of variables mentioned in the program and
> calculate an explicit upper bound on unstashed memory.

Actually, I don't believe the *language* is ever specified to overflow
values, except when assignment might be involved.  That is, while any
implementation will reject (2^31)$(2^31), I'm not sure that the
compiler or interpreter is required to reject it.

> I guess STASH/RETRIEVE gives Intercal the power to simulate any
> deterministic pushdown automaton.

Well, kind of.  On the bright side, you have two (or more) stacks,
which effectively gives you a Turing-like tape.  On the downside,
though, I believe the stack depths are all specified to be 80 items.
Ick.





------------------------------

Date: Mon, 27 Aug 2001 10:49:03 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: [BF] Liposuction your fat syntax

On Mon, 27 Aug 2001, Panu A Kalliokoski wrote:
[...]
> > Another approach at language minimalism:
> > INSTRUCTION #1 - Rotate the INSTRUCTION #2 semantics.
> > INSTRUCTION #2 - Execute one of ('>','+','[')
> Still another:
> Inst #1 - add high bit to bit stream
> Inst #2 - add low bit to bit stream
> Interpret the bit stream as 6502 machine code. You can't go under two
> instructions, however...

URISC and OISC both do.  I'll grant you that they're *compound*
instructions, but they're instructions nonetheless.

Actually, there is one other possibility.  The only instruction is the
NOP.  The number of NOPs is a unary representation of the Godel number
of "canonical programs" (generated from whatever language you care to
choose).  When the program terminates, execute that program.

[...]





------------------------------

Date: Mon, 27 Aug 2001 11:01:44 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: Re: [SPAM?] Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat synta

On Mon, 27 Aug 2001, Panu A Kalliokoski wrote:
[...]
> I know, I'm not looking for a description, but rather some quick tests
> which could prove a given system TC / not TC.

Again, the problem is that there isn't a set of tests, except for "all
computable functions."  The easiest and most practical test is:  "Can
it simulate one of the 'big three' known Turing-Complete systems?" 

> > The hard way is to learn about Primitive Recursive Functions, NP
> > problem mapping, and all that other spooky stuff that few books touch
> > upon, and actually map the old system's "features" into the new.
> /Hard/ way?

Have you looked at Primitive Recursion (big 'p,' big 'r')?  It's not
functional programming, which is probably what you're thinking of.  In
fact, "Primitive Recursion" has very little to do (at that level, at
least)  with "software recursion," when you get right down to it.  This
refers more to "recursive sets," which are sets that can be defined by
a mathematical function.

> I think Turing Machines are an ugly kludge to be able to
> practically automate the expressive power of nice, simple, T-C systems
> like lambda calculus. Most all of the properties of Turing Machines are
> proven by showing Turing Machines equivalent to lambda calculus, and then
> proving the properties in lambda calculus.

Oddly, not in any of the books I've got.  They all use (basically)
Turing's approach of language acceptance.  Start with finite state
machines, add a stack, add a second stack.  Poof.  A machine that can
accept any grammar-specifiable language.

But, I think you misinterpreted me, anyway.  The Lambda Calculus,
Turing Machines, and Phrase Structure (or semi-Thue) grammars have all
been proven to have the same computational ability.  Which one is
chosen is irrelevant.

However, I think you'll agree that, in most systems, simulating a state
machine isn't that hard, meaning that the Turing Machine is a good way
to go.



------------------------------

Date: Mon, 27 Aug 2001 09:17:56 -0700
From: Brian Raiter <breadbox@muppetlabs.com>
Subject: [lang] Re: [SPAM?] RE: Re: [BF] Liposuction your fat syntax

>>> Note, incidentally, that with clever use of STASH/RETRIEVE and array-
>>> resizing, INTERCAL-as-specified (not -as-implemented, of course) may
>>> very well have infinite memory, assuming the stack depth and maximum
>>> array sizes are unspecified (I fear the former may be, but probably not
>>> the latter).
>> Indeed, array indices cannot be more than 32-bit unsigned integers, so you
>> can look at all the dimensions of variables mentioned in the program and
>> calculate an explicit upper bound on unstashed memory.
> 
> Actually, I don't believe the *language* is ever specified to
> overflow values, except when assignment might be involved.

Array sizes are specified via assignment.

> That is, while any implementation will reject (2^31)$(2^31), I'm not
> sure that the compiler or interpreter is required to reject it.

From the INTERCAL manual: "Constants are 16-bit values only and may
range from 0 to 65535." And this is the description of error 533: "A
WRITE IN statement or interleave ($) operation has produced a value
requiring over 32 bits to represent."

I think that makes it clear.

> > I guess STASH/RETRIEVE gives Intercal the power to simulate any
> > deterministic pushdown automaton.
> 
> Well, kind of.  On the bright side, you have two (or more) stacks,
> which effectively gives you a Turing-like tape.  On the downside,
> though, I believe the stack depths are all specified to be 80 items.
> Ick.

The NEXT/RESUME stack is specified to have a depth of 80 items, but
the STASH/RETRIEVE stack has no required limit, and there is no error
message in INTERCAL for indicating an overflow of the latter. I'm
fairly certain that this gives Turing-completeness.

b




------------------------------

Date: Mon, 27 Aug 2001 09:27:41 -0700
From: Brian Raiter <breadbox@muppetlabs.com>
Subject: [lang] Re: [BF] Liposuction your fat syntax

>> I think you missed his point.... IF it is impossible to write a
>> program in the language that consumes storage endlessly, THEN the
>> Halting problem *can* be solved by simulation. (Because there can
>> only be a finite number of states that a program can be in, a
>> program that runs forever must, at some point, return to a state
>> that it was in previously. And thus a simulator that keeps track of
>> every state the program enters and stops if it enters a state it
>> has seen before is guaranteed to terminate.)
> 
> Except that this isn't the case.  It doesn't take Turing
> Completeness to write out digits of pi, for example, yet that
> program will never terminate, and will never return to an identical
> state.

Then clearly it can consume storage endlessly.

There must be some misunderstanding here; this shouldn't be a
controversial point. Given a program that can produce any number of
digits of pi, with no upper constraint, then clearly there can be no
upper limit on the number of machine states an implementation of said
program could be in. It's just the pigeonhole principle in action.

b




------------------------------

Date: Mon, 27 Aug 2001 13:01:51 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: [BF] Liposuction your fat syntax

On Mon, 27 Aug 2001, Brian Raiter wrote:
[...]
> > Except that this isn't the case.  It doesn't take Turing
> > Completeness to write out digits of pi, for example, yet that
> > program will never terminate, and will never return to an identical
> > state.
> Then clearly it can consume storage endlessly.

Not necessarily.  It can produce the "nth" digit without bothering to
store them.

> There must be some misunderstanding here; this shouldn't be a
> controversial point. Given a program that can produce any number of
> digits of pi, with no upper constraint, then clearly there can be no
> upper limit on the number of machine states an implementation of said
> program could be in. It's just the pigeonhole principle in action.

This is true, in itself.  However, it does not mean that a program
which has a finite number of states must traverse them in a predictable
pattern.

For example, if I need to (for example) write a program that finds the
first occurrence of my telephone number in the hexadecimal expansion of
pi, I could use the Bailey-Borwein-Plouffe
(http://www.mathsoft.com/asolve/plouffe/plouffe.html) to find
consecutive sets of ten hex digits, and compare them to the telephone
number, until there's a match.

Despite the fact that this is an extremely short program with a minimal
"memory usage footprint" and a very small number of possible states
(2^40 worth examining, to be precise) there is no algorithm which can
predict nontermination, since nontermination can only be found by
exhausting the entire (infinite) list of hex digits of pi.

As you said, this should be pretty far from a controversy.  One or more
of us is missing something.  It could very well be me, but I
(naturally) don't see what it is I might be missing.





------------------------------

Date: Mon, 27 Aug 2001 19:11:42 +0200
From: Frederic van der Plancke <fvdp@decis.be>
Subject: [lang] Re: [BF] Liposuction your fat syntax



John Colagioia wrote:
> 
> On Mon, 27 Aug 2001, Brian Raiter wrote:
> [...]
> > > Except that this isn't the case.  It doesn't take Turing
> > > Completeness to write out digits of pi, for example, yet that
> > > program will never terminate, and will never return to an identical
> > > state.
> > Then clearly it can consume storage endlessly.
> 
> Not necessarily.  It can produce the "nth" digit without bothering to
> store them.

But you need to store somewhere at least the _index_ of the next
digit to print. That index is unbounded so storing it will consume
an unbounded amount of memory. (Of course for practical purposes
you may assume you won't compute more than 
1,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
digits of pi before your hardware dies.)

Frédéric vdP





------------------------------

Date: Mon, 27 Aug 2001 19:20:10 +0200
From: Frederic van der Plancke <fvdp@decis.be>
Subject: [lang] Re: Bag language

Panu A Kalliokoski wrote:
> 
> On Fri, 24 Aug 2001, Orjan Johansen wrote:
> 
> > If (s) is the number of distinct symbols, let the number of tokens Left
> > and Right represent the tape to the left and right as integers using base
> > (s) notation.  Also Current for the value on the tape at the current
> > point.
> 
> Okay - this was the bit I wasn't able to come up with by myself: how to
> represent the infinite tape in a data model without references. I didn't
> think about the fact of Turing Machines' alphabets being finite. Thank
> you.
> 
> This just goes off to show that the lack of arbitrary-length integers in
> referenceless languages like beta-Juliet is crucial.
> 
> > > Add order, and you've got a semi-Thue grammar.
> >
> > I suspected something like that.  I only saw mention of Thue before
> > posting that message, although I have now found a description.
> 
> Yes. (Semi-)Thue grammars is a very interesting subject, but I haven't had
> time to study it thoroughly. Some "esoteric" references include:
> 
> http://www.catseye.mb.ca/esoteric/thue/index.html
> (mixed with other stuff) http://fvdp.homestead.com/files/eso_index.html
> 
> > Of course, I think the lack of order adds to the flavor of the language.

Yes, the lack of token order adds flavour, and 'Bag' is a very nice
language (the rational-number thing is a nice obfusaction of that
language, too. I may want to implement that along with a translator
from Bag to that...)

But you [Orjan] order the rules (and your Turing Machine implementation
relies on deterministic rule application, AFAIK). Do you know if Bag remains
Turing-complete when applicable rules can be applied in any order ?

The 'Thue' language is undeterministic and I definitely find that one
of its nice features (semi-Thue grammars are probably undeterministic too,
but I never studied them formally anyhow. Do you have pointers ?)

Panu wrote:
> It sure does. Semi-Thue grammars feel highly abstract compared to Bag.

But the 'Thue' language is as concrete as Bag, IMO, since it's just
string rewriting.

> 
> Panu Kalliokoski

Frédéric vdP





------------------------------

Date: Mon, 27 Aug 2001 15:41:00 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [BF] Liposuction your fat syntax

Brian Raiter wrote:
> 
> >> I think you missed his point.... IF it is impossible to write a
> >> program in the language that consumes storage endlessly, THEN the
> >> Halting problem *can* be solved by simulation. (Because there can
> >> only be a finite number of states that a program can be in, a
> >> program that runs forever must, at some point, return to a state
> >> that it was in previously. And thus a simulator that keeps track of
> >> every state the program enters and stops if it enters a state it
> >> has seen before is guaranteed to terminate.)
> >
> > Except that this isn't the case.  It doesn't take Turing
> > Completeness to write out digits of pi, for example, yet that
> > program will never terminate, and will never return to an identical
> > state.
> 
> Then clearly it can consume storage endlessly.
> 
> There must be some misunderstanding here; this shouldn't be a
> controversial point. Given a program that can produce any number of
> digits of pi, with no upper constraint, then clearly there can be no
> upper limit on the number of machine states an implementation of said
> program could be in. It's just the pigeonhole principle in action.

I think the problem may be (correct me if I'm wrong) that there can be
no function or program which both consumes storage endlessly and halts. 
Of course this might just point to a mathematical bias towards programs
that don't exist in livelock... the Turing Machine is expected to take a
question and return with an answer with no interaction in the meantime. 
Real software doesn't typically work like that.  If a program must halt
to be 'correct' then there is no difference between an infinite tape and
one that is fininte but 'big enough'.  If not, there is a practical
difference.

Chris




------------------------------

Date: Mon, 27 Aug 2001 15:44:46 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [SPAM?] Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat synta

John Colagioia wrote:
> Have you looked at Primitive Recursion (big 'p,' big 'r')?  It's not
> functional programming, which is probably what you're thinking of.  In
> fact, "Primitive Recursion" has very little to do (at that level, at
> least)  with "software recursion," when you get right down to it.  This
> refers more to "recursive sets," which are sets that can be defined by
> a mathematical function.

This is where the Russell Set lives, correct?

> > I think Turing Machines are an ugly kludge to be able to
> > practically automate the expressive power of nice, simple, T-C systems
> > like lambda calculus. Most all of the properties of Turing Machines are
> > proven by showing Turing Machines equivalent to lambda calculus, and then
> > proving the properties in lambda calculus.
> 
> Oddly, not in any of the books I've got.  They all use (basically)
> Turing's approach of language acceptance.  Start with finite state
> machines, add a stack, add a second stack.  Poof.  A machine that can
> accept any grammar-specifiable language.

But that's not a proof.  That's a poof.  :)

Chris


------------------------------

Date: Mon, 27 Aug 2001 15:52:22 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [LIST-META][Various] Pornolize! (I did this just to get a [SPAM] 

Gerson Kurz wrote:
> LIST-META #1:
> Whats up? So much traffic in one day? Got 59 posts.

I actually got more traffic from this list than from all the other lists
I belong to, today.  Hooray!

> Why do I get [SPAM], and even Re: [SPAM] Re: [SPAM]?

Some mailserver adds that to anything that's missing a certain mail
header, I forget which exactly.

> In a computer science course, we did a memory paging algorithm once that
> utilized the serial port: you can switch the memory from outside. That is
> excellent, because it keeps the ESO user busy. And, we can sell cheap
> hardware for big $$$ that does the memory bank switiching automatically,
> just like Apple does.

Woo-hoo!  Serial bus RAM.  I like it.

> You'll be pleased to know that the next language I'm working on is a pun on
> Perls "There is more than one way to do it" and will probably be called
> "There is more than around 121+-4 ways to do it". This language will also be
> not available for download, only for rent: my part in that whole ASP thing,
> and yes, it will be like a very drugged out COBOL, with APL artefacts (**)
> in it.

How much are you going to charge for rent?

The license for my next language is going to stipulate that it is
totally free to be used by anyone.... anyone that names their first-born
after me, that is.

Chris


------------------------------

Date: Mon, 27 Aug 2001 15:54:56 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [lang] Re: [BF] BFmin1, and a plea to list members

Steve Mosher wrote:
> On Sunday 26 August 2001 20:57, Chris Pressey wrote:
> > "Daniel." wrote:
> > > And now, to everyone on this list: please please think twice before
> > > improving brainfuck.
> >
> > Consider it done  :)  This is also a reason to agree on a
> > syscall-through-stdio standard... so we don't have to "improve"
> > Brainfuck with extra syscall instructions.
> 
> Funny, I've been joking with people on IRC for about a month about "BeFucked"
> or "BrainFunge" - a Befunge/Brainfuck hybrid.

I don't think hybrids should necessarily be avoided, just hopelessly
derivative versions of Brainfuck like Doublefuck.

Chris


------------------------------

Date: Mon, 27 Aug 2001 15:59:40 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: Re: [OS] [ESO] other approaches

Panu A Kalliokoski wrote:
> 
> On Sun, 26 Aug 2001, Chris Pressey wrote:
> > The other, more interesting approach is almost completely the opposite.
> > The idea is to write a ENSI standard for "ESOTERIX" compatibility.  A
> > lot like POSIX.  (Some would argue that POSIX is already pretty
> > brain-damaged.  But I still feel we could do better :)  And then,
> 
> This is a very good approach. But the standard should be a "proper"
> standard, because arbitrary obfuscations are very tiresome to implement.

I agree, at least 80% of the way.  Some obfuscation should still be
there, but hidden under a veil of elegance  :)

> You're correct about the importance of the stream abstraction for
> a couple of languages. Still, rather than to define escape sequences for
> various "method-like" services the files provide, make a pure
> control-stream bound to stdin and stdout, through which different
> messages, like POSIX calls or something equivalent, can be multiplexed.

Understood - the reason for an 'escape sequence' is so that existing
Brainfuck (et al) code can be used without breaking it horribly.  It
might be as simple as issuing a ^E to the standard output (which I'm
going to assume is pretty rare right now) to switch to 'ENSI ESOTERIX
stream' mode.  I don't think there should be escape characters sent
every time, just once at the beginning to activate the interface.

Chris


------------------------------

Date: Mon, 27 Aug 2001 15:47:50 -0700 (MST)
From: Jeff  Johnston <jeffryj@azstarnet.com>
Subject: Re: [lang] Re: [BF] Liposuction your fat syntax



On Sun, 26 Aug 2001, Chris Pressey wrote:

> Orjan Johansen wrote:
> > For example, while programming Intercal recently, I noted that it is not
> > Turing complete either, despite the fact that you can easily define arrays
> > with more entries than there are atoms in the known universe.  The reason
> > is that you cannot arbitrary enlarge those arrays in a fixed program...
>
> If that's the case, I should note that many BASICs aren't
> Turing-Complete, either.
>
> Thanks for pointing that out.  Now I have a purely mathematical reason
> to hate my day job.

No REDIM in BusinessBasic?  Even BasicA has REDIM..

Jeff (who loves his PDS 7.0 Basic, even tho theres a 7.1)



------------------------------

Date:	Tue, 28 Aug 2001 02:42:17 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [SPAM?] RE: Re: [BF] Liposuction your fat syntax

On Mon, 27 Aug 2001, John Colagioia wrote:

> On Mon, 27 Aug 2001, Orjan Johansen wrote:

> > I guess STASH/RETRIEVE gives Intercal the power to simulate any
> > deterministic pushdown automaton.
>
> Well, kind of.  On the bright side, you have two (or more) stacks,
> which effectively gives you a Turing-like tape.

Yes, I realized this after I went to bed, so I was speaking nonsense.
Intercal _is_ Turing-complete, then, for suitably obfuscated reasons.

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date:	Tue, 28 Aug 2001 02:38:54 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [BF] Liposuction your fat syntax

On Mon, 27 Aug 2001, John Colagioia wrote:

> On Sun, 26 Aug 2001, Brian Raiter wrote:
> [...]

> Except that this isn't the case.  It doesn't take Turing Completeness
> to write out digits of pi, for example, yet that program will never
> terminate, and will never return to an identical state.  And you can't
> "exclude" parts of the state, because that would be based on knowledge
> from outside the program, which the Halting Problem is not permitted to
> have.

I never claimed my condition was sufficient for Turing completeness, only
that it is necessary.

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date:	Tue, 28 Aug 2001 04:52:20 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: Bag language

On Mon, 27 Aug 2001, Frederic van der Plancke wrote:

> But you [Orjan] order the rules (and your Turing Machine implementation
> relies on deterministic rule application, AFAIK). Do you know if Bag rema=
ins
> Turing-complete when applicable rules can be applied in any order ?

Interesting question.  I doubt it, given the linearity of the operations.

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date: Tue, 28 Aug 2001 09:32:34 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Bag language

On Tue, 28 Aug 2001, Orjan Johansen wrote:

> On Mon, 27 Aug 2001, Frederic van der Plancke wrote:
>
> > But you [Orjan] order the rules (and your Turing Machine implementation
> > relies on deterministic rule application, AFAIK). Do you know if Bag remains
> > Turing-complete when applicable rules can be applied in any order ?
>
> Interesting question.  I doubt it, given the linearity of the operations.

I claim it is, because you can always add "sequence tokens" to mark which
operations are permitted when. To retain state, just write that state back
to the bag in the rule; to change state, write some other state to the
bag.

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date:	Tue, 28 Aug 2001 08:55:05 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: Bag language

On Tue, 28 Aug 2001, Panu A Kalliokoski wrote:

> On Tue, 28 Aug 2001, Orjan Johansen wrote:
>
> > On Mon, 27 Aug 2001, Frederic van der Plancke wrote:
> >
> > > But you [Orjan] order the rules (and your Turing Machine implementati=
on
> > > relies on deterministic rule application, AFAIK). Do you know if Bag =
remains
> > > Turing-complete when applicable rules can be applied in any order ?
> >
> > Interesting question.  I doubt it, given the linearity of the operation=
s.
>
> I claim it is, because you can always add "sequence tokens" to mark which
> operations are permitted when. To retain state, just write that state bac=
k
> to the bag in the rule; to change state, write some other state to the
> bag.

Hm... that is already needed in the ordered version.  What I don't see how
to achieve without order is getting around the need to have some actions
only apply when certain tokens are _absent_.

E.g. the way multiplication works so far is by moving all of the Y-tokens,
copying them to the Z-tokens, and only when all the Y-tokens are used up
is it allowed to restart the loop with one less X-token.

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date: Tue, 28 Aug 2001 10:14:17 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Bag language

On Tue, 28 Aug 2001, Orjan Johansen wrote:

> Hm... that is already needed in the ordered version.  What I don't see how
> to achieve without order is getting around the need to have some actions
> only apply when certain tokens are _absent_.

Understood. I should have seen the similarity between this and the need
for absence-rules in indeterministic graph-rewriting languages.

Panu






------------------------------

Date: Tue, 28 Aug 2001 10:34:38 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [SPAM?] Re: [ML] [long] OO, type systems

On Fri, 17 Aug 2001, Chris Pressey wrote:
> In (my) ideal world, it would be a local issue, and in the ideal
> implementation the checks would be performed statically when that's
> possible, dynamically when it's not.

However, you need to know about the language's type system in order to
understand how the language works, so the type system must be considered a
part of the language. Because of this, it's sensible to make as strong
(representationally powerful) a type system as one can: the part of checks
that can be performed statically is very dependent on the expressiveness
of the type system.

Also, I consider it valuable information to know when a type violation
gets caught. It'll save me a lot of trouble. And I don't like the idea of
the compiler being too "magic" wrt type-checking: if, for example, it
features some limited form of execution simulation to find type violations
statically, I get the feeling that I can't ever know whether I should
proof-read some piece of code myself or let the compiler do it.

> It will fail, but if you have *planned* for failure (catch/throw), that
> is not necessarily a bad thing.  The Erlang approach is to avoid writing
> "error clauses" into a function, and to simply let unmatched arguments
> fail and let that failure be caught by the caller.  This is an approach
> that is in some ways the opposite of strong typing, some call it
> "fault-tolerant" programming.

This sounds like they're moving the responsibility of the compiler (to
find expressions that are guaranteed to fail) to the programmer (to write
code to catch those guaranteed failings). But maybe you didn't talk about
the type violations here anymore.

The point that makes me frown at this approach is that there are many
kinds of faults: those that arise from bugs in service code, those that
arise from bugs in user code, those that arise from special values of
arguments (eg. divide by zero) and those that arise from special
conditions (very vague definition). IMO in most of the cases faults that
are caused by bugs should be caught as early as possible and in the ideal
world you don't have to write extra code to find those.

> I used to be greatly in favour of strong typing and optimizing the hell
> out of code to make it as small and as fast as possible.  And I still

I just like the language to be so that an optimising (strongly typed)
compile/semicompile process is possible. I'm not very much in favor of
optimising locally - I think that's the job of the compiler.

> am, for firmware.  But for software on modern-day machines, I'm not sold
> on it anymore.  Run-time type checking definately has flexibility
> benefits.

Maybe I'm just die-hard, but I don't see much difference between using
Python objects and Ocaml objects (except for the syntax).

Panu






------------------------------

Date: Tue, 28 Aug 2001 10:42:55 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [BF] TC conditions

On Mon, 27 Aug 2001, John Colagioia wrote:

> Except that this isn't the case.  It doesn't take Turing Completeness
> to write out digits of pi, for example, yet that program will never
> terminate, and will never return to an identical state.  And you can't

This cannot be true. You probably understand "state" differently from how
I understand it (it does have many meanings, so that's probably no
wonder). For mathematical purposes like this, I define state to be "all
that defines the possible next state(s) of the computation". So if the
process never returns to an identical state, it must have an infinite
number of states. And infinite number of states does take infinite memory
/ execution topography / whatever.

Panu

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Tue, 28 Aug 2001 10:46:58 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [SPAM?] Re: [BF] Liposuction your fat syntax

On Mon, 27 Aug 2001, John Colagioia wrote:

> > Interpret the bit stream as 6502 machine code. You can't go under two
> > instructions, however...
>
> URISC and OISC both do.  I'll grant you that they're *compound*
> instructions, but they're instructions nonetheless.

Worse, they're *parametrised* instructions. This means even the one where
the instructions only take one operand (I forget which of the two it was)
has 256 instructions. And besides, they have instructions for initialising
memory state - neither of them is of any use without these, because you
can't make any non-zero number from an infinite number of zeros by
substraction.

> Actually, there is one other possibility.  The only instruction is the
> NOP.  The number of NOPs is a unary representation of the Godel number
> of "canonical programs" (generated from whatever language you care to
> choose).  When the program terminates, execute that program.

Yeah, unless you see end-of-program as an instruction. Many programming
languages (eg Unlambda) don't need EOP to know when to stop.

Panu

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date:	Tue, 28 Aug 2001 09:58:07 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: Preliminary Standard

I note that new ENSI standards are being encouraged.

Since I haven't been taking part in all the discussion on the ENSI OS so
far, I think I am a reasonably unqualified person to make a contribution.
I also think it is time to set forward some basic principles for this
discussion, and so without further ado:


Preliminary guidelines for the ENSI stream-based OS System
----------------------------------------------------------

(O) This preliminary standard shall give guidelines, which apply to
the design of standard ENSI 14.42.21, the Esoteric Non-existing
Standards Institute Obnoxious Service System.

(A) The ENSI OS System is intended to provide general disservice to
any esoteric programming language which has the following minimal
capabilities:
        <Yksi>  The ability to evict to a stream, a number between 0
        and 255, exclusive.
        <Kaksi>  The ability to capture from the same stream, a number
        between 64 and 128, exclusive.
        <Kolme>  The ability to do the above ad nauseam.

(E) As many esoteric languages are limited to one output stream, the
stream is expected to double for standard output use.  To facilite this,
only a part of the possible output numbers will be used to start an
ENSI OS System command, so that the remainder can be used normally as
output characters.
        <Un>  The only output numbers allowed to start an ENSI OS
        System command are those between 64 and 128, exclusive.
        <Deux>  Similarly, requirement (A)K is intended to allow
        the esoteric language to expect ordinary input to continue
        outside the range 64 to 128, exclusive, even while receiving
        data from the ENSI OS System.
        <Troix>  The sole exception to the above is that certain
        commands are permitted to have an _iteration_ prefix,
        consisting of a list of numbers in the range 48 to 57,
        inclusive, interpreted as a number in the decimal system.
        Any number in the range 48 to 57 which does not form such a
        prefix may be sent to standard output as usual.

(I) In order to facilitate communication, all proposals to the ENSI
14.42.21 sub-committee must be available in the English language.
Therefore the following sub-sub-committee is established to provide
translations:
        <Egy> =D8rjan Johansen, from the Norwegian language
        <Kett?> Panu Kalliokoski, from the Finnish language
        <H=E1rom> Gerson Kurz, from the German language
        <Nyelv> Chris Pressey, from the Canadian language

Sometimes (Y) it may be necessary for out-of-band input or output to
continue even in the number range 64 to 128, exclusive.  For this
purpose an escape number is provided.
        <Alpha>  While receiving data from the ENSI OS System, the
        number 64 indicates that the next number be interpreted as a
        normal input character.
        <Beta>  Similarly when sending data to the ENSI OS System, the
        number 64 indicates that the next number be interpreted as a
        normal output character.



------------------------------

Date: Tue, 28 Aug 2001 10:59:10 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [BF] TC conditions

On Mon, 27 Aug 2001, John Colagioia wrote:

> On Mon, 27 Aug 2001, Panu A Kalliokoski wrote:
> [...]
> > I know, I'm not looking for a description, but rather some quick tests
> > which could prove a given system TC / not TC.
>
> Again, the problem is that there isn't a set of tests, except for "all
> computable functions."  The easiest and most practical test is:  "Can
> it simulate one of the 'big three' known Turing-Complete systems?"

Yes, but I think there are many requisites for TC, so proving a system not
to have even any one of those is sufficient to prove the system not TC.
This could be a lot smaller problem than actually proving a system cannot
simulate any one of TC systems. To prove that a system _is_ TC, I agree
with you that the simulation-path might be the easiest one.

> > > The hard way is to learn about Primitive Recursive Functions, NP
> > > problem mapping, and all that other spooky stuff that few books touch
> > > upon, and actually map the old system's "features" into the new.
> > /Hard/ way?
> Have you looked at Primitive Recursion (big 'p,' big 'r')?  It's not

Hmmm, I guess I have. If you mean things like

empty e X; x, y e X <=> tree(x,y) e X; no other things belong to X.

by recursive sets, yes.

> But, I think you misinterpreted me, anyway.  The Lambda Calculus,
> Turing Machines, and Phrase Structure (or semi-Thue) grammars have all
> been proven to have the same computational ability.  Which one is
> chosen is irrelevant.

I know. I just wanted to point out that it might give some clue about what
system is the "hard to use" one and what is the "easy to use" one that
things like fixed point, undecidability, etc. were almost all first proven
in lambda calculus, not virtual Turing Machines.

> However, I think you'll agree that, in most systems, simulating a state
> machine isn't that hard, meaning that the Turing Machine is a good way
> to go.

Yes, just the state machine is not useful for that much.

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi





------------------------------

Date: Tue, 28 Aug 2001 11:15:51 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: Re: [ENSI] Preliminary Standard: comments

On Tue, 28 Aug 2001, Orjan Johansen wrote:

> I note that new ENSI standards are being encouraged.

Thank you for the standard. I'll add it to the repository. (As you can
probably see, ENSI standards are never obsoleted, so your standard is
happy and safe.)

>         <Yksi>  The ability to evict to a stream, a number between 0
>         and 255, exclusive.

exclusive? (Well, it almost makes sense.)

>         <Un>  The only output numbers allowed to start an ENSI OS
>         System command are those between 64 and 128, exclusive.

Are you _really_ sure about this? Wouldn't we break less programs if the
printing characters would be left for output, and all _other_ characters
could be used to start ESO syscalls? (Okay, if the point is not to comply,
then...)

>         <Troix>  The sole exception to the above is that certain
>         commands are permitted to have an _iteration_ prefix,
>         consisting of a list of numbers in the range 48 to 57,
>         inclusive, interpreted as a number in the decimal system.
>         Any number in the range 48 to 57 which does not form such a
>         prefix may be sent to standard output as usual.

This is great. :)

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi




------------------------------

Date: Tue, 28 Aug 2001 12:40:45 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [BF] Befuck, BrainFunge


(Why do so many names of esoteric languages begin with the letter B?)

Befuck:
-------

The program is a 2d playfield consisting of character-sized instructions,
as in BeFunge. The IP may have, at any time, one of four directions: up,
left, right, down. The program has an array similar to the one of (ENSI)
Brainfuck.

Every cycle, the ip gets incremented wrt its direction and then the
current instruction playfield[ipx][ipy] is executed.

Direction	C equivalent
left		ipx--;
right		ipx++;
up		ipy--;
down		ipy++;

Instr	Curr. direct'n	C equivalent	New direction
-	any		a[p]--;		no change
+	any		a[p]++;		no change
<	any		p--;		left
>	any		p++;		right
[	left		if(a[p]) ipx+=(offset of corresponding ']')
]	right		if(a[p]) ipx-=(offset of corresponding '[')
[	up / down	/* nop */	left
]	up / down	/* nop */	right
[	right		/* nop */	if(a[p]) down; else up;
]	left		/* nop */	if(a[p]) up; else down;

All whitespace are nops. The program can be exited by going over its
boundary either by normal execution or by []-jumping.

Here's a dup in Befuck:		Here's a clr (only you can't enter it):

] >+>+ [			[ - ]
] -<<  [

BrainFunge:
-----------

The program is a linear series of instructions. The program has an ip with
a speed, ipd. Every iteration, ip gets incremented by ipd and the
instruction at program[ip] is fetched for execution. The program operates
on a stack s of integers.

The semantics of the commands are as follows:

Instr		C equivalent
1		sp++; s[sp] = 1; /* push 1 */
-		s[sp-1] -= s[sp]; sp--;
<		ipd--;
>		ipd++;
p		s[sp] = s[sp-abs(s[sp])]; /* pick */
s		swap(s[sp-1],s[sp-abs(s[sp])-1]); sp--;
[		if (s[sp]) ipd = 1; else ipd = -1;
]		if (s[sp]) ipd = -1; else ipd = 1;

All whitespace are nops. Comments in parentheses.

Here's mul in BrainFunge (whitespace in the loop _is_ significant):

(x y -- x*y)

11-1- (initialise result to -1)
[> 1 1 - 1 - 1 -s1 --p -11 1-- 11- s11 -<] (loop)
- (drop loop counter)
11-1-11-1-s - (negate and add 1 to result)

Panu

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date:	Tue, 28 Aug 2001 11:51:56 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: ADDENDVM

On Tue, 28 Aug 2001, Panu A Kalliokoski wrote:

> On Tue, 28 Aug 2001, Orjan Johansen wrote:
>
> >         <Yksi>  The ability to evict to a stream, a number between 0
> >         and 255, exclusive.
>
> exclusive? (Well, it almost makes sense.)

Indeed, the excluded numbers are exactly those which have given me trouble
in my Unlambda self-interpreter.

> >         <Un>  The only output numbers allowed to start an ENSI OS
> >         System command are those between 64 and 128, exclusive.
>
> Are you _really_ sure about this? Wouldn't we break less programs if the
> printing characters would be left for output, and all _other_ characters
> could be used to start ESO syscalls? (Okay, if the point is not to comply,
> then...)

Oh dear, I forgot to consider backwards compatibility with the Dumb Stream
System (DSS).

It is of course too much of a change and out of the question to reassign
the numbers used for all ENSI commands.  But fear not:


ADDENDVM to  ENSI standard 14.42.0,
"Preliminary guidelines for the ENSI stream-based OS System"
------------------------------------------------------------

(W) To ease degradation of old esoteric programs to be compatible with
the ENSI OS System, by default Backwards Compatibility Mode (MCB) is
enabled.  In this mode all ENSI OS System Commands operate in the
following way:
        <PRIMVM>  When not followed by the Backwards Compatibility
        Mode Disindicator, the commands are simply passed through to
        standard output.
        <SECVNDVM>  When followed by the Backwards Compatibility Mode
        Disindicator, the commands are interpreted, and Backwards
        Compatibility Mode is permanently disindicated.
        <MINVTVM>  The Backwards Compatibility Mode Disindicator is
        the number 42.



------------------------------

Date: Tue, 28 Aug 2001 08:26:11 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: Re: [SPAM?] Re: [SPAM?] RE: [lang] Re: [BF] Liposuction your fat synta

On Mon, 27 Aug 2001, Chris Pressey wrote:
> John Colagioia wrote:
> > Have you looked at Primitive Recursion (big 'p,' big 'r')?  It's not
> > functional programming, which is probably what you're thinking of.  In
> > fact, "Primitive Recursion" has very little to do (at that level, at
> > least)  with "software recursion," when you get right down to it.  This
> > refers more to "recursive sets," which are sets that can be defined by
> > a mathematical function.
> This is where the Russell Set lives, correct?

I *believe* so.  I've only, alas, had the bare introduction to get
moving into other theory parts, myself.  It was enough, though, to make
a strong distinction between P.R. and "normal" recursion as being
entirely different setups.

[...]



------------------------------

Date: Tue, 28 Aug 2001 19:42:35 +0200
From: Kalle =?iso-8859-1?Q?Hasselstr=F6m?= <kalle@treskal.com>
Subject: Re: [LANG] The shakespeare language


On Sun, Aug 26, 2001 at 08:49:24PM +0100, Gerson Kurz wrote:
> Nice language, probably not turing complete either, but very funny (and I
> have to advertise it, because they mention my languages).
> 
> Hello World:
> http://www.d.kth.se/~d98-kha/shakespeare/index.php?The%20Infamous%20Hello%20
> World%20Program
> 
> Documentation:
> http://www.d.kth.se/~d98-kha/shakespeare/report/shakespeare/index.html
> 

Is too! It's quite easy to do general calculations, since you have the
usual arithmetic and comparisons on integers. The only limitation
there is that you can't have more than about 100 variables (one
Shakespeare character is an integer variable). However, you also have
a stack of unlimited size for every character, and only two stacks are
necessary to simulate the tape of a Turing machine. I haven't actually
made a formal proof, mostly because it seems so obvious (and since I'm
so lazy).

-- 
BOFH excuse #257:

That would be because the software doesn't work.
--
Kalle Hasselström, kalle@treskal.com

-- Attached file included as plaintext by Listar --

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: För information se http://www.gnupg.org/

iD8DBQE7i9gLN7iPzXSoOQoRAiNDAJ9H3L0VguELl5hnsexl7/gebD1N4gCeKbaP
Jzv8HphOUAu2cIrjsYLGcFo=
=BtYl
-----END PGP SIGNATURE-----



------------------------------

Date: Tue, 28 Aug 2001 19:59:00 +0200
From: Kalle =?iso-8859-1?Q?Hasselstr=F6m?= <kalle@treskal.com>
Subject: Re: [lang] Re: [BF] Liposuction your fat syntax


On Sun, Aug 26, 2001 at 07:04:18AM +0100, Gerson Kurz wrote:
> Hi Orjan,
> 
> > On Sat 26, Aug 2001, Orjan Johansen wrote:
> > So if you want your language to be Turing complete, you cannot tie it to a
> > limited physical implementation.  You need to abstract away the physical
> > limits.
> 
> So which computer language is turing complete, then? Take C - doesn't it
> limit the size of its pointers? So isn't the physically accessible memory
> limited?
> 
> Is there a term "practically complete" or some such, as apposed to the
> strict mathematical term?
> 

C assumes that pointers have a fixed size, which means you can only
address a finite amount of RAM. However, by clever use of an unlimited
supply of floppy disks (or other external storage), C could access an
infinite amount of memory. To simulate a Turing machine, store the
current state and the transition rules in RAM, and have two piles of
floppy disks beside the computer. Those simulate the left and right
portions of the tape. If we run off the edge of the tape, just supply
new, pre-formatted floppy disks.

-- 
BOFH excuse #268:

Neutrino overload on the nameserver
--
Kalle Hasselström, kalle@treskal.com

-- Attached file included as plaintext by Listar --

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: För information se http://www.gnupg.org/

iD8DBQE7i9vkN7iPzXSoOQoRAkVnAJ4ypZWC5MnRIm0Ufr0S+SAFdWT8ogCeM6AE
zYoxlCa1Fs4U2UA3M27TjpE=
=SaVd
-----END PGP SIGNATURE-----



------------------------------

From: Gerson.Kurz@t-online.de (Gerson Kurz)
Subject: [LANG] Colorforth
Date: Tue, 28 Aug 2001 20:20:29 +0100

Slashdot pointed out this: http://www.colorforth.com/cf.html ESO, anyone ???


------------------------------

Date: Tue, 28 Aug 2001 20:53:54 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] [ENSI][BF] revision -0.67 of the standard

Hi,

seeing as there is obvious need of beeing political correct in a
nonexistant, unofficial, completely disregarded by everyone, irrelevant
nonstandards institute such as ENSI, we have revised the brainfuck
standard (now version -0.67) to address the issue of the highly
offensive use of the word "brain" in the word "brainfuck".

Thus, in order to create revision -0.67 of the standard simply prepend
the following text to your favorite other revision of the standard and
run something like sed -e 's/brainfuck/brainfuck/g' on the file.

-0.67
=====

This revision defines the language now renamed to brainfuck, due to the
word b-r-a-i-n being very offensive.

Any use of the word brainfuck in an implementation is a fucking crime
and thus results in that particular brainfuck implementation not being
compliant with the -0.67 revision of the ENSI standard.

In order to be compliant with this revision of the standard, all uses of
the word "brainfuck" in the implementation (including documentation,
etc.) must be changed to "brainfuck".

Note:
In order for a revision of this revision to be compliant with this
revision and the only slightly/truly nonexistant ENSI standard of revision
of revisions, its revision number must be exactly the same as this one
(i.e. 3.7.2.8.1.3.4.1.0.3.1.8.1234567890).

Markus





------------------------------

Date: Wed, 29 Aug 2001 10:52:41 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [ENSI] ENSI-OSS addendvm, bf rev -0.67


These have now both been added to
http://esoteric.sange.fi/ENSI/

Panu






------------------------------

Date: Wed, 29 Aug 2001 11:07:41 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Bag language

On Mon, 27 Aug 2001, Frederic van der Plancke wrote:

> The 'Thue' language is undeterministic and I definitely find that one
> of its nice features (semi-Thue grammars are probably undeterministic too,
> but I never studied them formally anyhow. Do you have pointers ?)

No pointers (I really tried to find them), but the answer is yes.
Semi-Thue grammars define an asymmetric "reduction" relation between a
string and what it may get rewritten to, and the order of reductions is
insignificant. Often the relation is considered transitive, so that it
defines for any given string the set of strings that can be reached from
it by different reductions. The strings for which this set is empty are
called "normal forms". As you can see, it very much resembles lambda
calculus.

Thue grammars define an equivalence relation instead of a reduction
relation. Thus the "results" of a "program" in Thue grammars is the
equivalence class of all strings it might get rewritten to. Not very
useful for programming, as you can see...

Interestingly, the beta- and eta-reductions are also defined to be
equivalences in basic lambda(eta) calculus. This means you could basically
go "to the other direction" (from simple to complex), like this, for
example:

a b c --> (\x. a b c) d --> (\x. a (\x. x) b c) d
or
a b c --> (\x. a x c) b --> (\x. a (\y. x) d c) b

... or whatever. Quite indeterministic, isn't it?

> Panu wrote:
> > It sure does. Semi-Thue grammars feel highly abstract compared to Bag.
>
> But the 'Thue' language is as concrete as Bag, IMO, since it's just
> string rewriting.

Yes. I just meant you get the feeling of working in a higher level of
abstraction when you write the program.

Panu





------------------------------

Date: Wed, 29 Aug 2001 11:32:08 +0300 (EET DST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [query] Tabarnac


I thought I had saved the Tabarnac posting somewhere, but now I can't find
it. And I don't remember who originally posted it, so I have to vex you
all. Could you please repost the definition and the implementation, or
some pointer to a web page or something? (If it doesn't have a web page, I
can make a small one under esoteric.sange.fi for it.)

Panu

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

From: Rafal Sulejman <rafal@engelsinfo.de>
Subject: [lang] Fwd: Tabarnac, a new tarpit, which uses two function stacks
Date: Wed, 29 Aug 2001 13:28:24 +0200




----------  Forwarded Message  ----------
Subject: [lang] Tabarnac, a new tarpit, which uses two function stacks
Date: Thu, 9 Aug 2001 10:39:56 -0400
From: "Charles Lamontagne" <boulam@videotron.ca>
To: <lang@esoteric.sange.fi>


Tabarnac
-------------
Tabarnac could easily be described as functional BrainF*ck. However,
instead of having a nice array, Tabarnac has two function stacks and
a very limited counter. This means you have to juggle with functions,
and arrays are difficult to code. I'm pretty sure Tabarnac is turing
complete, but I won't go into proving that here. It is not as hard
as unlambada, but it's still crazy. :)

9 Commands:
-----------

+ = Increment the counter (if over 255, it will wrap around)
- = Decrement the counter (if under 0, it will wrap around)
! = Print the counter's corresponding ascii char on the screen
? = Input a char and set the counter to it
(function) = Push a function on the other stack

: = Go run the function on the top of the other stack

& = Combine the two top functions into one. Run order: 2nd, then top
* = Repeat the top function 'counter' times
~ = Pop a function and push a function that pushes it

(Note that the counter is an unsigned byte)

= means 'has the same result as'

(+++): = +++
(---)(+++)& = (---+++)
(*---+---)(&~~~!!!!)& = (*---+---&~~~!!!!)
(+---)++++*---- = (+---+---+---+---)   (this assumes that counter=0)
(+-+)~ = ((+-+))
(+-)+++**--- = (+-+-+-+-+-+-+-+-+-)   (if counter=0)



Two code stacks
---------------

There are two code stacks in tabarnac. When runned, a tabarnac
program is entirely pushed on the first stack, and then the
interpreter starts popping and executing it, until it runs
into a :, in which case it starts popping from the other stack.
(It also internally switches stack when returning from a function.)
Operators that operate on the stack (),&,* and ~ always modify
the stack which is isn't being runned, because programs would
otherwise mess themselves up. So a * operator runned on stack 1
would repeat the first function of stack 2, and vice versa. This
means you can loop forever, and in fact also makes tabarnac turing
complete. It also means making programs is a real puzzle.



Fun stuff
----


(-)*:
Set counter to 0
This sets the counter to 0.


()~&~:
Run on this stack
Takes a function from the other stack, moves it to the stack
which is running (instead of running it on the OTHER stack
as : does). It also modifies the function so that it returns to
the right stack.


~~((~~((((())&&)))&))&:
Switch
Switches the 2 first functions.


~(~~((~~((((())&&)))&))&:~&)-*+()~&~:()~&~:
Big flip
Inverts the order of the 'counter' first functions.
Use this for arrays.


~*(())&~:
Clone
Make 'Counter' duplicates of the first function.



Arrays
------

To do arrays in tabarnac, use the 'big flip' to get the function you
want on the top, and use it again to put it back where it was.


Looping Forever
---------------

This prints '!' endlessly

(
(-)*:
++++ ++++ +++
++++ ++++ +++
++++ ++++ +++
!
(-)*:
++
(*):
)
++*:


Interpret
---------

None yet.



Hubert 'MadBrain' Lamontagne
madbrain@videotron.ca

-------------------------------------------------------

-- 
--
 # . . . | Rafal M. Sulejman                        /"\
 # # . . | rms@spam-haters.poczta.onet.pl>          \ /
 . # . . | ASCII Ribbon Campaign for HTML-free mail  X
 . . . # |                                          / \


-- HTML Attachment decoded to text by Listar --
-- File: Attachment: 1

 Tabarnac ------------- Tabarnac could easily be described as functional
BrainF*ck. However,
instead of having a nice array, Tabarnac has two function stacks and
a very limited counter. This means you have to juggle with functions,
and arrays are difficult to code. I'm pretty sure Tabarnac is turing
complete, but I won't go into proving that here. It is not as hard
as unlambada, but it's still crazy. :)   9 Commands:
-----------   + = Increment the counter (if over 255, it will wrap around)
- = Decrement the counter (if under 0, it will wrap around)
! = Print the counter's corresponding ascii char on the screen
? = Input a char and set the counter to it
(function) = Push a function on the other stack
: = Go run the function on the top of the other stack
&= Combine the two top functions into one. Run order: 2nd, then top * =
Repeat the top function 'counter' times
~ = Pop a function and push a function that pushes it   (Note that the
counter is an unsigned byte)   = means 'has the same result as'   (+++): =
+++
(---)(+++)& = (---+++)
(*---+---)(&~~~!!!!)& = (*---+---&~~~!!!!) (+---)++++*---- =
(+---+---+---+---)   (this assumes that counter=0)
(+-+)~ = ((+-+)) (+-)+++**--- = (+-+-+-+-+-+-+-+-+-)   (if counter=0)


Two code stacks
---------------   There are two code stacks in tabarnac. When runned, a
tabarnac
program is entirely pushed on the first stack, and then the
interpreter starts popping and executing it, until it runs
into a :, in which case it starts popping from the other stack.
(It also internally switches stack when returning from a function.)
Operators that operate on the stack (),&,* and ~ always modify
the stack which is isn't being runned, because programs would
otherwise mess themselves up. So a * operator runned on stack 1 
would repeat the first function of stack 2, and vice versa. This 
means you can loop forever, and in fact also makes tabarnac turing
complete. It also means making programs is a real puzzle.       Fun stuff
----   
(-)*:
Set counter to 0
This sets the counter to 0.   
()~&~:
Run on this stack
Takes a function from the other stack, moves it to the stack
which is running (instead of running it on the OTHER stack as : does). It
also modifies the function so that it returns to the right stack.   
~~((~~((((())&&)))&))&:
Switch
Switches the 2 first functions.   
~(~~((~~((((())&&)))&))&:~&)-*+()~&~:()~&~:
Big flip
Inverts the order of the 'counter' first functions. Use this for arrays.   
~*(())&~:
Clone
Make 'Counter' duplicates of the first function.       Arrays
------   To do arrays in tabarnac, use the 'big flip' to get the function
you
want on the top, and use it again to put it back where it was.   
Looping Forever
---------------   This prints '!' endlessly   (
(-)*:
++++ ++++ +++
++++ ++++ +++
++++ ++++ +++
!
(-)*:
++
(*):
)
++*:   
Interpret
---------   None yet.   
  Hubert 'MadBrain' Lamontagne
madbrain@videotron.ca[1]     

--- Links ---
   1 mailto:madbrain@videotron.ca


------------------------------

Date: Thu, 30 Aug 2001 00:33:43 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [b5] prime numbers in b5


Here is a program to form an infinite lazy list of prime numbers in b5. I
also have macros to extract a finite number of primes from that list, and
print them; but I won't bother you with those, because they're not
important for the algorithm.

mac pair a b f => f(a)(b);;;
mac 1st_2 a b => a;;;
mac 2nd_2 a b => b;;;

mac 0 => pair(true)(<<<ERROR: decrement of zero>>>);;;
mac 1+ n => pair(false)(n);;;
mac 1- n => n(2nd_2);;;
mac is_zero n => n(1st_2);;;

mac true then else => then;;; /// isom. with 1st_2, K
mac false then else => else;;; /// isom. with 2nd_2, 0
mac if bool => bool;;; /// isom. with I (probably not worth using)

mac cons => pair;;;
mac head => 1st_2;;;
mac tail => 2nd_2;;;
/// nil is not needed for infinite lists :)

mac natural => natural_inner(0);;;
mac natural_inner n => cons(n)(natural_inner(1+(n)));;;

mac filter pred lst
=> filter_inner(pred)(head(lst))(filter(pred)(tail(lst)));;;
mac filter_inner pred hd rest => if(pred(hd))(cons(hd)(rest))(rest);;;

mac not_divisible_by n m
=> if(is_zero(m))(false)(not_divisible_by_inner(n)(1-(n))(1-(m)));;;
mac not_divisible_by_inner n count m
=> if(is_zero(count))(not_divisible_by(n)(m))
        (if(is_zero(m))(true)
                (not_divisible_by_inner(n)(1-(count))(1-(m))));;;

mac sieve flux => flux(sieve_inner);;;
mac sieve_inner div flux
=> cons(div)(sieve(filter(not_divisible_by(div))(flux)));;;

mac primes => sieve(tail(tail(natural)));;; /// start from 2

I don't know how sieves are usually made in functional languages,
especially the lazy ones, but I'm pretty proud of this algorithm. Its guts
are in the macros sieve, sieve_inner and primes. "natural" forms an
infinite list of natural numbers. "filter" takes a predicate and a list,
and produces a list of all those elements from the original list for which
predicate is true. "not_divisible_by" returns true if m is not divisible
by n.

"sieve" (or rather, sieve_inner) takes a stream "flux" of numbers, and
produces a stream which contains flux' first number, which is guaranteed
to be a prime by promise. The following numbers are formed by sieving a
stream from which all of the numbers divisible by that prime are filtered
away. The magic is in the recursiveness of "sieve": every recursive call
to sieve sets up a new filter to filter away numbers divisible by the
prime gathered by that call to sieve. After N primes, sieve reads the next
number from a cascade of N lazy filters.

Panu

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Wed, 29 Aug 2001 23:49:38 +0200 (CEST)
From: markus.kliegl@t-online.de (Markus Kliegl)
Subject: [lang] Re: [ENSI] ENSI-OSS addendvm, bf rev -0.67



On Wed, 29 Aug 2001, Panu A Kalliokoski wrote:

> 
> These have now both been added to
> http://esoteric.sange.fi/ENSI/

                                   Forbidden

   You don't have permission to access /ENSI/brainfuck-rev--0.67.txt on
   this server.

Don't you think that ought to be revision 3.~=?! ? :-)

> 
> Panu
>

Markus





------------------------------

Date: Thu, 30 Aug 2001 00:58:17 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [chat]  [lang] Re: [ENSI] ENSI-OSS addendvm, bf rev -0.67

On Wed, 29 Aug 2001, Markus Kliegl wrote:

>
>                                    Forbidden
>
>    You don't have permission to access /ENSI/brainfuck-rev--0.67.txt on
>    this server.
>
> Don't you think that ought to be revision 3.~=?! ? :-)

This is exactly why I'm against "easy-to-use" software "solutions": I
don't want my web server to revise the standards it hosts. Approapriate
punishment is underway. In the meanwhile, I noticed a "chmod" solves the
problem. (Nooooooo.... can't be......)

Panu

-- 
Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Thu, 30 Aug 2001 13:48:56 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] [befunge] quine, compiling


I tried to find a Befunge quine which does not read its own source code,
either by stringmode or by the 'g' instruction, but could find none.
Apparently no one has written one? The usage of 'g' in itself is not
cheating, just if it is used to read executed instructions...

Apart from the self-modification of Befunge-93, it's quite easy to
compile, isn't it? The possible paths can be statically determined, they
are not dependent on run-time conditions: Every '<' has one path to left
of it, '?' has four paths, and so on... self-modification, of course,
makes it impossible to track runtime possible paths (because the field can
be rewritten to include new '<', '^' etc...

Panu

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Thu, 30 Aug 2001 16:10:20 -0400
From: Greg Velichansky <hmaon@bumba.net>
Subject: cellular automata

http://www.forbes.com/asap/2000/1127/162.html

This was an interesting piece to me even though some parts were more fanciful
than factual. I guess I'll have to buy the book.

I'm going to go implement rule 30 now. 


-- 
Greg V. (hmaon)


------------------------------

Date: Thu, 30 Aug 2001 17:20:12 -0700
From: "Daniel." <voice@teleport.com>
Subject: Re: cellular automata

>I'm going to go implement rule 30 now.

Why not implement all 256 rules of that type? It should take less 
than twice the work.
-Daniel.


------------------------------

From: "Nikita" <nayzik@home.com>
Subject: [lang] Brainf*ck standarts?
Date: Thu, 30 Aug 2001 19:00:15 -0700

Hi, I'm totally new here... Not even sure I'm sending this to the right
address.

Anyway, I have a question about Brainfuck. The whole thing is so damn
_undefined_. What is the size of each memory element? How many of them
are there? Here it says it should be an array of 30000 bytes, and there
it says both values should be arbitrarily large. What should the
interpreter do if the program attempts to get a number less than 0?

In my own interpreter the memory is 30000 integers (0 to 32767) and it
ignores all "strange" instructions. Well, at least it works :)

Wouldn't it be better to have a standart for Brainfuck? (ANSI Brainfuck
sounds really respectable ;)

Oh, also, a question about Turing-completeness: Should a language be
considered Turing-complete only if it provides access to unlimited
memory, like Turing's machine does? If so, then Brainfuck with 30000 bytes
restriction is not Turing-complete and neither are any of the assembly
languages (that use memory addressing).

--
P.S. please if you get a chanse put some flowrs
on Algernons grave in the bak yard.





------------------------------

Date: Fri, 31 Aug 2001 00:16:06 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: Brainf*ck standarts?

Hi and welcome.

Nikita wrote:
> Wouldn't it be better to have a standart for Brainfuck? (ANSI Brainfuck
> sounds really respectable ;)

ANSI is too weird for us... we use ENSI instead.
http://esoteric.sange.fi/ENSI/

> Oh, also, a question about Turing-completeness: Should a language be
> considered Turing-complete only if it provides access to unlimited
> memory, like Turing's machine does?

Apparently.

> If so, then Brainfuck with 30000 bytes
> restriction is not Turing-complete and neither are any of the assembly
> languages (that use memory addressing).

Yup.

Chris




------------------------------

Date: Thu, 30 Aug 2001 23:21:39 -0700
From: "Daniel." <voice@teleport.com>
Subject: [lang] Re: Brainf*ck standarts?

>Anyway, I have a question about Brainfuck. The whole thing is so damn
>_undefined_. What is the size of each memory element? How many of them
>are there? Here it says it should be an array of 30000 bytes, and there
>it says both values should be arbitrarily large. What should the
>interpreter do if the program attempts to get a number less than 0?

Attempts to standardize these things will only lead to arguments 
between people who have different ideas about how they should be. 
Implementors can help by parameterizing as many features as 
convenient (at a minimum, the array size), and by documenting choices 
clearly; brainfuck programs can be written in a moderately portable 
way (by using only values in the range 0-127, not moving the pointer 
left of its initial position, &c.); and for the rest, people will 
simply have to write their programs for the implementation they plan 
to run them on.

>Oh, also, a question about Turing-completeness: Should a language be
>considered Turing-complete only if it provides access to unlimited
>memory, like Turing's machine does? If so, then Brainfuck with 30000 bytes
>restriction is not Turing-complete and neither are any of the assembly
>languages (that use memory addressing).

Nor any existent computer, of course.
-Daniel.




------------------------------

Date: Fri, 31 Aug 2001 01:23:08 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [befunge] quine, compiling

Panu A Kalliokoski wrote:
> I tried to find a Befunge quine which does not read its own source code,
> either by stringmode or by the 'g' instruction, but could find none.
> Apparently no one has written one? The usage of 'g' in itself is not
> cheating, just if it is used to read executed instructions...

I don't recall any that didn't 'cheat'.

> Apart from the self-modification of Befunge-93, it's quite easy to
> compile, isn't it?

For a skilled programmer such as yourself?  Yes.  Hell, *I* wrote a
Befunge compiler, it can't be *that* difficult.

Chris
"But without self-modification is it really Befunge-93 anymore...?"




------------------------------

Date: Fri, 31 Aug 2001 01:36:17 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: [SPAM?] Re: [ML] [long] OO, type systems

Panu A Kalliokoski wrote:
> > ["fault-tolerant" programming in Erlang]
> 
> This sounds like they're moving the responsibility of the compiler (to
> find expressions that are guaranteed to fail) to the programmer (to write
> code to catch those guaranteed failings). But maybe you didn't talk about
> the type violations here anymore.

The responsibility to find a 'guaranteed failure' (can we agree that
such a thing is an algorithm flaw?) is moved to the type-checker and/or
program-prover, which are seperate packages from the compiler/runtime.

I think you might be getting the wrong impression, though; in Erlang,
generally you write as little code as possible to catch exceptions,
letting them cascade upwards towards a bottleneck.  It's great, the
programmer gets to act all lazy and irresponsible!  :)

> > I used to be greatly in favour of strong typing and optimizing the hell
> > out of code to make it as small and as fast as possible.  And I still
> 
> I just like the language to be so that an optimising (strongly typed)
> compile/semicompile process is possible.

I don't quite understand: how do you design a language so that the
reverse it true?  What would make optimizing type-checking code
impossible?  Overspecification?

Chris




------------------------------

Date: Fri, 31 Aug 2001 01:42:49 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: worb

joe wrote:
> As I said, I'm new here... has anyone programmed a good program in
> it... and how does it work?

Depends on what you mean by 'good'.  It's somewhat limited by
1) noit o' mnain worb has no input facilities
2) the only output facility is the ability to beep
3) it's restricted to 2D; it needs more dimensions than that to overcome
the wire-crossing problem & become (closer to?) Turing-complete

So it's more like a toy than a 'real language', whatever that is.

It works on the principle of mass action.

Chris




------------------------------

Date: Fri, 31 Aug 2001 01:59:17 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] Re: Brainf*ck standarts?

"Daniel." wrote:
> Implementors can help by parameterizing as many features as
> convenient (at a minimum, the array size), and by documenting choices
> clearly;

Yep, when writing a compiler/interpreter for any language it's a good
idea to document the implementation limitations ("implimitations.")

I think it's pretty clear that the intent of the Brainfuck language is
to be equivalent in power to a Turing Machine (and thus
Turing-complete;) Urban basically said as much in his original
documentation.

> brainfuck programs can be written in a moderately portable
> way (by using only values in the range 0-127, not moving the pointer
> left of its initial position, &c.);

Just like C.  If you want very portable code - be very paranoid!

Chris




------------------------------

Date: Fri, 31 Aug 2001 02:36:49 -0500
From: Chris Pressey <cpressey@catseye.mb.ca>
Subject: [lang] On the importance of being Turing-complete

Obviously, a system doesn't have to be Turing-complete to be useful.  We
ask 'Is X TC or not?' so often that I hope we're not falling under the
impression that it's the ultimate measurement of a language.  Languages
like Business BASIC (nope, Jeff, no REDIM), beta-Juliet, VHDL, concrete
ASM, Befunge-93, etc, aren't TC, but they're still potentially useful.

I think we're interested, rather, in whether a language can "compute" or
not, regardless of whether it has a finite data/code store or not.  We'd
like to be able to distinguish between a language like Befunge-93 and a
language like HTML even though neither is TC.  I know *I'm* interested
in it, anyway.

While the "somewhatmhoiststone" or whatever idea works as a metric, it's
too high-resolution to be practical for this purpose, it's not as
tractable as a cleverly chosen plateau that we can all [dis]agree on.

To this end, I propose someone make up a term to be used to describe any
language in which it is possible to construct both a "controlled
oscillator" - be it by means of conditional looping, bounded recursion,
cascade rewriting, self-referential contradiction, or whatever - and in
which it possible to specify a "powerful set of transformations" (e.g.
NAND gates, or subtraction, or...)

It might be tricky to define what a "controlled oscillator" and a
"powerful set of transformations" are unambiguously, but I don't think
it's impossible.  I think most programmers have an intuitive
understanding of them, at least.  With them, we'd have a way of
describing whether a system can "compute" or not without having to care
overmuch about the size or finiteness of its store.

Thoughts?

Chris




------------------------------

Date: Fri, 31 Aug 2001 11:41:22 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: Brainf*ck standarts?

On Thu, 30 Aug 2001, Nikita wrote:
> Wouldn't it be better to have a standart for Brainfuck? (ANSI Brainfuck
> sounds really respectable ;)

By chance, we were discussing almost exactly these matters before when you
joined the list. Chris already gave the pointer to ENSI brainfuck; the
standard sets a lower limit on the array size (5) but no upper limit and
does not specify to which index the pointer points at the beginning of
execution. It also requires numbers to be of possibly-infinite length (by
saying that the < relation is serial). The semantics of '.' are impossible
to implement (at least, depending on the definition of "end user(tm)") and
the semantics of ',' are undefined, but it's a standard anyway. :)

> Oh, also, a question about Turing-completeness: Should a language be
> considered Turing-complete only if it provides access to unlimited
> memory, like Turing's machine does? If so, then Brainfuck with 30000 bytes
> restriction is not Turing-complete and neither are any of the assembly
> languages (that use memory addressing).

Right, except that most assembly languages let you write programs in such
a way that they're Turing-complete, so that you only need to change the
machine (language) they're translated to - no need to change the program.

Panu






------------------------------

Date: Fri, 31 Aug 2001 11:48:59 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [ML] [long] OO, type systems

On Fri, 31 Aug 2001, Chris Pressey wrote:

> The responsibility to find a 'guaranteed failure' (can we agree that
> such a thing is an algorithm flaw?) is moved to the type-checker and/or
> program-prover, which are seperate packages from the compiler/runtime.

... yes, but hopefully no code must be written for these. So a guaranteed
failure is not supposed to be handled by fault-tolerant programming?

> > > I used to be greatly in favour of strong typing and optimizing the hell
> > > out of code to make it as small and as fast as possible.  And I still
> >
> > I just like the language to be so that an optimising (strongly typed)
> > compile/semicompile process is possible.
>
> I don't quite understand: how do you design a language so that the
> reverse it true?  What would make optimizing type-checking code
> impossible?  Overspecification?

Well, for example. But let us consider an extreme example: a language
where the only type is a function (implementation of lambda calculus?)
Then some functions are clearly nonsensical in some contexts, such as a
function representing a list given as a parameter to a function
representing addition of numbers. However, proving such circumstances from
the code is an unsolvable problem in its general form.

Panu

-- 

Am fuar -> symb <- am fesh
atehwa@iki.fi






------------------------------

Date: Fri, 31 Aug 2001 02:09:40 -0700
From: Brian Raiter <breadbox@muppetlabs.com>
Subject: [lang] Re: Brainf*ck standarts?

> Anyway, I have a question about Brainfuck. The whole thing is so
> damn _undefined_. What is the size of each memory element? How many
> of them are there? Here it says it should be an array of 30000
> bytes, and there it says both values should be arbitrarily large.

I don't think it's quite as bad as all that. For one, Brainfuck's
memory array doesn't wrap around, so a given Brainfuck program will
only have a minimum necessary size. In other words, increasing the
size of the memory should never break a working Brainfuck program.
Secondly, the memory cells are generally understood to work like
unsigned integer values in C as regards over- and underflow. That is,
the cells are assumed to use a binary, two's-complement representation
for which overflow bits go into the bit bucket. This aspect can
present a porting issue.

A Brainfuck programmer concerned about portability can, I think,
safely assume that the cells are at least 8 bits, but should avoid
writing code that relies on values ticking over to 0. I made this
mistake myself when I wrote factor.b -- at one or two places in there
I assumed that the memory cells were 8-bit bytes, and took advantage
of wraparound. (What can I say? At the time I wrote it the only
implementations of Brainfuck that I knew of were Urban's and my own. I
didn't foresee the explosion of Brainfuck's popularity looming on the
horizon.) I've been meaning to go back and fix that aspect of factor.b
one of these days, but haven't got around to it yet.

> What should the interpreter do if the program attempts to get a
> number less than 0?

A Brainfuck program can't tell the difference between -1 and 255 in
the first place (assuming an implemention using a cell size of 8
bits), so I'm not sure this is even a meaningful question.

> In my own interpreter the memory is 30000 integers (0 to 32767) and
> it ignores all "strange" instructions. Well, at least it works :)

Have you tried running factor.b?

> Oh, also, a question about Turing-completeness: Should a language be
> considered Turing-complete only if it provides access to unlimited
> memory, like Turing's machine does? If so, then Brainfuck with 30000
> bytes restriction is not Turing-complete and neither are any of the
> assembly languages (that use memory addressing).

That would be the case if the size of 30000 had been treated as a
necessary aspect of the language. However, this has not been the case.

b




------------------------------

Date: Fri, 31 Aug 2001 12:28:39 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: On the importance of being Turing-complete

On Fri, 31 Aug 2001, Chris Pressey wrote:

> Obviously, a system doesn't have to be Turing-complete to be useful.  We
> ask 'Is X TC or not?' so often that I hope we're not falling under the
> impression that it's the ultimate measurement of a language.  Languages
> like Business BASIC (nope, Jeff, no REDIM), beta-Juliet, VHDL, concrete
> ASM, Befunge-93, etc, aren't TC, but they're still potentially useful.

I know. I, too, am yearning for some condition that doesn't answer the
question "can any recursive function be implemented in the system?" but
rather "what kinds (subsets) of recursive functions can be implemented in
the system, at least for some parameters?".

Most importantly, I'm concentrating on the representation of different
things in the language. For example, in dc, the representation of (native
dc) numbers is such that you can do anything with it - at least increment,
decrement and test against zero, and other operations can be derived from
that.  (Native dc) strings, on the other hand, do not allow for arbitrary
manipulation. You have to model strings by arrays of integers and/or
base-(number-of-symbols-in-alphabet) integers, if you want to perform
computation on them. But you can represent them, however.

The usefulness of the language is much dependent on the things you can
represent in it - in a way that allows for the kind of computation you
want to perform on them. Every class of things ("type") has its own
requirements for "representational Turing-completeness", which can be
stated in infinitely many ways. IIRC, some early Fortrans didn't have any
way in them to represent arrays - even finite arrays. That's the kind of
restriction I'm usually looking for when I think about the usefulness of a
language. (By the way, I have the feeling that finite arrays can't be
represented in b-J, either.)

> I think we're interested, rather, in whether a language can "compute" or
> not, regardless of whether it has a finite data/code store or not.  We'd

More like "on what kinds of things it can compute?"

> like to be able to distinguish between a language like Befunge-93 and a
> language like HTML even though neither is TC.  I know *I'm* interested
> in it, anyway.

You know, a loop can be written in HTML. The table-rendering code of many
browsers is iterative :) So it's not very clear, after all, whether "HTML"
"computes".

> To this end, I propose someone make up a term to be used to describe any
> language in which it is possible to construct both a "controlled
> oscillator" - be it by means of conditional looping, bounded recursion,
> cascade rewriting, self-referential contradiction, or whatever - and in
> which it possible to specify a "powerful set of transformations" (e.g.
> NAND gates, or subtraction, or...)
[...]
> Thoughts?

I propose the following categories, with the following side conditions:

1) The number of inputs an algorithm can handle must not depend on its
size (to disallow precalculating results); 2) The algorithm must be able
to handle at least (say) 6 different inputs; 3) The result of an algorithm
must be represented in the same way as its input (to allow chaining of
algorithms).

Integer-complete:	can compute the factorial of a number.
Stack-complete:		can reverse a sequence of arbitrary data.
List-complete:		can sort a sequence of arbitrary data.
Loop-complete:		is able to never finish execution.
Halt-complete:		is able to finish execution.
Cond-complete of <type>:can repeat a set of actions corresponding to a
			certain piece of source code, changing a value of
			<type>, until the value fulfills a certain
			condition, and the repeating stops. The number of
			repeat must not depend on the corresponding
			piece of source code.

... and so on. Any thoughts? More categories?

Panu






------------------------------

Date: Fri, 31 Aug 2001 13:11:41 +0300 (EEST)
From: Panu A Kalliokoski <pkalliok@cs.Helsinki.FI>
Subject: [lang] Re: [BF] Re: various

On Mon, 27 Aug 2001, Daniel. wrote:

> >However, the implementation must ensure that the end user (tm) of the
> >program somehow becomes aware of the current thing.
>
> Wow. Although "end user (tm)" is undefined within the document, if it
> has anything like its colloquial meaning, this is an impossible
> requirement.

True (and pointed out by the time the standard was published). I'm
definitely going to write a standard of an end user. I think it should be
placed on quantum field theories - an end user for any given system is an
entity which is not part of the system but is in interaction with (and has
interference with) the system. Thus, the universe has no end user. :)

> >I'm not very interested
> >in writing bf programs nowadays, though: the representations of various
> >things in bf are self-evident for anybody who has programmed in any
> >"common" programming language,
>
> Okay, but are the most concise ways to do things also self-evident?

Well, I doubt you can come up with a representation of numbers in
brainfuck that lets you write more concise code than using the native
numbers of brainfuck. Of course there are things for which the "optimal"
representation is not self-evident in brainfuck.

> Personally I think I have more to learn from the language; if you
> don't, congratulations.

Any system (at least, any TC system) leaves you infinite fields to
explore. But usually, when you get high enough in the abstraction, you get
the feeling that you've been there before (in other TC systems). What I
find really interesting is when this doesn't happen. And it tends not to
happen when you're exploring a new system on a low level, or a
fundamentally different system on a medium level.

> >the "," and "." instructions are ugly,
>
> Hmm. De gustibus non whatever.

"Obscenity is in the ear of the listener".

> Fair enough. That is something of a weakness. Those things should be
> marked as implementation-dependent or parameterized where convenient,
> and not relied on unnecessarily when writing brainfuck programs.

(BTW: your specifications on what are safe assumptions about the
environment were very nice. I probably should add them to the standard.)

Panu





------------------------------

Date:	Fri, 31 Aug 2001 13:02:38 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [BF] Re: various

On Fri, 31 Aug 2001, Panu A Kalliokoski wrote:

> Well, I doubt you can come up with a representation of numbers in
> brainfuck that lets you write more concise code than using the native
> numbers of brainfuck. Of course there are things for which the "optimal"
> representation is not self-evident in brainfuck.

I cannot speak about Brainfuck, but what I consider one of the most
interesting aspects of my Intercal Unlambda interpreter is that I found a
non-obvious way of representing numbers, that allowed me to do very
concise increments and decrements.  See (3201) and the comments just
before and after that in unlambda.li, (301) second and sixth line, (302)
second and sixth line, and (4410).

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

From: Steve Mosher <goat@isn.net>
Subject: [lang] Re: Brainf*ck standarts?
Date: Fri, 31 Aug 2001 08:36:12 -0300

On Thursday 30 August 2001 23:00, Nikita wrote:
> Hi, I'm totally new here... Not even sure I'm sending this to the right
> address.

Well, I'm not sure that there's anything "right" about talking to esoteric 
programmers at all, but, based on the content of the post, I'm sure it got to 
where it was intended.

> Anyway, I have a question about Brainfuck. The whole thing is so damn
> _undefined_. What is the size of each memory element? How many of them
> are there? Here it says it should be an array of 30000 bytes, and there
> it says both values should be arbitrarily large. What should the
> interpreter do if the program attempts to get a number less than 0?
>
> In my own interpreter the memory is 30000 integers (0 to 32767) and it
> ignores all "strange" instructions. Well, at least it works :)

Personally, I prefer to use 8 bit integers, but that's entirely for my own 
silly reasons. As for the memory array, I'm happy with any arbitrarily large 
value, though memory allocation on demand would be kind of neat, and... (see 
below)

> Wouldn't it be better to have a standart for Brainfuck? (ANSI Brainfuck
> sounds really respectable ;)

Chris handled this one perfectly.

> Oh, also, a question about Turing-completeness: Should a language be
> considered Turing-complete only if it provides access to unlimited
> memory, like Turing's machine does? If so, then Brainfuck with 30000 bytes
> restriction is not Turing-complete and neither are any of the assembly
> languages (that use memory addressing).

If a given Brainfuck interpreter allocated new memory units on demand, then 
this wouldn't be an issue - so long as it actually had the capability to 
allocate infinite memory. Such a system could be designed (I can give an 
example, if anyone cares), and the issue then becomes completely hardware - 
how much memory you actually have.

-- 
Steve Mosher,
Mad Scientist




------------------------------

Date: Fri, 31 Aug 2001 08:46:07 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: [BF] TC conditions

On Tue, 28 Aug 2001, Panu A Kalliokoski wrote:
> On Mon, 27 Aug 2001, John Colagioia wrote:
> > Except that this isn't the case.  It doesn't take Turing Completeness
> > to write out digits of pi, for example, yet that program will never
> > terminate, and will never return to an identical state.  And you can't
> This cannot be true. You probably understand "state" differently from how
> I understand it (it does have many meanings, so that's probably no
> wonder).

Actually, I overlooked the arbitrarily-sized index that's required.

> For mathematical purposes like this, I define state to be "all
> that defines the possible next state(s) of the computation". So if the
> process never returns to an identical state, it must have an infinite
> number of states. And infinite number of states does take infinite memory
> / execution topography / whatever.

While that sounds intuitive, I vaguely recall some major theorem or
somesuch that shows that infinite, non-repeating patterns can be
generated through a finite number of states.  I'd have to do a heck of
a lot of re-reading to find that, though...





------------------------------

From: Steve Mosher <goat@isn.net>
Subject: [lang] Re: [BF] TC conditions
Date: Fri, 31 Aug 2001 10:05:18 -0300

On Friday 31 August 2001 09:46, John Colagioia wrote:
> > For mathematical purposes like this, I define state to be "all
> > that defines the possible next state(s) of the computation". So if the
> > process never returns to an identical state, it must have an infinite
> > number of states. And infinite number of states does take infinite memory
> > / execution topography / whatever.
>
> While that sounds intuitive, I vaguely recall some major theorem or
> somesuch that shows that infinite, non-repeating patterns can be
> generated through a finite number of states.  I'd have to do a heck of
> a lot of re-reading to find that, though...

Can it be said that *all* infinite, non-repeating patterns can be generated 
thusly? It does seem extremely counter-intuitive for any such pattern, 
though. Did any of those states involve, perhaps, infinite precision? That 
might do it.

-- 
Steve Mosher,
Mad Scientist




------------------------------

Date:	Fri, 31 Aug 2001 15:13:29 +0200 (CEST)
From:	Orjan Johansen <oerjan@nvg.ntnu.no>
Subject: [lang] Re: [BF] TC conditions

On Fri, 31 Aug 2001, John Colagioia wrote:

> On Tue, 28 Aug 2001, Panu A Kalliokoski wrote:

> > For mathematical purposes like this, I define state to be "all
> > that defines the possible next state(s) of the computation". So if the
> > process never returns to an identical state, it must have an infinite
> > number of states. And infinite number of states does take infinite memo=
ry
> > / execution topography / whatever.
>
> While that sounds intuitive, I vaguely recall some major theorem or
> somesuch that shows that infinite, non-repeating patterns can be
> generated through a finite number of states.  I'd have to do a heck of
> a lot of re-reading to find that, though...

With Panu's definition, you are not going to find any (with a possible
caveat for non-determinism).  The theorem probably refers to the finite
state part of a Turing machine, which does not include the tape.

A small bell rings concerning grammar-like _substitution rules_, which can
create non-repeating patterns of that kind, in a self-similar fractal-like
manner.  (I did some abstract mathematical work related to those in my
doctorate thesis.)

Greetings,
=D8rjan.

--=20
My Unlambda page: <http://home.nvg.org/~oerjan/unlambda/>
Latest contraption:  Interpreter in Intercal





------------------------------

Date: Fri, 31 Aug 2001 09:17:13 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: On the importance of being Turing-complete

On Fri, 31 Aug 2001, Chris Pressey wrote:
[...]
> I think we're interested, rather, in whether a language can "compute" or
> not, regardless of whether it has a finite data/code store or not. 
[...]

It occurs to me that perhaps it would be easier, rather than trying to
figure out "how Turing Complete" something is, to simply describe
what's missing.  The major bits would seem to be:

- Finite Memory ("standard" BrainF***, Befunge-93)
- Inability to generalize (beta-Juliet)
- Lacking complete control structures (HTML, some older scripting
  languages)
- Incomplete computational system (possibly Hunter, also HTML)

I'm probably missing at least one category in here, but it seems close.

The first and second, I'd be willing to formally call "effectively-" 
and "borderline Turing Complete," if you'd like proposals.

Oh, and mind you, another approach is to just use what the rest of the
Computer Science theory guys use:  Chomsky's language hierarchy.  The
language is as powerful as the level (3, 2, 1, or 0--or, if you'd
prefer names, Finite, Context-Free, Context-Sensitive, and Phrase-
Structure) of language it can be programmed to recognize.





------------------------------

Date: Fri, 31 Aug 2001 09:23:07 -0400 (EDT)
From: John Colagioia <jcolag@rama.poly.edu>
Subject: [lang] Re: On the importance of being Turing-complete

On Fri, 31 Aug 2001, Panu A Kalliokoski wrote:
[...]
> The usefulness of the language is much dependent on the things you can
> represent in it - in a way that allows for the kind of computation you
> want to perform on them. Every class of things ("type") has its own
> requirements for "representational Turing-completeness", which can be
> stated in infinitely many ways.

I disagree with this.  Any conceivable data can be mapped into a
representation and set of operations of any other type of data.  It
might be hard and convoluted, but it's very possible, and has been done
many times.

[...]
> You know, a loop can be written in HTML. The table-rendering code of many
> browsers is iterative :) So it's not very clear, after all, whether "HTML"
> "computes".

Uhm...is this exploitable?  That is, is there some compact HTML code
that will produce a table of arbitrary size?

[...]
> > Thoughts?
> I propose the following categories, with the following side conditions:
[...]
> ... and so on. Any thoughts? More categories?

I find this a bit too complex and maybe tedious for the sake of
analysis.  It has elements of the Chomsky language hierarchy, but then
adds what appear to be somewhat arbitrary attributes of some languages.

That may just be me, though.





------------------------------

Date: Fri, 31 Aug 2001 09:20:43 -0700
From: Brian Raiter <breadbox@muppetlabs.com>
Subject: [lang] Re: [BF] TC conditions

>> For mathematical purposes like this, I define state to be "all
>> that defines the possible next state(s) of the computation". So if the
>> process never returns to an identical state, it must have an infinite
>> number of states. And infinite number of states does take infinite memory
>> / execution topography / whatever.
> 
> While that sounds intuitive, I vaguely recall some major theorem or
> somesuch that shows that infinite, non-repeating patterns can be
> generated through a finite number of states.  I'd have to do a heck of
> a lot of re-reading to find that, though...

Unless we're using a different definition of what is included in the
"state", the pigeonhole principle quickly shows that this cannot be
true.

b




------------------------------
