]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' of git://factorcode.org/git/factor
authorDoug Coleman <doug.coleman@gmail.com>
Thu, 2 Oct 2008 20:58:01 +0000 (15:58 -0500)
committerDoug Coleman <doug.coleman@gmail.com>
Thu, 2 Oct 2008 20:58:01 +0000 (15:58 -0500)
848 files changed:
basis/alarms/alarms-docs.factor [changed mode: 0755->0644]
basis/alarms/alarms-tests.factor [changed mode: 0755->0644]
basis/alarms/alarms.factor [changed mode: 0755->0644]
basis/alias/alias.factor [changed mode: 0755->0644]
basis/alien/arrays/arrays-docs.factor [changed mode: 0755->0644]
basis/alien/c-types/c-types-docs.factor [changed mode: 0755->0644]
basis/alien/c-types/c-types-tests.factor [changed mode: 0755->0644]
basis/alien/c-types/c-types.factor [changed mode: 0755->0644]
basis/alien/remote-control/remote-control.factor [changed mode: 0755->0644]
basis/alien/strings/strings.factor [changed mode: 0755->0644]
basis/alien/structs/structs-docs.factor [changed mode: 0755->0644]
basis/alien/structs/structs.factor [changed mode: 0755->0644]
basis/alien/syntax/syntax-docs.factor [changed mode: 0755->0644]
basis/alien/syntax/syntax.factor [changed mode: 0755->0644]
basis/ascii/ascii-docs.factor [changed mode: 0755->0644]
basis/ascii/ascii.factor [changed mode: 0755->0644]
basis/bit-arrays/bit-arrays-tests.factor [changed mode: 0755->0644]
basis/bit-arrays/bit-arrays.factor [changed mode: 0755->0644]
basis/bit-vectors/bit-vectors-docs.factor [changed mode: 0755->0644]
basis/bit-vectors/bit-vectors-tests.factor [changed mode: 0755->0644]
basis/bit-vectors/bit-vectors.factor [changed mode: 0755->0644]
basis/bootstrap/compiler/compiler.factor [changed mode: 0755->0644]
basis/bootstrap/handbook/handbook.factor [changed mode: 0755->0644]
basis/bootstrap/help/help.factor [changed mode: 0755->0644]
basis/bootstrap/image/image-tests.factor [changed mode: 0755->0644]
basis/bootstrap/image/image.factor [changed mode: 0755->0644]
basis/bootstrap/image/upload/upload.factor [changed mode: 0755->0644]
basis/bootstrap/io/io.factor [changed mode: 0755->0644]
basis/bootstrap/random/random.factor [changed mode: 0755->0644]
basis/bootstrap/stage2.factor [changed mode: 0755->0644]
basis/bootstrap/tools/tools.factor [changed mode: 0755->0644]
basis/bootstrap/ui/tools/tools.factor [changed mode: 0755->0644]
basis/bootstrap/unicode/unicode.factor [changed mode: 0755->0644]
basis/boxes/boxes-docs.factor [changed mode: 0755->0644]
basis/boxes/boxes-tests.factor [changed mode: 0755->0644]
basis/boxes/boxes.factor [changed mode: 0755->0644]
basis/calendar/calendar-tests.factor [changed mode: 0755->0644]
basis/calendar/calendar.factor [changed mode: 0755->0644]
basis/calendar/format/format-tests.factor [changed mode: 0755->0644]
basis/calendar/format/format.factor [changed mode: 0755->0644]
basis/calendar/model/model.factor [changed mode: 0755->0644]
basis/calendar/windows/windows.factor [changed mode: 0755->0644]
basis/channels/channels-tests.factor [changed mode: 0755->0644]
basis/channels/channels.factor [changed mode: 0755->0644]
basis/channels/examples/examples.factor [changed mode: 0755->0644]
basis/channels/remote/remote.factor [changed mode: 0755->0644]
basis/checksums/adler-32/adler-32-docs.factor [changed mode: 0755->0644]
basis/checksums/md5/md5-docs.factor [changed mode: 0755->0644]
basis/checksums/md5/md5-tests.factor [changed mode: 0755->0644]
basis/checksums/md5/md5.factor [changed mode: 0755->0644]
basis/checksums/sha1/sha1-tests.factor [changed mode: 0755->0644]
basis/checksums/sha1/sha1.factor [changed mode: 0755->0644]
basis/checksums/sha2/sha2-tests.factor [changed mode: 0755->0644]
basis/checksums/sha2/sha2.factor [changed mode: 0755->0644]
basis/circular/circular-tests.factor [changed mode: 0755->0644]
basis/circular/circular.factor [changed mode: 0755->0644]
basis/cocoa/application/application-docs.factor
basis/cocoa/application/application.factor [changed mode: 0755->0644]
basis/cocoa/cocoa-docs.factor
basis/cocoa/cocoa.factor [changed mode: 0755->0644]
basis/cocoa/messages/messages-docs.factor
basis/cocoa/messages/messages.factor [changed mode: 0755->0644]
basis/cocoa/pasteboard/pasteboard.factor [changed mode: 0755->0644]
basis/cocoa/subclassing/subclassing.factor [changed mode: 0755->0644]
basis/cocoa/windows/windows.factor [changed mode: 0755->0644]
basis/colors/colors.factor
basis/colors/gray/gray.factor [new file with mode: 0644]
basis/colors/hsv/hsv-tests.factor [new file with mode: 0644]
basis/colors/hsv/hsv.factor
basis/combinators/short-circuit/short-circuit.factor [changed mode: 0755->0644]
basis/compiler/compiler-docs.factor [changed mode: 0755->0644]
basis/compiler/compiler.factor [changed mode: 0755->0644]
basis/compiler/constants/constants.factor [changed mode: 0755->0644]
basis/compiler/generator/fixup/fixup.factor [changed mode: 0755->0644]
basis/compiler/generator/generator-docs.factor [changed mode: 0755->0644]
basis/compiler/generator/generator.factor [changed mode: 0755->0644]
basis/compiler/generator/registers/registers.factor [changed mode: 0755->0644]
basis/compiler/tests/alien.factor [changed mode: 0755->0644]
basis/compiler/tests/curry.factor [changed mode: 0755->0644]
basis/compiler/tests/float.factor [changed mode: 0755->0644]
basis/compiler/tests/intrinsics.factor [changed mode: 0755->0644]
basis/compiler/tests/optimizer.factor [changed mode: 0755->0644]
basis/compiler/tests/simple.factor [changed mode: 0755->0644]
basis/compiler/tests/stack-trace.factor [changed mode: 0755->0644]
basis/compiler/tests/templates-early.factor [changed mode: 0755->0644]
basis/compiler/tests/templates.factor [changed mode: 0755->0644]
basis/compiler/tests/tuples.factor [changed mode: 0755->0644]
basis/compiler/tree/dead-code/simple/simple.factor [changed mode: 0755->0644]
basis/compiler/tree/def-use/def-use-tests.factor [changed mode: 0755->0644]
basis/compiler/tree/def-use/def-use.factor [changed mode: 0755->0644]
basis/compiler/tree/propagation/propagation-tests.factor
basis/compiler/tree/propagation/propagation.factor [changed mode: 0755->0644]
basis/compiler/tree/propagation/simple/simple.factor
basis/compiler/tree/recursive/recursive-tests.factor
basis/compiler/tree/recursive/recursive.factor
basis/compiler/tree/tree.factor [changed mode: 0755->0644]
basis/concurrency/combinators/combinators-docs.factor [changed mode: 0755->0644]
basis/concurrency/combinators/combinators-tests.factor [changed mode: 0755->0644]
basis/concurrency/combinators/combinators.factor [changed mode: 0755->0644]
basis/concurrency/conditions/conditions.factor [changed mode: 0755->0644]
basis/concurrency/count-downs/count-downs-docs.factor [changed mode: 0755->0644]
basis/concurrency/count-downs/count-downs-tests.factor [changed mode: 0755->0644]
basis/concurrency/count-downs/count-downs.factor [changed mode: 0755->0644]
basis/concurrency/distributed/distributed-docs.factor [changed mode: 0755->0644]
basis/concurrency/distributed/distributed-tests.factor [changed mode: 0755->0644]
basis/concurrency/distributed/distributed.factor [changed mode: 0755->0644]
basis/concurrency/exchangers/exchangers-docs.factor [changed mode: 0755->0644]
basis/concurrency/exchangers/exchangers-tests.factor [changed mode: 0755->0644]
basis/concurrency/exchangers/exchangers.factor [changed mode: 0755->0644]
basis/concurrency/flags/flags-tests.factor [changed mode: 0755->0644]
basis/concurrency/flags/flags.factor [changed mode: 0755->0644]
basis/concurrency/futures/futures-docs.factor [changed mode: 0755->0644]
basis/concurrency/futures/futures-tests.factor [changed mode: 0755->0644]
basis/concurrency/futures/futures.factor [changed mode: 0755->0644]
basis/concurrency/locks/locks-docs.factor [changed mode: 0755->0644]
basis/concurrency/locks/locks-tests.factor [changed mode: 0755->0644]
basis/concurrency/locks/locks.factor [changed mode: 0755->0644]
basis/concurrency/mailboxes/mailboxes-docs.factor [changed mode: 0755->0644]
basis/concurrency/mailboxes/mailboxes-tests.factor [changed mode: 0755->0644]
basis/concurrency/mailboxes/mailboxes.factor [changed mode: 0755->0644]
basis/concurrency/messaging/messaging-docs.factor [changed mode: 0755->0644]
basis/concurrency/messaging/messaging-tests.factor [changed mode: 0755->0644]
basis/concurrency/messaging/messaging.factor [changed mode: 0755->0644]
basis/concurrency/promises/promises-docs.factor [changed mode: 0755->0644]
basis/concurrency/promises/promises-tests.factor [changed mode: 0755->0644]
basis/concurrency/promises/promises.factor [changed mode: 0755->0644]
basis/concurrency/semaphores/semaphores-docs.factor [changed mode: 0755->0644]
basis/concurrency/semaphores/semaphores.factor [changed mode: 0755->0644]
basis/cpu/architecture/architecture.factor [changed mode: 0755->0644]
basis/cpu/ppc/allot/allot.factor [changed mode: 0755->0644]
basis/cpu/ppc/architecture/architecture.factor [changed mode: 0755->0644]
basis/cpu/ppc/assembler/assembler.factor [changed mode: 0755->0644]
basis/cpu/ppc/bootstrap.factor [changed mode: 0755->0644]
basis/cpu/ppc/intrinsics/intrinsics.factor [changed mode: 0755->0644]
basis/cpu/ppc/linux/bootstrap.factor [changed mode: 0755->0644]
basis/cpu/ppc/macosx/bootstrap.factor [changed mode: 0755->0644]
basis/cpu/ppc/ppc.factor [changed mode: 0755->0644]
basis/cpu/x86/32/32.factor [changed mode: 0755->0644]
basis/cpu/x86/32/bootstrap.factor [changed mode: 0755->0644]
basis/cpu/x86/64/64.factor [changed mode: 0755->0644]
basis/cpu/x86/64/bootstrap.factor [changed mode: 0755->0644]
basis/cpu/x86/allot/allot.factor [changed mode: 0755->0644]
basis/cpu/x86/architecture/architecture.factor [changed mode: 0755->0644]
basis/cpu/x86/assembler/assembler.factor [changed mode: 0755->0644]
basis/cpu/x86/bootstrap.factor [changed mode: 0755->0644]
basis/cpu/x86/intrinsics/intrinsics.factor [changed mode: 0755->0644]
basis/cpu/x86/sse2/sse2.factor [changed mode: 0755->0644]
basis/db/db-docs.factor
basis/db/db-tests.factor [changed mode: 0755->0644]
basis/db/db.factor [changed mode: 0755->0644]
basis/db/pools/pools.factor
basis/db/postgresql/ffi/ffi.factor [changed mode: 0755->0644]
basis/db/postgresql/lib/lib.factor [changed mode: 0755->0644]
basis/db/postgresql/postgresql-tests.factor [changed mode: 0755->0644]
basis/db/postgresql/postgresql.factor [changed mode: 0755->0644]
basis/db/queries/queries.factor
basis/db/sql/sql-tests.factor [deleted file]
basis/db/sql/sql.factor [deleted file]
basis/db/sqlite/ffi/ffi.factor [changed mode: 0755->0644]
basis/db/sqlite/lib/lib.factor [changed mode: 0755->0644]
basis/db/sqlite/sqlite-tests.factor [changed mode: 0755->0644]
basis/db/sqlite/sqlite.factor [changed mode: 0755->0644]
basis/db/tuples/tuples-docs.factor
basis/db/tuples/tuples-tests.factor [changed mode: 0755->0644]
basis/db/tuples/tuples.factor [changed mode: 0755->0644]
basis/db/types/types-docs.factor
basis/db/types/types.factor [changed mode: 0755->0644]
basis/debugger/debugger-docs.factor [changed mode: 0755->0644]
basis/debugger/debugger-tests.factor [changed mode: 0755->0644]
basis/debugger/debugger.factor [changed mode: 0755->0644]
basis/delegate/delegate-tests.factor [changed mode: 0755->0644]
basis/delegate/delegate.factor [changed mode: 0755->0644]
basis/delegate/protocols/protocols.factor [changed mode: 0755->0644]
basis/dlists/dlists-docs.factor [changed mode: 0755->0644]
basis/dlists/dlists-tests.factor [changed mode: 0755->0644]
basis/dlists/dlists.factor [changed mode: 0755->0644]
basis/documents/documents.factor [changed mode: 0755->0644]
basis/editors/editors.factor [changed mode: 0755->0644]
basis/editors/editpadpro/editpadpro.factor [changed mode: 0755->0644]
basis/editors/editplus/editplus.factor [changed mode: 0755->0644]
basis/editors/emacs/emacs.factor [changed mode: 0755->0644]
basis/editors/emeditor/emeditor.factor [changed mode: 0755->0644]
basis/editors/gvim/gvim.factor [changed mode: 0755->0644]
basis/editors/gvim/windows/windows.factor [changed mode: 0755->0644]
basis/editors/jedit/jedit.factor [changed mode: 0755->0644]
basis/editors/macvim/macvim.factor [changed mode: 0755->0644]
basis/editors/notepadpp/notepadpp.factor [changed mode: 0755->0644]
basis/editors/scite/scite.factor [changed mode: 0755->0644]
basis/editors/ted-notepad/ted-notepad.factor [changed mode: 0755->0644]
basis/editors/textedit/textedit.factor [changed mode: 0755->0644]
basis/editors/textmate/textmate.factor [changed mode: 0755->0644]
basis/editors/ultraedit/ultraedit.factor [changed mode: 0755->0644]
basis/editors/vim/vim.factor [changed mode: 0755->0644]
basis/editors/wordpad/wordpad.factor [changed mode: 0755->0644]
basis/farkup/farkup.factor
basis/float-arrays/float-arrays-tests.factor [changed mode: 0755->0644]
basis/float-arrays/float-arrays.factor [changed mode: 0755->0644]
basis/float-vectors/float-vectors-docs.factor [changed mode: 0755->0644]
basis/float-vectors/float-vectors-tests.factor [changed mode: 0755->0644]
basis/float-vectors/float-vectors.factor [changed mode: 0755->0644]
basis/freetype/freetype.factor [changed mode: 0755->0644]
basis/fry/fry-docs.factor [changed mode: 0755->0644]
basis/fry/fry-tests.factor [changed mode: 0755->0644]
basis/fry/fry.factor [changed mode: 0755->0644]
basis/furnace/actions/actions-tests.factor [changed mode: 0755->0644]
basis/furnace/actions/actions.factor [changed mode: 0755->0644]
basis/furnace/alloy/alloy.factor
basis/furnace/auth/auth.factor [changed mode: 0755->0644]
basis/furnace/auth/basic/basic.factor [changed mode: 0755->0644]
basis/furnace/auth/login/login-tests.factor [changed mode: 0755->0644]
basis/furnace/auth/login/login.factor [changed mode: 0755->0644]
basis/furnace/auth/providers/assoc/assoc-tests.factor [changed mode: 0755->0644]
basis/furnace/auth/providers/assoc/assoc.factor [changed mode: 0755->0644]
basis/furnace/auth/providers/db/db-tests.factor [changed mode: 0755->0644]
basis/furnace/auth/providers/db/db.factor [changed mode: 0755->0644]
basis/furnace/auth/providers/null/null.factor [changed mode: 0755->0644]
basis/furnace/auth/providers/providers.factor [changed mode: 0755->0644]
basis/furnace/db/db.factor [changed mode: 0755->0644]
basis/furnace/sessions/sessions-tests.factor [changed mode: 0755->0644]
basis/furnace/sessions/sessions.factor [changed mode: 0755->0644]
basis/generalizations/generalizations-docs.factor [changed mode: 0755->0644]
basis/generalizations/generalizations-tests.factor [changed mode: 0755->0644]
basis/generalizations/generalizations.factor [changed mode: 0755->0644]
basis/globs/globs.factor [changed mode: 0755->0644]
basis/hash2/hash2-tests.factor [changed mode: 0755->0644]
basis/heaps/heaps-docs.factor [changed mode: 0755->0644]
basis/heaps/heaps-tests.factor [changed mode: 0755->0644]
basis/heaps/heaps.factor [changed mode: 0755->0644]
basis/help/cookbook/cookbook.factor [changed mode: 0755->0644]
basis/help/crossref/crossref-tests.factor [changed mode: 0755->0644]
basis/help/definitions/definitions-tests.factor [changed mode: 0755->0644]
basis/help/definitions/definitions.factor [changed mode: 0755->0644]
basis/help/handbook/handbook.factor [changed mode: 0755->0644]
basis/help/help-docs.factor [changed mode: 0755->0644]
basis/help/help.factor [changed mode: 0755->0644]
basis/help/lint/lint.factor [changed mode: 0755->0644]
basis/help/markup/markup.factor [changed mode: 0755->0644]
basis/help/stylesheet/stylesheet.factor [changed mode: 0755->0644]
basis/help/syntax/syntax-tests.factor [changed mode: 0755->0644]
basis/help/syntax/syntax.factor [changed mode: 0755->0644]
basis/help/topics/topics.factor [changed mode: 0755->0644]
basis/help/tutorial/tutorial.factor [changed mode: 0755->0644]
basis/html/streams/streams.factor [changed mode: 0755->0644]
basis/html/templates/fhtml/fhtml-tests.factor [changed mode: 0755->0644]
basis/html/templates/fhtml/fhtml.factor [changed mode: 0755->0644]
basis/http/client/client-docs.factor
basis/http/client/client-tests.factor [changed mode: 0755->0644]
basis/http/client/client.factor [changed mode: 0755->0644]
basis/http/http-tests.factor [changed mode: 0755->0644]
basis/http/http.factor [changed mode: 0755->0644]
basis/http/parsers/parsers.factor
basis/http/server/cgi/cgi.factor [changed mode: 0755->0644]
basis/http/server/server.factor [changed mode: 0755->0644]
basis/http/server/static/static-docs.factor
basis/http/server/static/static.factor [changed mode: 0755->0644]
basis/inspector/inspector.factor [changed mode: 0755->0644]
basis/interpolate/authors.txt [new file with mode: 0644]
basis/interpolate/interpolate-tests.factor [new file with mode: 0644]
basis/interpolate/interpolate.factor [new file with mode: 0644]
basis/interval-maps/interval-maps-docs.factor [changed mode: 0755->0644]
basis/interval-maps/interval-maps-tests.factor [changed mode: 0755->0644]
basis/interval-maps/interval-maps.factor [changed mode: 0755->0644]
basis/io/buffers/buffers-docs.factor [changed mode: 0755->0644]
basis/io/buffers/buffers-tests.factor [changed mode: 0755->0644]
basis/io/buffers/buffers.factor [changed mode: 0755->0644]
basis/io/encodings/8-bit/8-bit.factor [changed mode: 0755->0644]
basis/io/encodings/ascii/ascii-docs.factor
basis/io/encodings/ascii/ascii.factor [changed mode: 0755->0644]
basis/io/encodings/iana/iana.factor [changed mode: 0755->0644]
basis/io/encodings/utf16/utf16-tests.factor [changed mode: 0755->0644]
basis/io/encodings/utf16/utf16.factor [changed mode: 0755->0644]
basis/io/launcher/launcher-docs.factor [changed mode: 0755->0644]
basis/io/launcher/launcher-tests.factor [changed mode: 0755->0644]
basis/io/launcher/launcher.factor [changed mode: 0755->0644]
basis/io/mmap/mmap-docs.factor [changed mode: 0755->0644]
basis/io/mmap/mmap-tests.factor [changed mode: 0755->0644]
basis/io/mmap/mmap.factor [changed mode: 0755->0644]
basis/io/monitors/monitors-docs.factor [changed mode: 0755->0644]
basis/io/monitors/monitors-tests.factor [changed mode: 0755->0644]
basis/io/monitors/monitors.factor [changed mode: 0755->0644]
basis/io/pipes/pipes-tests.factor [changed mode: 0755->0644]
basis/io/ports/ports-docs.factor [changed mode: 0755->0644]
basis/io/ports/ports.factor [changed mode: 0755->0644]
basis/io/servers/connection/connection-docs.factor [changed mode: 0755->0644]
basis/io/servers/connection/connection-tests.factor [changed mode: 0755->0644]
basis/io/servers/connection/connection.factor [changed mode: 0755->0644]
basis/io/sockets/secure/secure-tests.factor [changed mode: 0755->0644]
basis/io/sockets/secure/secure.factor [changed mode: 0755->0644]
basis/io/sockets/sockets-docs.factor [changed mode: 0755->0644]
basis/io/sockets/sockets-tests.factor [changed mode: 0755->0644]
basis/io/sockets/sockets.factor [changed mode: 0755->0644]
basis/io/streams/duplex/duplex-docs.factor [changed mode: 0755->0644]
basis/io/streams/duplex/duplex-tests.factor [changed mode: 0755->0644]
basis/io/streams/duplex/duplex.factor [changed mode: 0755->0644]
basis/io/streams/null/null.factor [changed mode: 0755->0644]
basis/io/thread/thread.factor [changed mode: 0755->0644]
basis/io/timeouts/timeouts-docs.factor [changed mode: 0755->0644]
basis/io/timeouts/timeouts.factor [changed mode: 0755->0644]
basis/io/unix/backend/backend.factor [changed mode: 0755->0644]
basis/io/unix/bsd/bsd.factor [changed mode: 0755->0644]
basis/io/unix/files/files-tests.factor [changed mode: 0755->0644]
basis/io/unix/files/files.factor [changed mode: 0755->0644]
basis/io/unix/kqueue/kqueue.factor [changed mode: 0755->0644]
basis/io/unix/launcher/launcher-tests.factor [changed mode: 0755->0644]
basis/io/unix/launcher/launcher.factor [changed mode: 0755->0644]
basis/io/unix/launcher/parser/parser-tests.factor [changed mode: 0755->0644]
basis/io/unix/launcher/parser/parser.factor [changed mode: 0755->0644]
basis/io/unix/linux/linux.factor [changed mode: 0755->0644]
basis/io/unix/mmap/mmap.factor [changed mode: 0755->0644]
basis/io/unix/select/select.factor [changed mode: 0755->0644]
basis/io/unix/sockets/secure/secure.factor [changed mode: 0755->0644]
basis/io/unix/sockets/sockets.factor [changed mode: 0755->0644]
basis/io/unix/unix-tests.factor [changed mode: 0755->0644]
basis/io/unix/unix.factor [changed mode: 0755->0644]
basis/io/windows/files/files.factor [changed mode: 0755->0644]
basis/io/windows/files/unique/unique.factor [changed mode: 0755->0644]
basis/io/windows/launcher/launcher-tests.factor [changed mode: 0755->0644]
basis/io/windows/launcher/launcher.factor [changed mode: 0755->0644]
basis/io/windows/mmap/mmap.factor [changed mode: 0755->0644]
basis/io/windows/nt/backend/backend.factor [changed mode: 0755->0644]
basis/io/windows/nt/files/files-tests.factor [changed mode: 0755->0644]
basis/io/windows/nt/files/files.factor [changed mode: 0755->0644]
basis/io/windows/nt/launcher/launcher-tests.factor [changed mode: 0755->0644]
basis/io/windows/nt/launcher/launcher.factor [changed mode: 0755->0644]
basis/io/windows/nt/launcher/test/append.factor [changed mode: 0755->0644]
basis/io/windows/nt/launcher/test/env.factor [changed mode: 0755->0644]
basis/io/windows/nt/launcher/test/stderr.factor [changed mode: 0755->0644]
basis/io/windows/nt/monitors/monitors-tests.factor [changed mode: 0755->0644]
basis/io/windows/nt/monitors/monitors.factor [changed mode: 0755->0644]
basis/io/windows/nt/nt.factor [changed mode: 0755->0644]
basis/io/windows/nt/pipes/pipes.factor [changed mode: 0755->0644]
basis/io/windows/nt/privileges/privileges.factor [changed mode: 0755->0644]
basis/io/windows/nt/sockets/sockets.factor [changed mode: 0755->0644]
basis/io/windows/privileges/privileges.factor [changed mode: 0755->0644]
basis/io/windows/sockets/sockets.factor [changed mode: 0755->0644]
basis/io/windows/windows.factor [changed mode: 0755->0644]
basis/json/reader/reader.factor [changed mode: 0755->0644]
basis/lcs/lcs-docs.factor [changed mode: 0755->0644]
basis/lcs/lcs-tests.factor [changed mode: 0755->0644]
basis/lcs/lcs.factor [changed mode: 0755->0644]
basis/libc/libc-tests.factor [changed mode: 0755->0644]
basis/libc/libc.factor [changed mode: 0755->0644]
basis/listener/listener-docs.factor [changed mode: 0755->0644]
basis/listener/listener-tests.factor [changed mode: 0755->0644]
basis/listener/listener.factor [changed mode: 0755->0644]
basis/locals/locals-docs.factor
basis/locals/locals-tests.factor [changed mode: 0755->0644]
basis/locals/locals.factor [changed mode: 0755->0644]
basis/logging/analysis/analysis.factor [changed mode: 0755->0644]
basis/logging/insomniac/insomniac-docs.factor [changed mode: 0755->0644]
basis/logging/insomniac/insomniac.factor [changed mode: 0755->0644]
basis/logging/logging-docs.factor [changed mode: 0755->0644]
basis/logging/logging.factor [changed mode: 0755->0644]
basis/logging/parser/parser.factor [changed mode: 0755->0644]
basis/logging/server/server.factor [changed mode: 0755->0644]
basis/macros/macros.factor [changed mode: 0755->0644]
basis/match/match-tests.factor [changed mode: 0755->0644]
basis/match/match.factor [changed mode: 0755->0644]
basis/math/bitwise/bitwise-tests.factor [changed mode: 0755->0644]
basis/math/complex/complex-docs.factor [changed mode: 0755->0644]
basis/math/complex/complex-tests.factor [changed mode: 0755->0644]
basis/math/complex/complex.factor [changed mode: 0755->0644]
basis/math/constants/constants-docs.factor [changed mode: 0755->0644]
basis/math/constants/constants.factor [changed mode: 0755->0644]
basis/math/functions/functions-docs.factor [changed mode: 0755->0644]
basis/math/functions/functions-tests.factor [changed mode: 0755->0644]
basis/math/functions/functions.factor [changed mode: 0755->0644]
basis/math/intervals/intervals-tests.factor [changed mode: 0755->0644]
basis/math/intervals/intervals.factor [changed mode: 0755->0644]
basis/math/libm/libm.factor [changed mode: 0755->0644]
basis/math/ranges/ranges.factor [changed mode: 0755->0644]
basis/math/ratios/ratios-docs.factor [changed mode: 0755->0644]
basis/math/ratios/ratios-tests.factor [changed mode: 0755->0644]
basis/math/ratios/ratios.factor [changed mode: 0755->0644]
basis/math/vectors/vectors-docs.factor [changed mode: 0755->0644]
basis/math/vectors/vectors.factor [changed mode: 0755->0644]
basis/memoize/memoize-docs.factor [changed mode: 0755->0644]
basis/memoize/memoize.factor [changed mode: 0755->0644]
basis/mime-types/mime-types.factor [changed mode: 0755->0644]
basis/mirrors/mirrors-docs.factor [changed mode: 0755->0644]
basis/mirrors/mirrors-tests.factor [changed mode: 0755->0644]
basis/mirrors/mirrors.factor [changed mode: 0755->0644]
basis/models/compose/compose-docs.factor [changed mode: 0755->0644]
basis/models/compose/compose-tests.factor [changed mode: 0755->0644]
basis/models/compose/compose.factor [changed mode: 0755->0644]
basis/models/delay/delay-docs.factor [changed mode: 0755->0644]
basis/models/delay/delay.factor [changed mode: 0755->0644]
basis/models/filter/filter-docs.factor [changed mode: 0755->0644]
basis/models/filter/filter-tests.factor [changed mode: 0755->0644]
basis/models/filter/filter.factor [changed mode: 0755->0644]
basis/models/history/history-docs.factor [changed mode: 0755->0644]
basis/models/history/history-tests.factor [changed mode: 0755->0644]
basis/models/history/history.factor [changed mode: 0755->0644]
basis/models/mapping/mapping-tests.factor [changed mode: 0755->0644]
basis/models/mapping/mapping.factor [changed mode: 0755->0644]
basis/models/models-docs.factor [changed mode: 0755->0644]
basis/models/models-tests.factor [changed mode: 0755->0644]
basis/models/models.factor [changed mode: 0755->0644]
basis/models/range/range-docs.factor [changed mode: 0755->0644]
basis/models/range/range-tests.factor [changed mode: 0755->0644]
basis/models/range/range.factor [changed mode: 0755->0644]
basis/multiline/multiline-tests.factor [changed mode: 0755->0644]
basis/multiline/multiline.factor [changed mode: 0755->0644]
basis/opengl/gl/windows/windows.factor [changed mode: 0755->0644]
basis/opengl/opengl.factor [changed mode: 0755->0644]
basis/openssl/libcrypto/libcrypto.factor [changed mode: 0755->0644]
basis/openssl/libssl/libssl.factor [changed mode: 0755->0644]
basis/openssl/openssl-tests.factor [changed mode: 0755->0644]
basis/openssl/openssl.factor [changed mode: 0755->0644]
basis/peg/parsers/parsers-docs.factor [changed mode: 0755->0644]
basis/peg/parsers/parsers.factor [changed mode: 0755->0644]
basis/peg/peg.factor [changed mode: 0755->0644]
basis/peg/search/search-docs.factor [changed mode: 0755->0644]
basis/peg/search/search-tests.factor [changed mode: 0755->0644]
basis/peg/search/search.factor [changed mode: 0755->0644]
basis/present/present-docs.factor
basis/prettyprint/backend/backend-docs.factor [changed mode: 0755->0644]
basis/prettyprint/backend/backend.factor [changed mode: 0755->0644]
basis/prettyprint/prettyprint-docs.factor [changed mode: 0755->0644]
basis/prettyprint/prettyprint-tests.factor [changed mode: 0755->0644]
basis/prettyprint/prettyprint.factor [changed mode: 0755->0644]
basis/prettyprint/sections/sections-docs.factor [changed mode: 0755->0644]
basis/qualified/qualified-docs.factor [changed mode: 0755->0644]
basis/random/dummy/dummy.factor [changed mode: 0755->0644]
basis/random/mersenne-twister/mersenne-twister-tests.factor [changed mode: 0755->0644]
basis/random/mersenne-twister/mersenne-twister.factor [changed mode: 0755->0644]
basis/random/random.factor [changed mode: 0755->0644]
basis/sequences/deep/deep-tests.factor [changed mode: 0755->0644]
basis/sequences/next/next.factor [changed mode: 0755->0644]
basis/serialize/serialize-docs.factor [changed mode: 0755->0644]
basis/serialize/serialize-tests.factor [changed mode: 0755->0644]
basis/serialize/serialize.factor [changed mode: 0755->0644]
basis/shuffle/shuffle-tests.factor [changed mode: 0755->0644]
basis/smtp/server/server.factor [changed mode: 0755->0644]
basis/smtp/smtp-tests.factor [changed mode: 0755->0644]
basis/smtp/smtp.factor [changed mode: 0755->0644]
basis/stack-checker/backend/backend.factor [changed mode: 0755->0644]
basis/stack-checker/known-words/known-words.factor [changed mode: 0755->0644]
basis/stack-checker/stack-checker-docs.factor [changed mode: 0755->0644]
basis/stack-checker/stack-checker-tests.factor [changed mode: 0755->0644]
basis/stack-checker/stack-checker.factor [changed mode: 0755->0644]
basis/stack-checker/state/state.factor [changed mode: 0755->0644]
basis/stack-checker/transforms/transforms-docs.factor [changed mode: 0755->0644]
basis/stack-checker/transforms/transforms-tests.factor [changed mode: 0755->0644]
basis/stack-checker/transforms/transforms.factor [changed mode: 0755->0644]
basis/state-parser/state-parser-tests.factor [changed mode: 0755->0644]
basis/symbols/symbols-tests.factor [changed mode: 0755->0644]
basis/symbols/symbols.factor [changed mode: 0755->0644]
basis/syndication/syndication-tests.factor [changed mode: 0755->0644]
basis/threads/threads-docs.factor [changed mode: 0755->0644]
basis/threads/threads-tests.factor [changed mode: 0755->0644]
basis/threads/threads.factor [changed mode: 0755->0644]
basis/tools/annotations/annotations-docs.factor [changed mode: 0755->0644]
basis/tools/annotations/annotations-tests.factor [changed mode: 0755->0644]
basis/tools/annotations/annotations.factor [changed mode: 0755->0644]
basis/tools/completion/completion.factor [changed mode: 0755->0644]
basis/tools/crossref/crossref-tests.factor [changed mode: 0755->0644]
basis/tools/crossref/crossref.factor [changed mode: 0755->0644]
basis/tools/crossref/test/foo.factor [changed mode: 0755->0644]
basis/tools/deploy/backend/backend.factor [changed mode: 0755->0644]
basis/tools/deploy/config/config-docs.factor [changed mode: 0755->0644]
basis/tools/deploy/config/config.factor [changed mode: 0755->0644]
basis/tools/deploy/deploy-docs.factor [changed mode: 0755->0644]
basis/tools/deploy/deploy-tests.factor [changed mode: 0755->0644]
basis/tools/deploy/deploy.factor [changed mode: 0755->0644]
basis/tools/deploy/macosx/macosx.factor [changed mode: 0755->0644]
basis/tools/deploy/shaker/shaker.factor [changed mode: 0755->0644]
basis/tools/deploy/shaker/strip-cocoa.factor [changed mode: 0755->0644]
basis/tools/deploy/shaker/strip-debugger.factor [changed mode: 0755->0644]
basis/tools/deploy/shaker/strip-libc.factor [changed mode: 0755->0644]
basis/tools/deploy/test/1/1.factor [changed mode: 0755->0644]
basis/tools/deploy/test/1/deploy.factor [changed mode: 0755->0644]
basis/tools/deploy/test/2/2.factor [changed mode: 0755->0644]
basis/tools/deploy/test/2/deploy.factor [changed mode: 0755->0644]
basis/tools/deploy/test/3/3.factor [changed mode: 0755->0644]
basis/tools/deploy/test/3/deploy.factor [changed mode: 0755->0644]
basis/tools/deploy/windows/windows-tests.factor [changed mode: 0755->0644]
basis/tools/deploy/windows/windows.factor [changed mode: 0755->0644]
basis/tools/disassembler/disassembler-docs.factor [changed mode: 0755->0644]
basis/tools/disassembler/disassembler-tests.factor [changed mode: 0755->0644]
basis/tools/disassembler/disassembler.factor [changed mode: 0755->0644]
basis/tools/memory/memory-docs.factor [changed mode: 0755->0644]
basis/tools/memory/memory.factor [changed mode: 0755->0644]
basis/tools/profiler/profiler-docs.factor [changed mode: 0755->0644]
basis/tools/profiler/profiler-tests.factor [changed mode: 0755->0644]
basis/tools/profiler/profiler.factor [changed mode: 0755->0644]
basis/tools/scaffold/scaffold-docs.factor
basis/tools/scaffold/scaffold.factor
basis/tools/test/test-docs.factor [changed mode: 0755->0644]
basis/tools/test/test.factor [changed mode: 0755->0644]
basis/tools/test/ui/ui.factor [changed mode: 0755->0644]
basis/tools/threads/threads.factor [changed mode: 0755->0644]
basis/tools/time/time-docs.factor [changed mode: 0755->0644]
basis/tools/vocabs/browser/browser-docs.factor [changed mode: 0755->0644]
basis/tools/vocabs/browser/browser-tests.factor [changed mode: 0755->0644]
basis/tools/vocabs/browser/browser.factor [changed mode: 0755->0644]
basis/tools/vocabs/monitor/monitor.factor [changed mode: 0755->0644]
basis/tools/vocabs/vocabs-docs.factor [changed mode: 0755->0644]
basis/tools/vocabs/vocabs.factor [changed mode: 0755->0644]
basis/tools/walker/debug/debug.factor [changed mode: 0755->0644]
basis/tools/walker/walker-tests.factor [changed mode: 0755->0644]
basis/tools/walker/walker.factor [changed mode: 0755->0644]
basis/tuple-arrays/tuple-arrays-tests.factor [changed mode: 0755->0644]
basis/ui/backend/backend.factor [changed mode: 0755->0644]
basis/ui/cocoa/cocoa.factor [changed mode: 0755->0644]
basis/ui/cocoa/tools/tools.factor [changed mode: 0755->0644]
basis/ui/cocoa/views/views.factor [changed mode: 0755->0644]
basis/ui/commands/commands.factor [changed mode: 0755->0644]
basis/ui/freetype/freetype-docs.factor [changed mode: 0755->0644]
basis/ui/freetype/freetype.factor [changed mode: 0755->0644]
basis/ui/gadgets/books/books-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/books/books-tests.factor [changed mode: 0755->0644]
basis/ui/gadgets/books/books.factor [changed mode: 0755->0644]
basis/ui/gadgets/buttons/buttons-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/buttons/buttons-tests.factor [changed mode: 0755->0644]
basis/ui/gadgets/buttons/buttons.factor [changed mode: 0755->0644]
basis/ui/gadgets/canvas/canvas-tests.factor [changed mode: 0755->0644]
basis/ui/gadgets/canvas/canvas.factor [changed mode: 0755->0644]
basis/ui/gadgets/editors/editors-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/editors/editors-tests.factor [changed mode: 0755->0644]
basis/ui/gadgets/editors/editors.factor [changed mode: 0755->0644]
basis/ui/gadgets/frames/frames-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/gadgets-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/gadgets-tests.factor [changed mode: 0755->0644]
basis/ui/gadgets/gadgets.factor [changed mode: 0755->0644]
basis/ui/gadgets/grid-lines/grid-lines-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/grid-lines/grid-lines.factor [changed mode: 0755->0644]
basis/ui/gadgets/grids/grids-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/incremental/incremental-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/incremental/incremental.factor [changed mode: 0755->0644]
basis/ui/gadgets/labelled/labelled-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/labelled/labelled.factor [changed mode: 0755->0644]
basis/ui/gadgets/labels/labels-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/labels/labels.factor [changed mode: 0755->0644]
basis/ui/gadgets/lists/lists-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/lists/lists.factor [changed mode: 0755->0644]
basis/ui/gadgets/menus/menus-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/packs/packs-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/packs/packs.factor [changed mode: 0755->0644]
basis/ui/gadgets/panes/panes-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/panes/panes-tests.factor [changed mode: 0755->0644]
basis/ui/gadgets/panes/panes.factor [changed mode: 0755->0644]
basis/ui/gadgets/presentations/presentations-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/scrollers/scrollers-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/scrollers/scrollers-tests.factor [changed mode: 0755->0644]
basis/ui/gadgets/scrollers/scrollers.factor [changed mode: 0755->0644]
basis/ui/gadgets/sliders/sliders-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/sliders/sliders.factor [changed mode: 0755->0644]
basis/ui/gadgets/slots/slots.factor [changed mode: 0755->0644]
basis/ui/gadgets/status-bar/status-bar-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/status-bar/status-bar.factor [changed mode: 0755->0644]
basis/ui/gadgets/theme/theme.factor
basis/ui/gadgets/tracks/tracks-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/viewports/viewports-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/viewports/viewports.factor [changed mode: 0755->0644]
basis/ui/gadgets/worlds/worlds-docs.factor [changed mode: 0755->0644]
basis/ui/gadgets/worlds/worlds.factor [changed mode: 0755->0644]
basis/ui/gestures/gestures.factor [changed mode: 0755->0644]
basis/ui/operations/operations-tests.factor [changed mode: 0755->0644]
basis/ui/operations/operations.factor [changed mode: 0755->0644]
basis/ui/render/render-docs.factor [changed mode: 0755->0644]
basis/ui/tools/browser/browser-tests.factor [changed mode: 0755->0644]
basis/ui/tools/browser/browser.factor [changed mode: 0755->0644]
basis/ui/tools/debugger/debugger-docs.factor [changed mode: 0755->0644]
basis/ui/tools/deploy/deploy-docs.factor [changed mode: 0755->0644]
basis/ui/tools/deploy/deploy.factor [changed mode: 0755->0644]
basis/ui/tools/interactor/interactor-docs.factor [changed mode: 0755->0644]
basis/ui/tools/interactor/interactor-tests.factor [changed mode: 0755->0644]
basis/ui/tools/interactor/interactor.factor [changed mode: 0755->0644]
basis/ui/tools/listener/listener-tests.factor [changed mode: 0755->0644]
basis/ui/tools/listener/listener.factor [changed mode: 0755->0644]
basis/ui/tools/operations/operations.factor [changed mode: 0755->0644]
basis/ui/tools/profiler/profiler.factor [changed mode: 0755->0644]
basis/ui/tools/search/search-tests.factor [changed mode: 0755->0644]
basis/ui/tools/search/search.factor [changed mode: 0755->0644]
basis/ui/tools/tools-docs.factor [changed mode: 0755->0644]
basis/ui/tools/tools-tests.factor [changed mode: 0755->0644]
basis/ui/tools/tools.factor [changed mode: 0755->0644]
basis/ui/tools/traceback/traceback.factor [changed mode: 0755->0644]
basis/ui/tools/walker/walker-docs.factor [changed mode: 0755->0644]
basis/ui/tools/walker/walker-tests.factor [changed mode: 0755->0644]
basis/ui/tools/walker/walker.factor [changed mode: 0755->0644]
basis/ui/tools/workspace/workspace-tests.factor [changed mode: 0755->0644]
basis/ui/tools/workspace/workspace.factor [changed mode: 0755->0644]
basis/ui/traverse/traverse-tests.factor [changed mode: 0755->0644]
basis/ui/ui-docs.factor [changed mode: 0755->0644]
basis/ui/ui.factor [changed mode: 0755->0644]
basis/ui/windows/windows.factor [changed mode: 0755->0644]
basis/ui/x11/x11.factor [changed mode: 0755->0644]
basis/unicode/breaks/breaks-tests.factor [changed mode: 0755->0644]
basis/unicode/breaks/breaks.factor [changed mode: 0755->0644]
basis/unicode/case/case-tests.factor [changed mode: 0755->0644]
basis/unicode/case/case.factor [changed mode: 0755->0644]
basis/unicode/collation/collation-tests.factor [changed mode: 0755->0644]
basis/unicode/collation/collation.factor [changed mode: 0755->0644]
basis/unicode/data/data.factor [changed mode: 0755->0644]
basis/unicode/normalize/normalize-tests.factor [changed mode: 0755->0644]
basis/unicode/normalize/normalize.factor [changed mode: 0755->0644]
basis/unicode/script/script-docs.factor [changed mode: 0755->0644]
basis/unicode/script/script-tests.factor [changed mode: 0755->0644]
basis/unicode/script/script.factor [changed mode: 0755->0644]
basis/unicode/syntax/syntax.factor [changed mode: 0755->0644]
basis/unix/bsd/bsd.factor [changed mode: 0755->0644]
basis/unix/linux/ifreq/ifreq.factor [changed mode: 0755->0644]
basis/unix/linux/linux.factor [changed mode: 0755->0644]
basis/unix/process/process.factor [changed mode: 0755->0644]
basis/unix/types/freebsd/freebsd.factor [changed mode: 0755->0644]
basis/unix/types/netbsd/32/32.factor [changed mode: 0755->0644]
basis/unix/types/netbsd/64/64.factor [changed mode: 0755->0644]
basis/unix/types/netbsd/netbsd.factor [changed mode: 0755->0644]
basis/unix/types/openbsd/openbsd.factor [changed mode: 0755->0644]
basis/unix/unix.factor [changed mode: 0755->0644]
basis/urls/secure/secure.factor [new file with mode: 0644]
basis/urls/urls.factor
basis/values/values-docs.factor [changed mode: 0755->0644]
basis/values/values-tests.factor [changed mode: 0755->0644]
basis/values/values.factor [changed mode: 0755->0644]
basis/windows/advapi32/advapi32.factor [changed mode: 0755->0644]
basis/windows/com/com-tests.factor [changed mode: 0755->0644]
basis/windows/com/com.factor [changed mode: 0755->0644]
basis/windows/com/syntax/syntax-docs.factor [changed mode: 0755->0644]
basis/windows/com/syntax/syntax.factor [changed mode: 0755->0644]
basis/windows/com/wrapper/wrapper-docs.factor [changed mode: 0755->0644]
basis/windows/com/wrapper/wrapper.factor [changed mode: 0755->0644]
basis/windows/dinput/constants/constants.factor [changed mode: 0755->0644]
basis/windows/dinput/dinput.factor [changed mode: 0755->0644]
basis/windows/gdi32/gdi32.factor [changed mode: 0755->0644]
basis/windows/kernel32/kernel32.factor [changed mode: 0755->0644]
basis/windows/messages/messages.factor [changed mode: 0755->0644]
basis/windows/ole32/ole32.factor [changed mode: 0755->0644]
basis/windows/opengl32/opengl32.factor [changed mode: 0755->0644]
basis/windows/user32/user32.factor [changed mode: 0755->0644]
basis/windows/winsock/winsock.factor [changed mode: 0755->0644]
basis/x11/clipboard/clipboard.factor [changed mode: 0755->0644]
basis/x11/windows/windows.factor [changed mode: 0755->0644]
basis/x11/xim/xim.factor [changed mode: 0755->0644]
basis/x11/xlib/xlib.factor [changed mode: 0755->0644]
basis/xml-rpc/xml-rpc.factor [changed mode: 0755->0644]
basis/xml/char-classes/char-classes.factor [changed mode: 0755->0644]
basis/xml/data/data.factor [changed mode: 0755->0644]
basis/xml/errors/errors-tests.factor [changed mode: 0755->0644]
basis/xml/tests/soap.factor [changed mode: 0755->0644]
basis/xml/utilities/utilities.factor [changed mode: 0755->0644]
basis/xmode/catalog/catalog.factor [changed mode: 0755->0644]
basis/xmode/code2html/code2html.factor [changed mode: 0755->0644]
basis/xmode/code2html/responder/responder.factor [changed mode: 0755->0644]
basis/xmode/loader/loader.factor [changed mode: 0755->0644]
basis/xmode/marker/marker-tests.factor [changed mode: 0755->0644]
basis/xmode/marker/marker.factor [changed mode: 0755->0644]
basis/xmode/marker/state/state.factor [changed mode: 0755->0644]
basis/xmode/rules/rules.factor [changed mode: 0755->0644]
basis/xmode/tokens/tokens.factor [changed mode: 0755->0644]
basis/xmode/utilities/utilities-tests.factor [changed mode: 0755->0644]
core/alien/alien-docs.factor [changed mode: 0755->0644]
core/alien/alien-tests.factor [changed mode: 0755->0644]
core/alien/alien.factor [changed mode: 0755->0644]
core/arrays/arrays-docs.factor [changed mode: 0755->0644]
core/arrays/arrays-tests.factor [changed mode: 0755->0644]
core/arrays/arrays.factor [changed mode: 0755->0644]
core/assocs/assocs-docs.factor [changed mode: 0755->0644]
core/assocs/assocs-tests.factor [changed mode: 0755->0644]
core/assocs/assocs.factor [changed mode: 0755->0644]
core/bootstrap/layouts/layouts.factor [changed mode: 0755->0644]
core/bootstrap/primitives.factor [changed mode: 0755->0644]
core/bootstrap/stage1.factor [changed mode: 0755->0644]
core/bootstrap/syntax.factor [changed mode: 0755->0644]
core/byte-arrays/byte-arrays-docs.factor [changed mode: 0755->0644]
core/byte-arrays/byte-arrays-tests.factor [changed mode: 0755->0644]
core/byte-arrays/byte-arrays.factor [changed mode: 0755->0644]
core/byte-vectors/byte-vectors-docs.factor [changed mode: 0755->0644]
core/byte-vectors/byte-vectors-tests.factor [changed mode: 0755->0644]
core/byte-vectors/byte-vectors.factor [changed mode: 0755->0644]
core/checksums/crc32/crc32.factor [changed mode: 0755->0644]
core/classes/algebra/algebra-docs.factor [changed mode: 0755->0644]
core/classes/algebra/algebra-tests.factor [changed mode: 0755->0644]
core/classes/algebra/algebra.factor [changed mode: 0755->0644]
core/classes/classes-docs.factor [changed mode: 0755->0644]
core/classes/classes-tests.factor [changed mode: 0755->0644]
core/classes/classes.factor [changed mode: 0755->0644]
core/classes/mixin/mixin-docs.factor [changed mode: 0755->0644]
core/classes/mixin/mixin.factor [changed mode: 0755->0644]
core/classes/predicate/predicate-docs.factor [changed mode: 0755->0644]
core/classes/predicate/predicate.factor [changed mode: 0755->0644]
core/classes/singleton/singleton.factor [changed mode: 0755->0644]
core/classes/tuple/tuple-docs.factor [changed mode: 0755->0644]
core/classes/tuple/tuple-tests.factor [changed mode: 0755->0644]
core/classes/tuple/tuple.factor [changed mode: 0755->0644]
core/classes/union/union-docs.factor [changed mode: 0755->0644]
core/classes/union/union.factor [changed mode: 0755->0644]
core/combinators/combinators-docs.factor [changed mode: 0755->0644]
core/combinators/combinators-tests.factor [changed mode: 0755->0644]
core/combinators/combinators.factor [changed mode: 0755->0644]
core/compiler/errors/errors-docs.factor [changed mode: 0755->0644]
core/compiler/errors/errors.factor [changed mode: 0755->0644]
core/compiler/units/units-docs.factor [changed mode: 0755->0644]
core/compiler/units/units.factor [changed mode: 0755->0644]
core/continuations/continuations-docs.factor [changed mode: 0755->0644]
core/continuations/continuations-tests.factor [changed mode: 0755->0644]
core/continuations/continuations.factor [changed mode: 0755->0644]
core/definitions/definitions-docs.factor [changed mode: 0755->0644]
core/definitions/definitions-tests.factor [changed mode: 0755->0644]
core/definitions/definitions.factor [changed mode: 0755->0644]
core/destructors/destructors-docs.factor [changed mode: 0755->0644]
core/destructors/destructors-tests.factor [changed mode: 0755->0644]
core/destructors/destructors.factor [changed mode: 0755->0644]
core/effects/effects.factor [changed mode: 0755->0644]
core/generic/generic-docs.factor [changed mode: 0755->0644]
core/generic/generic-tests.factor [changed mode: 0755->0644]
core/generic/generic.factor [changed mode: 0755->0644]
core/generic/math/math-docs.factor [changed mode: 0755->0644]
core/generic/math/math.factor [changed mode: 0755->0644]
core/growable/growable-docs.factor [changed mode: 0755->0644]
core/growable/growable-tests.factor [changed mode: 0755->0644]
core/hashtables/hashtables-docs.factor [changed mode: 0755->0644]
core/hashtables/hashtables-tests.factor [changed mode: 0755->0644]
core/hashtables/hashtables.factor [changed mode: 0755->0644]
core/init/init.factor [changed mode: 0755->0644]
core/io/backend/backend-tests.factor [changed mode: 0755->0644]
core/io/backend/backend.factor [changed mode: 0755->0644]
core/io/binary/binary-tests.factor [changed mode: 0755->0644]
core/io/binary/binary.factor [changed mode: 0755->0644]
core/io/encodings/binary/binary.factor [changed mode: 0755->0644]
core/io/encodings/encodings-tests.factor [changed mode: 0755->0644]
core/io/encodings/encodings.factor [changed mode: 0755->0644]
core/io/encodings/utf8/utf8-docs.factor [changed mode: 0755->0644]
core/io/encodings/utf8/utf8-tests.factor [changed mode: 0755->0644]
core/io/encodings/utf8/utf8.factor [changed mode: 0755->0644]
core/io/files/files-docs.factor [changed mode: 0755->0644]
core/io/files/files-tests.factor [changed mode: 0755->0644]
core/io/files/files.factor [changed mode: 0755->0644]
core/io/io-docs.factor [changed mode: 0755->0644]
core/io/io-tests.factor [changed mode: 0755->0644]
core/io/io.factor [changed mode: 0755->0644]
core/io/streams/c/c-docs.factor [changed mode: 0755->0644]
core/io/streams/c/c-tests.factor [changed mode: 0755->0644]
core/io/streams/c/c.factor [changed mode: 0755->0644]
core/io/streams/nested/nested.factor [changed mode: 0755->0644]
core/io/streams/string/string.factor [changed mode: 0755->0644]
core/kernel/kernel-docs.factor [changed mode: 0755->0644]
core/kernel/kernel-tests.factor [changed mode: 0755->0644]
core/kernel/kernel.factor [changed mode: 0755->0644]
core/layouts/layouts-docs.factor [changed mode: 0755->0644]
core/layouts/layouts-tests.factor [changed mode: 0755->0644]
core/layouts/layouts.factor [changed mode: 0755->0644]
core/math/floats/floats-tests.factor [changed mode: 0755->0644]
core/math/floats/floats.factor [changed mode: 0755->0644]
core/math/integers/integers-docs.factor [changed mode: 0755->0644]
core/math/integers/integers-tests.factor [changed mode: 0755->0644]
core/math/integers/integers.factor [changed mode: 0755->0644]
core/math/math-docs.factor [changed mode: 0755->0644]
core/math/math.factor [changed mode: 0755->0644]
core/math/parser/parser-tests.factor [changed mode: 0755->0644]
core/math/parser/parser.factor [changed mode: 0755->0644]
core/memory/memory-docs.factor [changed mode: 0755->0644]
core/memory/memory-tests.factor [changed mode: 0755->0644]
core/namespaces/namespaces-docs.factor [changed mode: 0755->0644]
core/parser/parser-docs.factor [changed mode: 0755->0644]
core/parser/parser-tests.factor [changed mode: 0755->0644]
core/parser/parser.factor [changed mode: 0755->0644]
core/parser/test/assert-depth.factor [changed mode: 0755->0644]
core/quotations/quotations-docs.factor [changed mode: 0755->0644]
core/quotations/quotations-tests.factor [changed mode: 0755->0644]
core/quotations/quotations.factor [changed mode: 0755->0644]
core/sbufs/sbufs.factor [changed mode: 0755->0644]
core/sequences/sequences-docs.factor [changed mode: 0755->0644]
core/sequences/sequences-tests.factor [changed mode: 0755->0644]
core/sequences/sequences.factor [changed mode: 0755->0644]
core/slots/slots-docs.factor [changed mode: 0755->0644]
core/slots/slots.factor [changed mode: 0755->0644]
core/sorting/sorting-tests.factor [changed mode: 0755->0644]
core/sorting/sorting.factor [changed mode: 0755->0644]
core/source-files/source-files-docs.factor [changed mode: 0755->0644]
core/source-files/source-files.factor [changed mode: 0755->0644]
core/splitting/splitting.factor [changed mode: 0755->0644]
core/strings/strings-docs.factor [changed mode: 0755->0644]
core/strings/strings-tests.factor [changed mode: 0755->0644]
core/strings/strings.factor [changed mode: 0755->0644]
core/syntax/syntax-docs.factor [changed mode: 0755->0644]
core/syntax/syntax.factor [changed mode: 0755->0644]
core/system/system-docs.factor [changed mode: 0755->0644]
core/system/system-tests.factor [changed mode: 0755->0644]
core/system/system.factor [changed mode: 0755->0644]
core/vectors/vectors-docs.factor [changed mode: 0755->0644]
core/vectors/vectors-tests.factor [changed mode: 0755->0644]
core/vectors/vectors.factor [changed mode: 0755->0644]
core/vocabs/loader/loader-docs.factor [changed mode: 0755->0644]
core/vocabs/loader/loader-tests.factor [changed mode: 0755->0644]
core/vocabs/loader/loader.factor [changed mode: 0755->0644]
core/vocabs/loader/test/a/a.factor [changed mode: 0755->0644]
core/vocabs/loader/test/b/b.factor [changed mode: 0755->0644]
core/vocabs/vocabs-docs.factor [changed mode: 0755->0644]
core/vocabs/vocabs.factor [changed mode: 0755->0644]
core/words/words-docs.factor [changed mode: 0755->0644]
core/words/words-tests.factor [changed mode: 0755->0644]
core/words/words.factor [changed mode: 0755->0644]
extra/assoc-heaps/assoc-heaps-docs.factor [new file with mode: 0644]
extra/assoc-heaps/assoc-heaps-tests.factor [new file with mode: 0644]
extra/assoc-heaps/assoc-heaps.factor [new file with mode: 0644]
extra/assoc-heaps/authors.txt [new file with mode: 0644]
extra/benchmark/mandel/colors/colors.factor
extra/bubble-chamber/bubble-chamber-docs.factor
extra/color-picker/color-picker.factor
extra/html/parser/analyzer/analyzer.factor
extra/printf/printf-docs.factor
extra/printf/printf-tests.factor
extra/printf/printf.factor
extra/spider/authors.txt [new file with mode: 0644]
extra/spider/spider-docs.factor [new file with mode: 0644]
extra/spider/spider.factor [new file with mode: 0644]
extra/suffix-arrays/authors.txt [new file with mode: 0755]
extra/suffix-arrays/suffix-arrays-docs.factor [new file with mode: 0755]
extra/suffix-arrays/suffix-arrays-tests.factor [new file with mode: 0755]
extra/suffix-arrays/suffix-arrays.factor [new file with mode: 0755]
extra/suffix-arrays/summary.txt [new file with mode: 0755]
extra/suffix-arrays/tags.txt [new file with mode: 0755]
extra/suffix-arrays/words/words.factor [new file with mode: 0755]
extra/webapps/irc-log/authors.txt [new file with mode: 0644]
extra/webapps/irc-log/irc-log.factor [new file with mode: 0644]
extra/webapps/planet/planet.factor
extra/websites/concatenative/concatenative.factor
unfinished/sql/sql-tests.factor [new file with mode: 0644]
unfinished/sql/sql.factor [new file with mode: 0755]
unmaintained/assoc-heaps/assoc-heaps-tests.factor [deleted file]
unmaintained/assoc-heaps/assoc-heaps.factor [deleted file]
unmaintained/assoc-heaps/authors.txt [deleted file]
unmaintained/assoc-heaps/summary.txt [deleted file]
unmaintained/webapps/help/authors.txt [deleted file]
unmaintained/webapps/help/help.factor [deleted file]
unmaintained/webapps/pastebin/annotate-paste.furnace [deleted file]
unmaintained/webapps/pastebin/annotation.furnace [deleted file]
unmaintained/webapps/pastebin/authors.txt [deleted file]
unmaintained/webapps/pastebin/footer.furnace [deleted file]
unmaintained/webapps/pastebin/header.furnace [deleted file]
unmaintained/webapps/pastebin/modes.furnace [deleted file]
unmaintained/webapps/pastebin/new-paste.furnace [deleted file]
unmaintained/webapps/pastebin/paste-list.furnace [deleted file]
unmaintained/webapps/pastebin/paste-summary.furnace [deleted file]
unmaintained/webapps/pastebin/pastebin.factor [deleted file]
unmaintained/webapps/pastebin/show-paste.furnace [deleted file]
unmaintained/webapps/pastebin/style.css [deleted file]
unmaintained/webapps/pastebin/syntax.furnace [deleted file]
unmaintained/webapps/planet/authors.txt [deleted file]
unmaintained/webapps/planet/planet.factor [deleted file]
unmaintained/webapps/planet/planet.furnace [deleted file]
unmaintained/webapps/planet/style.css [deleted file]
unmaintained/wee-url/load.factor [deleted file]
unmaintained/wee-url/responder.factor [deleted file]
unmaintained/wee-url/wee-url.factor [deleted file]

old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index f3f570b..db8e8c8
@@ -417,7 +417,7 @@ M: quotation '
     } [ [ bootstrap-word ] [ get ] bi ] H{ } map>assoc
     {
         class<=-cache class-not-cache classes-intersect-cache
-        class-and-cache class-or-cache
+        class-and-cache class-or-cache next-method-quot-cache
     } [ H{ } clone ] H{ } map>assoc assoc-union
     bootstrap-global set
     bootstrap-global emit-userenv ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 55fa5e10b866b594f218af28230749ca91f34fa6..791613e876ee7747bdae4902555adab3c2385f85 100644 (file)
@@ -26,6 +26,10 @@ HELP: with-cocoa
 { $values { "quot" quotation } }
 { $description "Sets up an autorelease pool, initializes the " { $snippet "NSApplication" } " singleton, and calls the quotation." } ;
 
+HELP: cocoa-app
+{ $values { "quot" quotation } }
+{ $description "Initializes Cocoa, calls the quotation, and starts the Cocoa event loop." } ;
+
 HELP: do-event
 { $values { "app" "an " { $snippet "NSApplication" } } { "?" "a boolean" } }
 { $description "Processes a pending event in the queue, if any, returning a boolean indicating if there was one. Does not block." } ;
@@ -46,13 +50,16 @@ HELP: objc-error
 { $error-description "Thrown by the Objective C runtime when an error occurs, for example, sending a message to an object with an unrecognized selector." } ;
 
 ARTICLE: "cocoa-application-utils" "Cocoa application utilities"
+"Utilities:"
 { $subsection NSApp }
-{ $subsection with-autorelease-pool }
-{ $subsection with-cocoa }
 { $subsection do-event }
 { $subsection add-observer }
 { $subsection remove-observer }
-{ $subsection install-delegate } ;
+{ $subsection install-delegate }
+"Combinators:"
+{ $subsection cocoa-app }
+{ $subsection with-autorelease-pool }
+{ $subsection with-cocoa } ;
 
 IN: cocoa.application
 ABOUT: "cocoa-application-utils"
old mode 100755 (executable)
new mode 100644 (file)
index a28952e..8f32782
@@ -30,7 +30,7 @@ IN: cocoa.application
 FUNCTION: void NSBeep ( ) ;
 
 : with-cocoa ( quot -- )
-    [ NSApp drop call ] with-autorelease-pool ;
+    [ NSApp drop call ] with-autorelease-pool ; inline
 
 : next-event ( app -- event )
     0 f CFRunLoopDefaultMode 1
@@ -50,6 +50,13 @@ FUNCTION: void NSBeep ( ) ;
 
 : finish-launching ( -- ) NSApp -> finishLaunching ;
 
+: cocoa-app ( quot -- )
+    [
+        call
+        finish-launching
+        NSApp -> run
+    ] with-cocoa ; inline
+
 : install-delegate ( receiver delegate -- )
     -> alloc -> init -> setDelegate: ;
 
index a97128825114cff17172339828923c64ffb1e2e4..dd8d331b35f2f13a3c174f19549c7560e29cb030 100644 (file)
@@ -16,9 +16,16 @@ HELP: SUPER->
 
 { send super-send POSTPONE: -> POSTPONE: SUPER-> } related-words
 
+HELP: IMPORT:
+{ $syntax "IMPORT: name" }
+{ $description "Makes an Objective C class available for use." } 
+{ $examples
+    { $code "IMPORT: QTMovie" "QTMovie \"My Movie.mov\" <NSString> f -> movieWithFile:error:" }
+} ;
+
 ARTICLE: "objc-calling" "Calling Objective C code"
 "Before an Objective C class can be used, it must be imported; by default, a small set of common classes are imported automatically, but additional classes can be imported as needed."
-{ $subsection import-objc-class }
+{ $subsection POSTPONE: IMPORT: }
 "Every imported Objective C class has as corresponding class word in the " { $vocab-link "cocoa.classes" } " vocabulary. Class words push the class object in the stack, allowing class methods to be invoked."
 $nl
 "Messages can be sent to classes and instances using a pair of parsing words:"
old mode 100755 (executable)
new mode 100644 (file)
index 744d577..ab86796
@@ -3,7 +3,7 @@
 USING: compiler io kernel cocoa.runtime cocoa.subclassing
 cocoa.messages cocoa.types sequences words vocabs parser
 core-foundation namespaces assocs hashtables compiler.units
-lexer ;
+lexer init ;
 IN: cocoa
 
 : (remember-send) ( selector variable -- )
@@ -27,6 +27,16 @@ SYMBOL: super-sent-messages
     scan dup remember-super-send parsed \ super-send parsed ;
     parsing
 
+SYMBOL: frameworks
+
+frameworks global [ V{ } clone or ] change-at
+
+[ frameworks get [ load-framework ] each ] "cocoa.messages" add-init-hook
+
+: FRAMEWORK: scan [ load-framework ] [ frameworks get push ] bi ; parsing
+
+: IMPORT: scan [ ] import-objc-class ; parsing
+
 "Compiling Objective C bridge..." print
 
 "cocoa.classes" create-vocab drop
index f78981c923b9b1e3c9f31346fd2febaff037e851..9b5e3fdfd9920f598a01df9d32247da32efb7cb8 100644 (file)
@@ -32,11 +32,7 @@ HELP: alien>objc-types
 
 HELP: import-objc-class
 { $values { "name" string } { "quot" "a quotation with stack effect " { $snippet "( -- )" } } }
-{ $description "If a class named " { $snippet "name" } " is already known to the Objective C interface, does nothing. Otherwise, first calls the quotation. The quotation should make the class available to the Objective C runtime if necessary, either by loading a framework or defining it directly. After the quotation returns, this word makes the class available to Factor programs by importing methods and creating a class word the class object in the " { $vocab-link "cocoa.classes" } " vocabulary." }
-{ $notes "In most cases, the quotation should be " { $link f } "." }
-{ $examples
-    { $code "\"QTMovie\" f import-objc-class" "QTMovie \"My Movie.mov\" <NSString> f -> movieWithFile:error:" }
-} ;
+{ $description "If a class named " { $snippet "name" } " is already known to the Objective C interface, does nothing. Otherwise, first calls the quotation. The quotation should make the class available to the Objective C runtime if necessary, either by loading a framework or defining it directly. After the quotation returns, this word makes the class available to Factor programs by importing methods and creating a class word the class object in the " { $vocab-link "cocoa.classes" } " vocabulary." } ;
 
 HELP: root-class
 { $values { "class" alien } { "root" alien } }
old mode 100755 (executable)
new mode 100644 (file)
index 7977485..09601ef
@@ -4,7 +4,8 @@ USING: accessors alien alien.c-types alien.strings arrays assocs
 combinators compiler kernel math namespaces make parser
 prettyprint prettyprint.sections quotations sequences strings
 words cocoa.runtime io macros memoize debugger
-io.encodings.ascii effects compiler.generator libc libc.private ;
+io.encodings.ascii effects compiler.generator libc libc.private
+parser lexer init core-foundation ;
 IN: cocoa.messages
 
 : make-sender ( method function -- quot )
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 77a1f46c87296110e4db7418ce4322c871fca4f4..1183c2e46c9cec55a431a81c087ecfe881232a87 100644 (file)
@@ -1,48 +1,33 @@
-! Copyright (C) 2003, 2007, 2008 Slava Pestov.
+! Copyright (C) 2003, 2008 Slava Pestov.
+! Copyright (C) 2008 Eduardo Cavazos.
 ! See http://factorcode.org/license.txt for BSD license.
-
-USING: kernel combinators sequences arrays classes.tuple accessors colors.hsv ;
-
+USING: kernel accessors ;
 IN: colors
 
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
 TUPLE: color ;
 
 TUPLE: rgba < color red green blue alpha ;
 
-TUPLE: hsva < color hue saturation value alpha ;
-
-TUPLE: gray < color gray alpha ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+C: <rgba> rgba
 
 GENERIC: >rgba ( object -- rgba )
 
 M: rgba >rgba ( rgba -- rgba ) ;
 
-M: hsva >rgba ( hsva -- rgba )
-  { [ hue>> ] [ saturation>> ] [ value>> ] [ alpha>> ] } cleave 4array
-  [ hsv>rgb ] [ peek ] bi suffix first4 rgba boa ;
-
-M: gray >rgba ( gray -- rgba ) [ gray>> dup dup ] [ alpha>> ] bi rgba boa ;
-
 M: color red>>   ( color -- red   ) >rgba red>>   ;
 M: color green>> ( color -- green ) >rgba green>> ;
 M: color blue>>  ( color -- blue  ) >rgba blue>>  ;
 
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: black        T{ rgba f 0.0   0.0   0.0   1.0  } ;
-: blue         T{ rgba f 0.0   0.0   1.0   1.0  } ;
-: cyan         T{ rgba f 0     0.941 0.941 1    } ;
-: gray         T{ rgba f 0.6   0.6   0.6   1.0  } ;
-: green        T{ rgba f 0.0   1.0   0.0   1.0  } ;
-: light-gray   T{ rgba f 0.95  0.95  0.95  0.95 } ;
-: light-purple T{ rgba f 0.8   0.8   1.0   1.0  } ;
-: magenta      T{ rgba f 0.941 0     0.941 1    } ;
-: orange       T{ rgba f 0.941 0.627 0     1    } ;
-: purple       T{ rgba f 0.627 0     0.941 1    } ;
-: red          T{ rgba f 1.0   0.0   0.0   1.0  } ;
-: white        T{ rgba f 1.0   1.0   1.0   1.0  } ;
-: yellow       T{ rgba f 1.0   1.0   0.0   1.0  } ;
+: black        T{ rgba f 0.0   0.0   0.0   1.0  } ; inline
+: blue         T{ rgba f 0.0   0.0   1.0   1.0  } ; inline
+: cyan         T{ rgba f 0     0.941 0.941 1    } ; inline
+: gray         T{ rgba f 0.6   0.6   0.6   1.0  } ; inline
+: green        T{ rgba f 0.0   1.0   0.0   1.0  } ; inline
+: light-gray   T{ rgba f 0.95  0.95  0.95  0.95 } ; inline
+: light-purple T{ rgba f 0.8   0.8   1.0   1.0  } ; inline
+: magenta      T{ rgba f 0.941 0     0.941 1    } ; inline
+: orange       T{ rgba f 0.941 0.627 0     1    } ; inline
+: purple       T{ rgba f 0.627 0     0.941 1    } ; inline
+: red          T{ rgba f 1.0   0.0   0.0   1.0  } ; inline
+: white        T{ rgba f 1.0   1.0   1.0   1.0  } ; inline
+: yellow       T{ rgba f 1.0   1.0   0.0   1.0  } ; inline
diff --git a/basis/colors/gray/gray.factor b/basis/colors/gray/gray.factor
new file mode 100644 (file)
index 0000000..26ec117
--- /dev/null
@@ -0,0 +1,11 @@
+! Copyright (C) 2008 Eduardo Cavazos.
+! See http://factorcode.org/license.txt for BSD license.
+USING: colors kernel accessors ;
+IN: colors.gray
+
+TUPLE: gray < color gray alpha ;
+
+C: <gray> gray
+
+M: gray >rgba ( gray -- rgba )
+    [ gray>> dup dup ] [ alpha>> ] bi <rgba> ;
diff --git a/basis/colors/hsv/hsv-tests.factor b/basis/colors/hsv/hsv-tests.factor
new file mode 100644 (file)
index 0000000..8a73655
--- /dev/null
@@ -0,0 +1,26 @@
+IN: colors.hsv.tests
+USING: accessors kernel colors colors.hsv tools.test math ;
+
+: hsv>rgb ( h s v -- r g b )
+    [ 360 * ] 2dip
+    1 <hsva> >rgba [ red>> ] [ green>> ] [ blue>> ] tri ;
+
+[ 1/2 1/2 1/2 ] [ 0 0 1/2 hsv>rgb ] unit-test
+
+[ 1/2 1/4 1/4 ] [ 0 1/2 1/2 hsv>rgb ] unit-test
+[ 1/3 2/9 2/9 ] [ 0 1/3 1/3 hsv>rgb ] unit-test
+
+[ 24/125 1/5 4/25 ] [ 1/5 1/5 1/5 hsv>rgb ] unit-test
+[ 29/180 1/6 5/36 ] [ 1/5 1/6 1/6 hsv>rgb ] unit-test
+
+[ 6/25 2/5 38/125 ] [ 2/5 2/5 2/5 hsv>rgb ] unit-test
+[ 8/25 4/5 64/125 ] [ 2/5 3/5 4/5 hsv>rgb ] unit-test
+
+[ 6/25 48/125 3/5 ] [ 3/5 3/5 3/5 hsv>rgb ] unit-test
+[ 0 0 0 ] [ 3/5 1/5 0 hsv>rgb ] unit-test
+
+[ 84/125 4/25 4/5 ] [ 4/5 4/5 4/5 hsv>rgb ] unit-test
+[ 7/15 1/3 1/2 ] [ 4/5 1/3 1/2 hsv>rgb ] unit-test
+
+[ 5/6 5/36 5/6 ] [ 5/6 5/6 5/6 hsv>rgb ] unit-test
+[ 1/6 0 1/6 ] [ 5/6 1 1/6 hsv>rgb ] unit-test
index dd2811822be91a55e7e9d5114d5b36d2ba9406cb..6f658818a1ceda2b685abaeff31bf537c6bd2073 100644 (file)
@@ -1,41 +1,38 @@
-! Copyright (C) 2007 Eduardo Cavazos
+! Copyright (C) 2008 Eduardo Cavazos.
 ! See http://factorcode.org/license.txt for BSD license.
-
-USING: kernel combinators arrays sequences math math.functions ;
-
+USING: colors kernel combinators math math.functions accessors ;
 IN: colors.hsv
 
-<PRIVATE
-
-: H ( hsv -- H ) first ;
-
-: S ( hsv -- S ) second ;
+! h [0,360)
+! s [0,1]
+! v [0,1]
+TUPLE: hsva < color hue saturation value alpha ;
 
-: V ( hsv -- V ) third ;
+C: <hsva> hsva
 
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+<PRIVATE
 
-: Hi ( hsv -- Hi ) H 60 / floor 6 mod ;
+: Hi ( hsv -- Hi ) hue>> 60 / floor 6 mod ; inline
 
-: f ( hsv -- f ) [ H 60 / ] [ Hi ] bi - ;
+: f ( hsv -- f ) [ hue>> 60 / ] [ Hi ] bi - ; inline
 
-: p ( hsv -- p ) [ S 1 swap - ] [ V ] bi * ;
+: p ( hsv -- p ) [ saturation>> 1 swap - ] [ value>> ] bi * ; inline
 
-: q ( hsv -- q ) [ [ f ] [ S ] bi * 1 swap - ] [ V ] bi * ;
+: q ( hsv -- q ) [ [ f ] [ saturation>> ] bi * 1 swap - ] [ value>> ] bi * ; inline
 
-: t ( hsv -- t ) [ [ f 1 swap - ] [ S ] bi * 1 swap - ] [ V ] bi * ;
+: t ( hsv -- t ) [ [ f 1 swap - ] [ saturation>> ] bi * 1 swap - ] [ value>> ] bi * ; inline
 
 PRIVATE>
 
-! h [0,360)
-! s [0,1]
-! v [0,1]
-
-: hsv>rgb ( hsv -- rgb )
-dup Hi
-{ { 0 [ [ V ] [ t ] [ p ] tri ] }
-  { 1 [ [ q ] [ V ] [ p ] tri ] }
-  { 2 [ [ p ] [ V ] [ t ] tri ] }
-  { 3 [ [ p ] [ q ] [ V ] tri ] }
-  { 4 [ [ t ] [ p ] [ V ] tri ] }
-  { 5 [ [ V ] [ p ] [ q ] tri ] } } case 3array ;
+M: hsva >rgba ( hsva -- rgba )
+    [
+        dup Hi
+        {
+            { 0 [ [ value>> ] [ t ] [ p ] tri ] }
+            { 1 [ [ q ] [ value>> ] [ p ] tri ] }
+            { 2 [ [ p ] [ value>> ] [ t ] tri ] }
+            { 3 [ [ p ] [ q ] [ value>> ] tri ] }
+            { 4 [ [ t ] [ p ] [ value>> ] tri ] }
+            { 5 [ [ value>> ] [ p ] [ q ] tri ] }
+        } case
+    ] [ alpha>> ] bi <rgba> ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 4c39da0..f1b3e32
@@ -362,3 +362,18 @@ TUPLE: some-tuple x ;
 [ B{ 0 1 2 3 4 5 6 7 } ] [ [ 8 [ ] B{ } map-as ] compile-call ] unit-test
 
 [ 0 ] [ 1234 [ { fixnum } declare -64 shift ] compile-call ] unit-test
+
+! Loop detection problem found by doublec
+SYMBOL: counter
+
+DEFER: loop-bbb
+
+: loop-aaa ( -- )
+    counter inc counter get 2 < [ loop-bbb ] when ; inline recursive
+
+: loop-bbb ( -- )
+    [ loop-aaa ] with-scope ; inline recursive
+
+: loop-ccc ( -- ) loop-bbb ;
+
+[ 0 ] [ 0 counter set loop-ccc counter get ] unit-test
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index d73e8b7db1d05c0bf57394d8fc3fdcbd0ccd856d..19ee051ac6706fff1340e2a196a78d5c90320d40 100644 (file)
@@ -8,7 +8,7 @@ math.functions math.private strings layouts
 compiler.tree.propagation.info compiler.tree.def-use
 compiler.tree.debugger compiler.tree.checker
 slots.private words hashtables classes assocs locals
-float-arrays ;
+float-arrays system ;
 IN: compiler.tree.propagation.tests
 
 \ propagate must-infer
@@ -590,6 +590,8 @@ MIXIN: empty-mixin
 
 [ V{ float-array } ] [ [| | F{ } ] final-classes ] unit-test
 
+[ V{ t } ] [ [ netbsd unix? ] final-literals ] unit-test
+
 ! [ V{ string } ] [
 !     [ dup string? t xor [ "A" throw ] [ ] if ] final-classes
 ! ] unit-test
index 7fc38239f1cfb56f2e247b4116c00602d3a9485d..d586ff398ff6399e6a5afcf09a639dac1b5729d9 100644 (file)
@@ -76,13 +76,25 @@ M: #declare propagate-before
 : fold-call ( #call word -- )
     [ (fold-call) ] [ drop out-d>> ] 2bi set-value-infos ;
 
-: predicate-output-infos ( info class -- info )
+: predicate-output-infos/literal ( info class -- info )
+    [ literal>> ] dip
+    '[ _ _ instance? <literal-info> ]
+    [ drop object-info ]
+    recover ;
+
+: predicate-output-infos/class ( info class -- info )
     [ class>> ] dip {
         { [ 2dup class<= ] [ t <literal-info> ] }
         { [ 2dup classes-intersect? not ] [ f <literal-info> ] }
         [ object-info ]
     } cond 2nip ;
 
+: predicate-output-infos ( info class -- info )
+    over literal?>>
+    [ predicate-output-infos/literal ]
+    [ predicate-output-infos/class ]
+    if ;
+
 : propagate-predicate ( #call word -- infos )
     #! We need to force the caller word to recompile when the class
     #! is redefined, since now we're making assumptions but the
index c66c182869122630aa48c21b2c89c9a9473cb703..b1f94060924f8c4e054143132d185f478c13dc3f 100644 (file)
@@ -148,3 +148,27 @@ DEFER: a'
     [ a' ] build-tree analyze-recursive
     \ b' label-is-loop?
 ] unit-test
+
+DEFER: a''
+
+: b'' ( -- )
+    a'' ; inline recursive
+
+: a'' ( -- )
+    b'' a'' ; inline recursive
+
+[ t ] [
+    [ a'' ] build-tree analyze-recursive
+    \ a'' label-is-not-loop?
+] unit-test
+
+: loop-in-non-loop ( x quot: ( i -- ) -- )
+    over 0 > [
+        [ [ 1 - ] dip loop-in-non-loop ] [ call ] 2bi
+    ] [ 2drop ] if ; inline recursive
+
+[ t ] [
+    [ 10 [ [ drop ] each-integer ] loop-in-non-loop ]
+    build-tree analyze-recursive
+    \ (each-integer) label-is-loop?
+] unit-test
index d1e4c7c70e8d6ff1d0181d65920f2dd4e55674ae..d257cd660078fd74a30d5425ed2ad94f34313e5e 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel assocs namespaces accessors sequences deques
+USING: kernel assocs arrays namespaces accessors sequences deques
 search-deques compiler.tree compiler.tree.combinators ;
 IN: compiler.tree.recursive
 
@@ -50,11 +50,10 @@ GENERIC: collect-loop-info* ( tail? node -- )
     loop-stack get length swap loop-heights get set-at ;
 
 M: #recursive collect-loop-info*
-    nip
     [
         [
             label>>
-            [ loop-stack [ swap suffix ] change ]
+            [ swap 2array loop-stack [ swap suffix ] change ]
             [ remember-loop-info ]
             [ t >>loop? drop ]
             tri
@@ -62,7 +61,7 @@ M: #recursive collect-loop-info*
         [ t swap child>> (collect-loop-info) ] bi
     ] with-scope ;
 
-: current-loop-nesting ( label -- labels )
+: current-loop-nesting ( label -- alist )
     loop-stack get swap loop-heights get at tail ;
 
 : disqualify-loop ( label -- )
@@ -71,7 +70,10 @@ M: #recursive collect-loop-info*
 M: #call-recursive collect-loop-info*
     label>>
     swap [ dup disqualify-loop ] unless
-    dup current-loop-nesting [ loop-calls get push-at ] with each ;
+    dup current-loop-nesting
+    [ keys [ loop-calls get push-at ] with each ]
+    [ [ nip not ] assoc-filter keys [ disqualify-loop ] each ]
+    bi ;
 
 M: #if collect-loop-info*
     children>> [ (collect-loop-info) ] with each ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 5e2f1bb..99ad239
@@ -10,7 +10,7 @@ SYMBOL: local-node
 
 : handle-node-client ( -- )
     deserialize
-    [ first2 get-process send ] [ stop-server ] if* ;
+    [ first2 get-process send ] [ stop-this-server ] if* ;
 
 : <node-server> ( addrspec -- threaded-server )
     <threaded-server>
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 74b72b87893b89500da72a9eecbfd3229330763f..b0a01269aba92b11a3efef18b65556aac6f9fb9a 100644 (file)
@@ -5,27 +5,19 @@ alien assocs strings math multiline quotations ;
 IN: db
 
 HELP: db
-{ $description "The " { $snippet "db" } " class is the superclass of all other database classes.  It stores a " { $snippet "handle" } " to the database as well as insert, update, and delete queries." } ;
+{ $description "The " { $snippet "db" } " class is the superclass of all other database classes. It stores a " { $snippet "handle" } " to the database as well as insert, update, and delete queries." } ;
 
 HELP: new-db
 { $values { "class" class } { "obj" object } }
-{ $description "Creates a new database object from a given class." } ;
-
-HELP: make-db*
-{ $values { "object" object } { "db" object } { "db" object } }
-{ $description "Takes a sequence of parameters specific to each database and a class name of the database, and constructs a new database object." } ;
-
-HELP: make-db
-{ $values { "object" object } { "class" class } { "db" db } }
-{ $description "Takes a sequence of parameters specific to each database and a class name of the database, and constructs a new database object." } ;
+{ $description "Creates a new database object from a given class with caches for prepared statements. Does not actually connect to the database until " { $link db-open } " or " { $link with-db } " is called." } ;
 
 HELP: db-open
 { $values { "db" db } { "db" db } }
-{ $description "Opens a database using the configuration data stored in a " { $link db } " tuple." } ;
+{ $description "Opens a database using the configuration data stored in a " { $link db } " tuple. The database object now references a database handle that must be cleaned up. Therefore, it is better to use the " { $link with-db } " combinator than calling this word directly." } ;
 
 HELP: db-close
 { $values { "handle" alien } }
-{ $description "Closes a database using the handle provided." } ;
+{ $description "Closes a database using the handle provided. Use of the " { $link with-db } " combinator is preferred over manually opening and closing databases so that resources are not leaked." } ;
 
 HELP: dispose-statements
 { $values { "assoc" assoc } }
@@ -38,30 +30,18 @@ HELP: db-dispose
 HELP: statement
 { $description "A " { $snippet "statement" } " stores the information about a statemen, such as the SQL statement text, the in/out parameters, and type information." } ;
 
-HELP: simple-statement
-{ $description } ;
-
-HELP: prepared-statement
-{ $description } ;
-
 HELP: result-set
 { $description "An object encapsulating a raw SQL result object. There are two ways in which a result set can be accessed, but they are specific to the database backend in use."
     { $subsection "db-random-access-result-set" }
     { $subsection "db-sequential-result-set" }
 } ;
 
-HELP: init-result-set
-{ $values
-     { "result-set" result-set } }
-{ $description "" } ;
-
 HELP: new-result-set
 { $values
      { "query" "a query" } { "handle" alien } { "class" class }
      { "result-set" result-set } }
 { $description "Creates a new " { $link result-set } " object of type " { $snippet "class" } "." } ;
 
-
 HELP: new-statement
 { $values { "sql" string } { "in" sequence } { "out" sequence } { "class" class } { "statement" statement } }
 { $description "Makes a new statement object from the given parameters." } ;
@@ -80,18 +60,6 @@ HELP: prepare-statement
 { $values { "statement" statement } }
 { $description "For databases which implement a method on this generic, it does some internal processing to ready the statement for execution." } ;
 
-HELP: bind-statement*
-{ $values { "statement" statement } }
-{ $description "" } ;
-
-HELP: low-level-bind
-{ $values { "statement" statement } }
-{ $description "" } ;
-
-HELP: bind-tuple
-{ $values { "tuple" tuple } { "statement" statement } }
-{ $description "" } ;
-
 HELP: query-results
 { $values { "query" object }
     { "result-set" result-set }
@@ -125,41 +93,14 @@ HELP: more-rows?
 { $values { "result-set" result-set } { "?" "a boolean" } }
 { $description "Returns true if the " { $link result-set } " has more rows to traverse." } ;
 
-HELP: execute-statement*
-{ $values { "statement" statement } { "type" object } }
-{ $description } ;
-
-HELP: execute-one-statement
-{ $values
-     { "statement" null } }
-{ $description "" } ;
-
-HELP: execute-statement
-{ $values { "statement" statement } }
-{ $description "" } ;
-
-
-
-
 
 
 HELP: begin-transaction
 { $description "Begins a new transaction. User code should make use of the " { $link with-transaction } " combinator." } ;
 
-HELP: bind-statement
-{ $values
-     { "obj" object } { "statement" null } }
-{ $description "" } ;
-
 HELP: commit-transaction
 { $description "Commits a transaction. User code should make use of the " { $link with-transaction } " combinator." } ;
 
-HELP: default-query
-{ $values
-     { "query" null }
-     { "result-set" null } }
-{ $description "" } ;
-
 HELP: in-transaction
 { $description "A variable that is set true when a transaction is in progress." } ;
 
@@ -170,14 +111,14 @@ HELP: in-transaction?
 
 HELP: query-each
 { $values
-     { "statement" null } { "quot" quotation } }
-{ $description "" } ;
+     { "statement" statement } { "quot" quotation } }
+{ $description "A combinator that calls a quotation on a sequence of SQL statements to their results query results." } ;
 
 HELP: query-map
 { $values
-     { "statement" null } { "quot" quotation }
+     { "statement" statement } { "quot" quotation }
      { "seq" sequence } }
-{ $description "" } ;
+{ $description "A combinator that maps a sequence of SQL statements to their results query results." } ;
 
 HELP: rollback-transaction
 { $description "Rolls back a transaction; no data is committed to the database. User code should make use of the " { $link with-transaction } " combinator." } ;
@@ -211,7 +152,7 @@ HELP: sql-row-typed
 
 HELP: with-db
 { $values
-     { "seq" sequence } { "class" class } { "quot" quotation } }
+     { "db" db } { "quot" quotation } }
 { $description "Calls the quotation with a database bound to the " { $link db } " symbol. The database called is based on the " { $snippet "class" } " with the " } ;
 
 HELP: with-transaction
@@ -247,7 +188,7 @@ $nl
 { $subsection row-column-typed } ;
 
 ARTICLE: "db-sequential-result-set" "Sequential result sets"
-"Sequential result sets can be iterated one element after the next.  SQLite's result sets offer this method of traversal."
+"Sequential result sets can be iterated one element after the next. SQLite's result sets offer this method of traversal."
 $nl
 "Databases which work in this way must provide methods for the following traversal words:"
 { $subsection more-rows? }
@@ -272,26 +213,52 @@ $nl
 { $subsection row-column-typed } ;
 
 ARTICLE: "db-protocol" "Low-level database protocol"
-"The high-level protocol (see " { $vocab-link "db.tuples" } ") uses this low-level protocol for executing statements and queries."
+"The high-level protocol (see " { $vocab-link "db.tuples" } ") uses this low-level protocol for executing statements and queries." $nl
+"Opening a database:"
+{ $subsection db-open }
+"Closing a database:"
+{ $subsection db-close }
+"Creating tatements:"
+{ $subsection <simple-statement> }
+{ $subsection <prepared-statement> }
+"Using statements with the database:"
+{ $subsection prepare-statement }
+{ $subsection bind-statement* }
+{ $subsection low-level-bind }
+"Performing a query:"
+{ $subsection query-results }
+"Handling query results:"
+{ $subsection "db-result-sets" }
 ;
+! { $subsection bind-tuple }
 
 ARTICLE: "db-lowlevel-tutorial" "Low-level database tutorial"
 "Although Factor makes integrating a database with its object system easy (see " { $vocab-link "db.tuples" } "), sometimes you may want to write SQL directly and get the results back as arrays of strings, for instance, when interfacing with a legacy database that doesn't easily map to " { $snippet "tuples" } "."
 ;
 
 ARTICLE: "db-porting-the-library" "Porting the database library"
-"This section is not yet written."
+"There are two layers to implement when porting the database library."
+{ $subsection "db-protocol" }
 ;
 
 ARTICLE: "db-custom-database-combinators" "Custom database combinators"
-"Every database library requires some effort on the programmer's part to initialize and open a database.  SQLite uses files on your harddisk, so a simple pathname is all the setup required. With PostgreSQL, you log in to a networked server as a user on a specfic port." $nl
+"Every database library requires some effort on the programmer's part to initialize and open a database. SQLite uses files on your harddisk, so a simple pathname is all the setup required. With PostgreSQL, you log in to a networked server as a user on a specfic port." $nl
 
-"Make a " { $snippet "with-" } " word to open, close, and use your database."
+"Make a " { $snippet "with-" } " combinator to open and close a database so that resources are not leaked."
 { $code <"
 USING: db.sqlite db io.files ;
-: with-my-database ( quot -- )
-    { "my-database.db" temp-file } sqlite-db rot with-db ;
-"> }
+: with-sqlite-db ( quot -- )
+    "my-database.db" temp-file <sqlite-db> rot with-db ;"> } 
+
+{ $code <" USING: db.postgresql db ;
+: with-postgresql-db ( quot -- )
+    <postgresql-db>
+        "localhost" >>host
+        "erg" >>username
+        "secrets?" >>password
+        "factor-test" >>database
+    swap with-db ;">
+}
 
 ;
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 87bf21d..5b159d0
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays assocs classes continuations destructors kernel math
 namespaces sequences classes.tuple words strings
-tools.walker accessors combinators ;
+tools.walker accessors combinators fry ;
 IN: db
 
 TUPLE: db
@@ -17,10 +17,6 @@ TUPLE: db
         H{ } clone >>update-statements
         H{ } clone >>delete-statements ; inline
 
-GENERIC: make-db* ( object db -- db )
-
-: make-db ( object class -- db ) new-db make-db* ;
-
 GENERIC: db-open ( db -- db )
 HOOK: db-close db ( handle -- )
 
@@ -111,10 +107,9 @@ M: object execute-statement* ( statement type -- )
 : query-map ( statement quot -- seq )
     accumulator [ query-each ] dip { } like ; inline
 
-: with-db ( seq class quot -- )
-    [ make-db db-open db ] dip
-    [ db get swap [ drop ] prepose with-disposal ] curry with-variable ;
-    inline
+: with-db ( db quot -- )
+    [ db-open db ] dip
+    '[ db get [ drop @ ] with-disposal ] with-variable ; inline
 
 : default-query ( query -- result-set )
     query-results [ [ sql-row ] query-map ] with-disposal ;
index 63153c451ea0bed6fd5b9eb9dc2437816b75f719..8bc5e87f0ea4ef26f17fed72410746c70e9c4306 100644 (file)
@@ -1,21 +1,20 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel arrays namespaces sequences continuations
-io.pools db ;
+io.pools db fry ;
 IN: db.pools
 
-TUPLE: db-pool < pool db params ;
+TUPLE: db-pool < pool db ;
 
-: <db-pool> ( params db -- pool )
+: <db-pool> ( db -- pool )
     db-pool <pool>
-        swap >>db
-        swap >>params ;
+        swap >>db ;
 
-: with-db-pool ( db params quot -- )
-    >r <db-pool> r> with-pool ; inline
+: with-db-pool ( db quot -- )
+    [ <db-pool> ] dip with-pool ; inline
 
 M: db-pool make-connection ( pool -- )
-    [ params>> ] [ db>> ] bi make-db db-open ;
+    db>> db-open ;
 
 : with-pooled-db ( pool quot -- )
-    [ db swap with-variable ] curry with-pooled-connection ; inline
+    '[ db _ with-variable ] with-pooled-connection ; inline
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 28548d1..08df25c
@@ -10,28 +10,24 @@ USE: tools.walker
 IN: db.postgresql
 
 TUPLE: postgresql-db < db
-    host port pgopts pgtty db user pass ;
+    host port pgopts pgtty database username password ;
+
+: <postgresql-db> ( -- postgresql-db )
+    postgresql-db new-db ;
 
 TUPLE: postgresql-statement < statement ;
 
 TUPLE: postgresql-result-set < result-set ;
 
-M: postgresql-db make-db* ( seq db -- db )
-    >r first4 r>
-        swap >>db
-        swap >>pass
-        swap >>user
-        swap >>host ;
-
 M: postgresql-db db-open ( db -- db )
     dup {
         [ host>> ]
         [ port>> ]
         [ pgopts>> ]
         [ pgtty>> ]
-        [ db>> ]
-        [ user>> ]
-        [ pass>> ]
+        [ database>> ]
+        [ username>> ]
+        [ password>> ]
     } cleave connect-postgres >>handle ;
 
 M: postgresql-db dispose ( db -- )
@@ -102,7 +98,7 @@ M: postgresql-result-set dispose ( result-set -- )
 
 M: postgresql-statement prepare-statement ( statement -- )
     dup
-    >r db get handle>> f r>
+    [ db get handle>> f ] dip
     [ sql>> ] [ in-params>> ] bi
     length f PQprepare postgresql-error
     >>handle drop ;
@@ -121,7 +117,8 @@ M: postgresql-db bind% ( spec -- )
     bind-name% 1, ;
 
 M: postgresql-db bind# ( spec object -- )
-    >r bind-name% f swap type>> r> <literal-bind> 1, ;
+    [ bind-name% f swap type>> ] dip
+    <literal-bind> 1, ;
 
 : create-table-sql ( class -- statement )
     [
@@ -143,7 +140,7 @@ M: postgresql-db bind# ( spec object -- )
 
 : create-function-sql ( class -- statement )
     [
-        >r remove-id r>
+        [ remove-id ] dip
         "create function add_" 0% dup 0%
         "(" 0%
         over [ "," 0% ]
index f7809de578180097928ae73c859464d767addbd4..768ec70185b2b51d3047fbc64f0420e69b1a1c02 100644 (file)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel math namespaces make sequences random
 strings math.parser math.intervals combinators math.bitwise
-nmake db db.tuples db.types db.sql classes words shuffle arrays
-destructors continuations db.tuples.private ;
+nmake db db.tuples db.types classes words shuffle arrays
+destructors continuations db.tuples.private prettyprint ;
 IN: db.queries
 
 GENERIC: where ( specs obj -- )
@@ -45,11 +45,14 @@ M: retryable execute-statement* ( statement type -- )
 : sql-props ( class -- columns table )
     [ db-columns ] [ db-table ] bi ;
 
-: query-make ( class quot -- )
+: query-make ( class quot -- statements )
+    #! query, input, outputs, secondary queries
+    over unparse "table" set
     [ sql-props ] dip
     [ 0 sql-counter rot with-variable ] curry
-    { "" { } { } } nmake
-    <simple-statement> maybe-make-retryable ; inline
+    { "" { } { } { } } nmake
+    [ <simple-statement> maybe-make-retryable ] dip
+    [ [ 1array ] dip append ] unless-empty ; inline
 
 : where-primary-key% ( specs -- )
     " where " 0%
@@ -142,35 +145,34 @@ M: db <delete-tuples-statement> ( tuple table -- sql )
         where-clause
     ] query-make ;
 
+ERROR: all-slots-ignored class ;
+
 M: db <select-by-slots-statement> ( tuple class -- statement )
     [
         "select " 0%
-        over [ ", " 0% ]
+        [ dupd filter-ignores ] dip
+        over empty? [ all-slots-ignored ] when
+        over
+        [ ", " 0% ]
         [ dup column-name>> 0% 2, ] interleave
-
         " from " 0% 0%
         where-clause
     ] query-make ;
 
+: splice ( string1 string2 string3 -- string )
+    swap 3append ;
+
 : do-group ( tuple groups -- )
-    [
-        ", " join " group by " swap 3append
-    ] curry change-sql drop ;
+    [ ", " join " group by " splice ] curry change-sql drop ;
 
 : do-order ( tuple order -- )
-    [
-        ", " join " order by " swap 3append
-    ] curry change-sql drop ;
+    [ ", " join " order by " splice ] curry change-sql drop ;
 
 : do-offset ( tuple n -- )
-    [
-        number>string " offset " swap 3append
-    ] curry change-sql drop ;
+    [ number>string " offset " splice ] curry change-sql drop ;
 
 : do-limit ( tuple n -- )
-    [
-        number>string " limit " swap 3append
-    ] curry change-sql drop ;
+    [ number>string " limit " splice ] curry change-sql drop ;
 
 : make-query* ( tuple query -- tuple' )
     dupd
@@ -187,18 +189,6 @@ M: db query>statement ( query -- tuple )
 
 ! select ID, NAME, SCORE from EXAM limit 1 offset 3
 
-: select-tuples* ( tuple -- statement )
-    dup
-    [
-        select 0,
-        dup class db-columns [ ", " 0, ]
-        [ dup column-name>> 0, 2, ] interleave
-        from 0,
-        class name>> 0,
-    ] { { } { } { } } nmake
-    >r >r parse-sql 4drop r> r>
-    <simple-statement> maybe-make-retryable do-select ;
-
 M: db <count-statement> ( query -- statement )
     [ tuple>> dup class ] keep
     [ [ "select count(*) from " 0% 0% where-clause ] query-make ]
diff --git a/basis/db/sql/sql-tests.factor b/basis/db/sql/sql-tests.factor
deleted file mode 100644 (file)
index 0b57c2d..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-USING: kernel namespaces db.sql sequences math ;
-IN: db.sql.tests
-
-! TUPLE: person name age ;
-: insert-1
-    { insert
-        {
-            { table "person" }
-            { columns "name" "age" }
-            { values "erg" 26 }
-        }
-    } ;
-
-: update-1
-    { update "person"
-       { set { "name" "erg" }
-             { "age" 6 } }
-       { where { "age" 6 } }
-    } ;
-
-: select-1
-    { select
-        { columns
-                "branchno"
-                { count "staffno" as "mycount" }
-                { sum "salary" as "mysum" } }
-        { from "staff" "lol" }
-        { where
-                { "salary" > all
-                    { select
-                        { columns "salary" }
-                        { from "staff" }
-                        { where { "branchno" = "b003" } }
-                    }
-                }
-                { "branchno" > 3 } }
-        { group-by "branchno" "lol2" }
-        { having { count "staffno" > 1 } }
-        { order-by "branchno" }
-        { offset 40 }
-        { limit 20 }
-    } ;
diff --git a/basis/db/sql/sql.factor b/basis/db/sql/sql.factor
deleted file mode 100755 (executable)
index ba0673a..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-USING: kernel parser quotations classes.tuple words math.order
-nmake namespaces sequences arrays combinators
-prettyprint strings math.parser math symbols db ;
-IN: db.sql
-
-SYMBOLS: insert update delete select distinct columns from as
-where group-by having order-by limit offset is-null desc all
-any count avg table values ;
-
-: input-spec, ( obj -- ) 1, ;
-: output-spec, ( obj -- ) 2, ;
-: input, ( obj -- ) 3, ;
-: output, ( obj -- ) 4, ;
-
-DEFER: sql%
-
-: (sql-interleave) ( seq sep -- )
-    [ sql% ] curry [ sql% ] interleave ;
-
-: sql-interleave ( seq str sep -- )
-    swap sql% (sql-interleave) ;
-
-: sql-function, ( seq function -- )
-    sql% "(" sql% unclip sql% ")" sql% [ sql% ] each ;
-
-: sql-where, ( seq -- )
-    [
-        [ second 0, ]
-        [ first 0, ]
-        [ third 1, \ ? 0, ] tri
-    ] each ;
-
-HOOK: sql-create db ( object -- )
-M: db sql-create ( object -- )
-    drop
-    "create table" sql% ;
-
-HOOK: sql-drop db ( object -- )
-M: db sql-drop ( object -- )
-    drop
-    "drop table" sql% ;
-
-HOOK: sql-insert db ( object -- )
-M: db sql-insert ( object -- )
-    drop
-    "insert into" sql% ;
-
-HOOK: sql-update db ( object -- )
-M: db sql-update ( object -- )
-    drop
-    "update" sql% ;
-
-HOOK: sql-delete db ( object -- )
-M: db sql-delete ( object -- )
-    drop
-    "delete" sql% ;
-
-HOOK: sql-select db ( object -- )
-M: db sql-select ( object -- )
-    "select" sql% "," (sql-interleave) ;
-
-HOOK: sql-columns db ( object -- )
-M: db sql-columns ( object -- )
-    "," (sql-interleave) ;
-
-HOOK: sql-from db ( object -- )
-M: db sql-from ( object -- )
-    "from" "," sql-interleave ;
-
-HOOK: sql-where db ( object -- )
-M: db sql-where ( object -- )
-    "where" 0, sql-where, ;
-
-HOOK: sql-group-by db ( object -- )
-M: db sql-group-by ( object -- )
-    "group by" "," sql-interleave ;
-
-HOOK: sql-having db ( object -- )
-M: db sql-having ( object -- )
-    "having" "," sql-interleave ;
-
-HOOK: sql-order-by db ( object -- )
-M: db sql-order-by ( object -- )
-    "order by" "," sql-interleave ;
-
-HOOK: sql-offset db ( object -- )
-M: db sql-offset ( object -- )
-    "offset" sql% sql% ;
-
-HOOK: sql-limit db ( object -- )
-M: db sql-limit ( object -- )
-    "limit" sql% sql% ;
-
-! GENERIC: sql-subselect db ( object -- )
-! M: db sql-subselectselect ( object -- )
-    ! "(select" sql% sql% ")" sql% ;
-
-HOOK: sql-table db ( object -- )
-M: db sql-table ( object -- )
-    sql% ;
-
-HOOK: sql-set db ( object -- )
-M: db sql-set ( object -- )
-    "set" "," sql-interleave ;
-
-HOOK: sql-values db ( object -- )
-M: db sql-values ( object -- )
-    "values(" sql% "," (sql-interleave) ")" sql% ;
-
-HOOK: sql-count db ( object -- )
-M: db sql-count ( object -- )
-    "count" sql-function, ;
-
-HOOK: sql-sum db ( object -- )
-M: db sql-sum ( object -- )
-    "sum" sql-function, ;
-
-HOOK: sql-avg db ( object -- )
-M: db sql-avg ( object -- )
-    "avg" sql-function, ;
-
-HOOK: sql-min db ( object -- )
-M: db sql-min ( object -- )
-    "min" sql-function, ;
-
-HOOK: sql-max db ( object -- )
-M: db sql-max ( object -- )
-    "max" sql-function, ;
-
-: sql-array% ( array -- )
-    unclip
-    {
-        { \ create [ sql-create ] }
-        { \ drop [ sql-drop ] }
-        { \ insert [ sql-insert ] }
-        { \ update [ sql-update ] }
-        { \ delete [ sql-delete ] }
-        { \ select [ sql-select ] }
-        { \ columns [ sql-columns ] }
-        { \ from [ sql-from ] }
-        { \ where [ sql-where ] }
-        { \ group-by [ sql-group-by ] }
-        { \ having [ sql-having ] }
-        { \ order-by [ sql-order-by ] }
-        { \ offset [ sql-offset ] }
-        { \ limit [ sql-limit ] }
-        { \ table [ sql-table ] }
-        { \ set [ sql-set ] }
-        { \ values [ sql-values ] }
-        { \ count [ sql-count ] }
-        { \ sum [ sql-sum ] }
-        { \ avg [ sql-avg ] }
-        { \ min [ sql-min ] }
-        { \ max [ sql-max ] }
-        [ sql% [ sql% ] each ]
-    } case ;
-
-ERROR: no-sql-match ;
-: sql% ( obj -- )
-    {
-        { [ dup string? ] [ 0, ] }
-        { [ dup array? ] [ sql-array% ] }
-        { [ dup number? ] [ number>string sql% ] }
-        { [ dup symbol? ] [ unparse sql% ] }
-        { [ dup word? ] [ unparse sql% ] }
-        { [ dup quotation? ] [ call ] }
-        [ no-sql-match ]
-    } cond ;
-
-: parse-sql ( obj -- sql in-spec out-spec in out )
-    [ [ sql% ] each ] { { } { } { } } nmake
-    [ " " join ] 2dip ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index aab1e5f..dfe4fdf
@@ -5,13 +5,15 @@ io.files kernel math math.parser namespaces prettyprint
 sequences strings classes.tuple alien.c-types continuations
 db.sqlite.lib db.sqlite.ffi db.tuples words db.types combinators
 math.intervals io nmake accessors vectors math.ranges random
-math.bitwise db.queries destructors db.tuples.private ;
+math.bitwise db.queries destructors db.tuples.private interpolate
+io.streams.string multiline make ;
 IN: db.sqlite
 
 TUPLE: sqlite-db < db path ;
 
-M: sqlite-db make-db* ( path db -- db )
-    swap >>path ;
+: <sqlite-db> ( path -- sqlite-db )
+    sqlite-db new-db
+        swap >>path ;
 
 M: sqlite-db db-open ( db -- db )
     dup path>> sqlite-open >>handle ;
@@ -77,7 +79,8 @@ M: generator-bind sqlite-bind-conversion ( tuple generate-bind -- array )
     tuck
     [ generator-singleton>> eval-generator tuck ] [ slot-name>> ] bi
     rot set-slot-named
-    >r [ key>> ] [ type>> ] bi r> swap <sqlite-low-level-binding> ;
+    [ [ key>> ] [ type>> ] bi ] dip
+    swap <sqlite-low-level-binding> ;
 
 M: sqlite-statement bind-tuple ( tuple statement -- )
     [
@@ -99,7 +102,7 @@ M: sqlite-result-set row-column ( result-set n -- obj )
 
 M: sqlite-result-set row-column-typed ( result-set n -- obj )
     dup pick out-params>> nth type>>
-    >r >r handle>> r> r> sqlite-column-typed ;
+    [ handle>> ] 2dip sqlite-column-typed ;
 
 M: sqlite-result-set advance-row ( result-set -- )
     dup handle>> sqlite-next >>has-more? drop ;
@@ -117,7 +120,8 @@ M: sqlite-db create-sql-statement ( class -- statement )
         dupd
         "create table " 0% 0%
         "(" 0% [ ", " 0% ] [
-            dup column-name>> 0%
+            dup "sql-spec" set
+            dup column-name>> [ "table-id" set ] [ 0% ] bi
             " " 0%
             dup type>> lookup-create-type 0%
             modifiers 0%
@@ -158,10 +162,10 @@ M: sqlite-db <insert-user-assigned-statement> ( tuple -- statement )
     <insert-db-assigned-statement> ;
 
 M: sqlite-db bind# ( spec obj -- )
-    >r
-    [ column-name>> ":" swap next-sql-counter 3append dup 0% ]
-    [ type>> ] bi
-    r> <literal-bind> 1, ;
+    [
+        [ column-name>> ":" swap next-sql-counter 3append dup 0% ]
+        [ type>> ] bi
+    ] dip <literal-bind> 1, ;
 
 M: sqlite-db bind% ( spec -- )
     dup 1, column-name>> ":" prepend 0% ;
@@ -203,9 +207,110 @@ M: sqlite-db persistent-table ( -- assoc )
         { random-generator { f f f } }
     } ;
 
+: insert-trigger ( -- string )
+    [
+    <"
+        CREATE TRIGGER fki_${table}_${foreign-table}_id
+        BEFORE INSERT ON ${table}
+        FOR EACH ROW BEGIN
+            SELECT RAISE(ROLLBACK, 'insert on table "${table}" violates foreign key constraint "fk_${foreign-table}_id"')
+            WHERE  (SELECT ${foreign-table-id} FROM ${foreign-table} WHERE ${foreign-table-id} = NEW.${table-id}) IS NULL;
+        END;
+    "> interpolate
+    ] with-string-writer ;
+
+: insert-trigger-not-null ( -- string )
+    [
+    <"
+        CREATE TRIGGER fki_${table}_${foreign-table}_id
+        BEFORE INSERT ON ${table}
+        FOR EACH ROW BEGIN
+            SELECT RAISE(ROLLBACK, 'insert on table "${table}" violates foreign key constraint "fk_${foreign-table}_id"')
+            WHERE NEW.${foreign-table-id} IS NOT NULL
+                AND (SELECT ${foreign-table-id} FROM ${foreign-table} WHERE ${foreign-table-id} = NEW.${table-id}) IS NULL;
+        END;
+    "> interpolate
+    ] with-string-writer ;
+
+: update-trigger ( -- string )
+    [
+    <"
+        CREATE TRIGGER fku_${table}_${foreign-table}_id
+        BEFORE UPDATE ON ${table}
+        FOR EACH ROW BEGIN
+            SELECT RAISE(ROLLBACK, 'update on table "${table}" violates foreign key constraint "fk_${foreign-table}_id"')
+            WHERE  (SELECT ${foreign-table-id} FROM ${foreign-table} WHERE ${foreign-table-id} = NEW.${table-id}) IS NULL;
+        END;
+    "> interpolate
+    ] with-string-writer ;
+
+: update-trigger-not-null ( -- string )
+    [
+    <"
+        CREATE TRIGGER fku_${table}_${foreign-table}_id
+        BEFORE UPDATE ON ${table}
+        FOR EACH ROW BEGIN
+            SELECT RAISE(ROLLBACK, 'update on table "${table}" violates foreign key constraint "fk_${foreign-table}_id"')
+            WHERE NEW.${foreign-table-id} IS NOT NULL
+                AND (SELECT ${foreign-table-id} FROM ${foreign-table} WHERE ${foreign-table-id} = NEW.${table-id}) IS NULL;
+        END;
+    "> interpolate
+    ] with-string-writer ;
+
+: delete-trigger-restrict ( -- string )
+    [
+    <"
+        CREATE TRIGGER fkd_${table}_${foreign-table}_id
+        BEFORE DELETE ON ${foreign-table}
+        FOR EACH ROW BEGIN
+            SELECT RAISE(ROLLBACK, 'delete on table "${foreign-table}" violates foreign key constraint "fk_${foreign-table}_id"')
+            WHERE  (SELECT ${foreign-table-id} FROM ${foreign-table} WHERE ${foreign-table-id} = OLD.${foreign-table-id}) IS NOT NULL;
+        END;
+    "> interpolate
+    ] with-string-writer ;
+
+: delete-trigger-cascade ( -- string )
+    [
+    <"
+        CREATE TRIGGER fkd_${table}_${foreign-table}_id
+        BEFORE DELETE ON ${foreign-table}
+        FOR EACH ROW BEGIN
+            DELETE from ${table} WHERE ${table-id} = OLD.${foreign-table-id};
+        END;
+    "> interpolate
+    ] with-string-writer ;
+
+: can-be-null? ( -- ? )
+    "sql-spec" get modifiers>> [ +not-null+ = ] contains? not ;
+
+: delete-cascade? ( -- ? )
+    "sql-spec" get modifiers>> { +on-delete+ +cascade+ } swap subseq? ;
+
+: sqlite-trigger, ( string -- )
+    { } { } <simple-statement> 3, ;
+
+: create-sqlite-triggers ( -- )
+    can-be-null? [
+        insert-trigger sqlite-trigger,
+        update-trigger sqlite-trigger,
+    ] [ 
+        insert-trigger-not-null sqlite-trigger,
+        update-trigger-not-null sqlite-trigger,
+    ] if
+    delete-cascade? [
+        delete-trigger-cascade sqlite-trigger,
+    ] [
+        delete-trigger-restrict sqlite-trigger,
+    ] if ;
+
 M: sqlite-db compound ( string seq -- new-string )
     over {
         { "default" [ first number>string join-space ] }
-        { "references" [ >reference-string ] }
+        { "references" [
+            [ >reference-string ] keep
+            first2 [ "foreign-table" set ]
+            [ "foreign-table-id" set ] bi*
+            create-sqlite-triggers
+        ] }
         [ 2drop ]
     } case ;
index d7ee3a5ad2beca27977962d7168d7e319b6c8eea..497cc2e8c545e4921e9feb91077a742bcfd23b1a 100644 (file)
@@ -190,7 +190,7 @@ T{ book
 { $list
     "Make a new tuple to represent your data"
     { "Map the Factor types to the database types with " { $link define-persistent } }
-    { "Make a " { $link "db-custom-database-combinators" } " to open your database and run a " { $snippet "quotation" } }
+    { "Make a custom database combinator (see" { $link "db-custom-database-combinators" } ") to open your database and run a " { $link quotation } }
     { "Create a table with " { $link create-table } ", " { $link ensure-table } ", or " { $link recreate-table } }
     { "Start making and storing objects with " { $link insert-tuple } ", " { $link update-tuple } ", " { $link delete-tuples } ", and " { $link select-tuples } }
 } ;
old mode 100755 (executable)
new mode 100644 (file)
index 6a5e78a..f5569a9
@@ -7,16 +7,34 @@ db.postgresql accessors random math.bitwise
 math.ranges strings urls fry db.tuples.private ;
 IN: db.tuples.tests
 
+: sqlite-db ( -- sqlite-db )
+    "tuples-test.db" temp-file <sqlite-db> ;
+
 : test-sqlite ( quot -- )
-    [ ] swap '[
-        "tuples-test.db" temp-file sqlite-db _ with-db
-    ] unit-test ;
+    '[
+        [ ] [
+            "tuples-test.db" temp-file <sqlite-db> _ with-db
+        ] unit-test
+    ] call ; inline
+
+: postgresql-db ( -- postgresql-db )
+    <postgresql-db>
+        "localhost" >>host
+        "postgres" >>username
+        "thepasswordistrust" >>password
+        "factor-test" >>database ;
 
 : test-postgresql ( quot -- )
-    [ ] swap '[
-        { "localhost" "postgres" "foob" "factor-test" }
-        postgresql-db _ with-db
-    ] unit-test ;
+    '[
+        [ ] [ postgresql-db _ with-db ] unit-test
+    ] call ; inline
+
+! These words leak resources, but are useful for interactivel testing 
+: sqlite-test-db ( -- )
+    sqlite-db db-open db set ;
+
+: postgresql-test-db ( -- )
+    postgresql-db db-open db set ;
 
 TUPLE: person the-id the-name the-number the-real
 ts date time blob factor-blob url ;
@@ -176,26 +194,49 @@ SYMBOL: person4
         T{ timestamp f 0 0 0 12 34 56 T{ duration f 0 0 0 0 0 0 } }
         f H{ { 1 2 } { 3 4 } { 5 "lol" } } URL" http://www.google.com/search?hl=en&q=trailer+park+boys&btnG=Google+Search" <user-assigned-person> person4 set ;
 
+
 TUPLE: paste n summary author channel mode contents timestamp annotations ;
 TUPLE: annotation n paste-id summary author mode contents ;
 
-: db-assigned-paste-schema ( -- )
-    paste "PASTE"
+paste "PASTE"
+{
+    { "n" "ID" +db-assigned-id+ }
+    { "summary" "SUMMARY" TEXT }
+    { "author" "AUTHOR" TEXT }
+    { "channel" "CHANNEL" TEXT }
+    { "mode" "MODE" TEXT }
+    { "contents" "CONTENTS" TEXT }
+    { "timestamp" "DATE" TIMESTAMP }
+    { "annotations" { +has-many+ annotation } }
+} define-persistent
+
+: annotation-schema-foreign-key ( -- )
+    annotation "ANNOTATION"
     {
         { "n" "ID" +db-assigned-id+ }
+        { "paste-id" "PASTE_ID" INTEGER { +foreign-id+ paste "ID" } }
         { "summary" "SUMMARY" TEXT }
         { "author" "AUTHOR" TEXT }
-        { "channel" "CHANNEL" TEXT }
         { "mode" "MODE" TEXT }
         { "contents" "CONTENTS" TEXT }
-        { "timestamp" "DATE" TIMESTAMP }
-        { "annotations" { +has-many+ annotation } }
-    } define-persistent
+    } define-persistent ;
+
+: annotation-schema-foreign-key-not-null ( -- )
+    annotation "ANNOTATION"
+    {
+        { "n" "ID" +db-assigned-id+ }
+        { "paste-id" "PASTE_ID" INTEGER { +foreign-id+ paste "ID" } +not-null+ }
+        { "summary" "SUMMARY" TEXT }
+        { "author" "AUTHOR" TEXT }
+        { "mode" "MODE" TEXT }
+        { "contents" "CONTENTS" TEXT }
+    } define-persistent ;
 
+: annotation-schema-cascade ( -- )
     annotation "ANNOTATION"
     {
         { "n" "ID" +db-assigned-id+ }
-        { "paste-id" "PASTE_ID" INTEGER { +foreign-id+ paste "n" }
+        { "paste-id" "PASTE_ID" INTEGER { +foreign-id+ paste "ID" }
             +on-delete+ +cascade+ }
         { "summary" "SUMMARY" TEXT }
         { "author" "AUTHOR" TEXT }
@@ -203,8 +244,18 @@ TUPLE: annotation n paste-id summary author mode contents ;
         { "contents" "CONTENTS" TEXT }
     } define-persistent ;
 
+: annotation-schema-restrict ( -- )
+    annotation "ANNOTATION"
+    {
+        { "n" "ID" +db-assigned-id+ }
+        { "paste-id" "PASTE_ID" INTEGER { +foreign-id+ paste "ID" } }
+        { "summary" "SUMMARY" TEXT }
+        { "author" "AUTHOR" TEXT }
+        { "mode" "MODE" TEXT }
+        { "contents" "CONTENTS" TEXT }
+    } define-persistent ;
+
 : test-paste-schema ( -- )
-    [ ] [ db-assigned-paste-schema ] unit-test
     [ ] [ paste ensure-table ] unit-test
     [ ] [ annotation ensure-table ] unit-test
     [ ] [ annotation drop-table ] unit-test
@@ -229,14 +280,38 @@ TUPLE: annotation n paste-id summary author mode contents ;
             "erg" >>author
             "annotation contents" >>contents
         insert-tuple
-    ] unit-test
-
-    [ ] [
-    ] unit-test
-    ;
+    ] unit-test ;
 
-[ test-paste-schema ] test-sqlite
-[ test-paste-schema ] test-postgresql
+: test-foreign-key ( -- )
+    [ ] [ annotation-schema-foreign-key ] unit-test
+    test-paste-schema
+    [ paste new 1 >>n delete-tuples ] must-fail ;
+
+: test-foreign-key-not-null ( -- )
+    [ ] [ annotation-schema-foreign-key-not-null ] unit-test
+    test-paste-schema
+    [ paste new 1 >>n delete-tuples ] must-fail ;
+
+: test-cascade ( -- )
+    [ ] [ annotation-schema-cascade ] unit-test
+    test-paste-schema
+    [ ] [ paste new 1 >>n delete-tuples ] unit-test
+    [ 0 ] [ paste new select-tuples length ] unit-test ;
+
+: test-restrict ( -- )
+    [ ] [ annotation-schema-restrict ] unit-test
+    test-paste-schema
+    [ paste new 1 >>n delete-tuples ] must-fail ;
+
+[ test-foreign-key ] test-sqlite
+[ test-foreign-key-not-null ] test-sqlite
+[ test-cascade ] test-sqlite
+[ test-restrict ] test-sqlite
+
+[ test-foreign-key ] test-postgresql
+[ test-foreign-key-not-null ] test-postgresql
+[ test-cascade ] test-postgresql
+[ test-restrict ] test-postgresql
 
 : test-repeated-insert
     [ ] [ person ensure-table ] unit-test
@@ -293,6 +368,14 @@ TUPLE: exam id name score ;
     [ ] [ T{ exam f f "Kenny" 60 } insert-tuple ] unit-test
     [ ] [ T{ exam f f "Cartman" 41 } insert-tuple ] unit-test
 
+    [ 4 ]
+    [ T{ exam { name IGNORE } { score IGNORE } } select-tuples length ] unit-test
+
+    [ f ]
+    [ T{ exam { name IGNORE } { score IGNORE } } select-tuples first score>> ] unit-test
+
+    [ T{ exam { name IGNORE } { score IGNORE } { id IGNORE } } select-tuples first score>> ] [ class>> "EXAM" = ] must-fail-with
+
     [
         {
             T{ exam f 3 "Kenny" 60 }
@@ -574,10 +657,3 @@ compound-foo "COMPOUND_FOO"
 
 [ test-compound-primary-key ] test-sqlite
 [ test-compound-primary-key ] test-postgresql
-
-: sqlite-test-db ( -- )
-    "tuples-test.db" temp-file sqlite-db make-db db-open db set ;
-
-: postgresql-test-db ( -- )
-    { "localhost" "postgres" "foob" "factor-test" } postgresql-db
-    make-db db-open db set ;
old mode 100755 (executable)
new mode 100644 (file)
index 401bbbc4d7f7de8928dc32a65d02b3fd5cf3ab73..f1a6ba6c6c9085981601b506e5149c90caddb7e9 100644 (file)
@@ -8,7 +8,7 @@ HELP: +autoincrement+
 { $description "" } ;
 
 HELP: +db-assigned-id+
-{ $description "The database assigns a primary key to the object.  The primary key is most likely a big integer, but is database-dependent." } ;
+{ $description "The database assigns a primary key to the object. The primary key is most likely a big integer, but is database-dependent." } ;
 
 HELP: +default+
 { $description "" } ;
@@ -29,7 +29,7 @@ HELP: +primary-key+
 { $description "" } ;
 
 HELP: +random-id+
-{ $description "Factor chooses a random number and tries to insert the tuple into the database with this number as its primary key.  The default number of retries to find a unique random number is 10, though in practice it will almost certainly succeed on the first try." } ;
+{ $description "Factor chooses a random number and tries to insert the tuple into the database with this number as its primary key. The default number of retries to find a unique random number is 10, though in practice it will almost certainly succeed on the first try." } ;
 
 HELP: +serial+
 { $description "" } ;
@@ -38,7 +38,7 @@ HELP: +unique+
 { $description "" } ;
 
 HELP: +user-assigned-id+
-{ $description "The user is responsible for choosing a primary key for tuples inserted with this database type.  Keys must be unique or else the database will throw an error.  Usually it is better to use a " { $link +db-assigned-id+ } "." } ;
+{ $description "The user is responsible for choosing a primary key for tuples inserted with this database type. Keys must be unique or else the database will throw an error. Usually it is better to use a " { $link +db-assigned-id+ } "." } ;
 
 HELP: <generator-bind>
 { $description "" } ;
@@ -53,7 +53,7 @@ HELP: BIG-INTEGER
 { $description "A 64-bit integer. Whether this number is signed or unsigned depends on the database backend." } ;
 
 HELP: BLOB
-{ $description "A serialized Factor object.  The database library automatically serializes the object for a SQL insert or update and deserializes it on a tuple query." } ;
+{ $description "A byte array." } ;
 
 HELP: BOOLEAN
 { $description "Either true or false." } ;
@@ -65,7 +65,7 @@ HELP: DATETIME
 { $description "A date and a time." } ;
 
 HELP: DOUBLE
-{ $description "Corresponds to Factor's 64bit floating-point numbers." } ;
+{ $description "Corresponds to Factor's 64-bit floating-point numbers." } ;
 
 HELP: FACTOR-BLOB
 { $description "A serialized Factor object." } ;
@@ -77,30 +77,31 @@ HELP: NULL
 { $description "The SQL null type." } ;
 
 HELP: REAL
-{ $description "" } ;
+{ $description "A real number of unlimited precision. May not be supported on all databases." } ;
 
 HELP: SIGNED-BIG-INTEGER
-{ $description "For portability, if a number is known to be 64bit and signed, then this datatype may be used.  Some databases, like SQLite, cannot store arbitrary bignums as BIGINT types.  If storing arbitrary bignums, use " { $link FACTOR-BLOB } "." } ;
+{ $description "For portability, if a number is known to be 64bit and signed, then this datatype may be used. Some databases, like SQLite, cannot store arbitrary bignums as BIGINT types. If storing arbitrary bignums, use " { $link FACTOR-BLOB } "." } ;
 
 HELP: TEXT
-{ $description "" } ;
+{ $description "Stores a string that is longer than a " { $link VARCHAR } ". SQLite uses this type for strings; it does not handle " { $link VARCHAR } " strings." } ;
 
 HELP: TIME
-{ $description "" } ;
+{ $description "A timestamp without a date component." } ;
 
 HELP: TIMESTAMP
 { $description "A Factor timestamp." } ;
 
 HELP: UNSIGNED-BIG-INTEGER
-{ $description "For portability, if a number is known to be 64bit, then this datatype may be used.  Some databases, like SQLite, cannot store arbitrary bignums as BIGINT types.  If storing arbitrary bignums, use " { $link FACTOR-BLOB } "." } ;
+{ $description "For portability, if a number is known to be 64bit, then this datatype may be used. Some databases, like SQLite, cannot store arbitrary bignums as BIGINT types. If storing arbitrary bignums, use " { $link FACTOR-BLOB } "." } ;
 
 { INTEGER SIGNED-BIG-INTEGER UNSIGNED-BIG-INTEGER } related-words
 
 HELP: URL
-{ $description "A Factor " { $link "urls" } "  object." } ;
+{ $description "A Factor " { $link "urls" } " object." } ;
 
 HELP: VARCHAR
-{ $description "The SQL varchar type.  This type can take an integer as an argument." } ;
+{ $description "The SQL varchar type. This type can take an integer as an argument." }
+{ $examples { $unchecked-example "{ VARCHAR 256 }" "" } } ;
 
 HELP: user-assigned-id-spec?
 { $values
@@ -279,8 +280,9 @@ ARTICLE: "db.types" "Database types"
 { $subsection DATETIME }
 { $subsection TIME }
 { $subsection TIMESTAMP }
-"Arbitrary Factor objects:"
+"Factor byte-arrays:"
 { $subsection BLOB }
+"Arbitrary Factor objects:"
 { $subsection FACTOR-BLOB }
 "Factor URLs:"
 { $subsection URL } ;
old mode 100755 (executable)
new mode 100644 (file)
index bc33792..ac9e339
@@ -29,9 +29,17 @@ SYMBOLS: +autoincrement+ +serial+ +unique+ +default+ +null+ +not-null+
 +foreign-id+ +has-many+ +on-delete+ +restrict+ +cascade+ +set-null+
 +set-default+ ;
 
+SYMBOL: IGNORE
+
+: filter-ignores ( tuple specs -- specs' )
+    [ <mirror> [ nip IGNORE = ] assoc-filter keys ] dip
+    [ slot-name>> swap member? not ] with filter ;
+
+ERROR: no-slot ;
+
 : offset-of-slot ( string tuple -- n )
     class superclasses [ "slots" word-prop ] map concat
-    slot-named offset>> ;
+    slot-named dup [ no-slot ] unless offset>> ;
 
 : get-slot-named ( name tuple -- value )
     tuck offset-of-slot slot ;
@@ -87,16 +95,17 @@ SYMBOLS: INTEGER BIG-INTEGER SIGNED-BIG-INTEGER UNSIGNED-BIG-INTEGER
 DOUBLE REAL BOOLEAN TEXT VARCHAR DATE TIME DATETIME TIMESTAMP BLOB
 FACTOR-BLOB NULL URL ;
 
-: spec>tuple ( class spec -- tuple )
-    3 f pad-right
-    [ first3 ] keep 3 tail
+: <sql-spec> ( class slot-name column-name type modifiers -- sql-spec )
     sql-spec new
         swap >>modifiers
         swap >>type
         swap >>column-name
         swap >>slot-name
         swap >>class
-    dup normalize-spec ;
+        dup normalize-spec ;
+
+: spec>tuple ( class spec -- tuple )
+    3 f pad-right [ first3 ] keep 3 tail <sql-spec> ;
 
 : number>string* ( n/string -- string )
     dup number? [ number>string ] when ;
@@ -115,7 +124,6 @@ FACTOR-BLOB NULL URL ;
 ! PostgreSQL Types:
 ! http://developer.postgresql.org/pgdocs/postgres/datatype.html
 
-
 : ?at ( obj assoc -- value/obj ? )
     dupd at* [ [ nip ] [ drop ] if ] keep ;
 
@@ -159,8 +167,11 @@ ERROR: no-sql-type type ;
 HOOK: bind% db ( spec -- )
 HOOK: bind# db ( spec obj -- )
 
+ERROR: no-column column ;
+
 : >reference-string ( string pair -- string )
     first2
     [ [ unparse join-space ] [ db-columns ] bi ] dip
-    swap [ slot-name>> = ] with find nip
+    swap [ column-name>> = ] with find nip
+    [ no-column ] unless*
     column-name>> paren append ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 73b0cba4d07469f24758016a05369bf117634d84..21e3c05d041bae54a89e9ea5bb6c403134ce9f9c 100644 (file)
@@ -9,6 +9,7 @@ IN: farkup
 SYMBOL: relative-link-prefix
 SYMBOL: disable-images?
 SYMBOL: link-no-follow?
+SYMBOL: line-breaks?
 
 TUPLE: heading1 child ;
 TUPLE: heading2 child ;
@@ -29,6 +30,7 @@ TUPLE: link href text ;
 TUPLE: image href text ;
 TUPLE: code mode string ;
 TUPLE: line ;
+TUPLE: line-break ;
 
 : absolute-url? ( string -- ? )
     { "http://" "https://" "ftp://" } [ head? ] with contains? ;
@@ -109,7 +111,9 @@ table            =  ((table-row nl => [[ first ]] )+ table-row? | table-row)
 text = (!(nl | code | heading | inline-delimiter | table ).)+
     => [[ >string ]]
 
-paragraph-nl-item = nl (list | line)?
+paragraph-nl-item = nl list
+    | nl line
+    | nl => [[ line-breaks? get [ drop line-break new ] when ]]
 paragraph-item = (table | code | text | inline-tag | inline-delimiter)+
 paragraph = ((paragraph-item paragraph-nl-item)+ nl+ => [[ first ]]
              | (paragraph-item paragraph-nl-item)+ paragraph-item?
@@ -209,6 +213,7 @@ M: link (write-farkup) [ href>> ] [ text>> ] bi write-link ;
 M: image (write-farkup) [ href>> ] [ text>> ] bi write-image-link ;
 M: code (write-farkup) [ string>> ] [ mode>> ] bi render-code ;
 M: line (write-farkup) drop <hr/> ;
+M: line-break (write-farkup) drop <br/> nl ;
 M: table-row (write-farkup) ( obj -- )
     child>> [ [ [ (write-farkup) ] "td" in-tag. ] each ] "tr" in-tag. ;
 M: table (write-farkup) [ child>> (write-farkup) ] "table" in-tag. ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index decee690a31f46798f97e27a5e6f42c5c9fe8440..128ec448b72aea914b51e127f0bba377e186d273 100644 (file)
@@ -17,19 +17,17 @@ IN: furnace.alloy
     state-classes ensure-tables
     user ensure-table ;
 
-: <alloy> ( responder db params -- responder' )
-    [ [ init-furnace-tables ] with-db ]
+: <alloy> ( responder db -- responder' )
+    [ [ init-furnace-tables ] with-db ] keep
     [
-        [
-            <asides>
-            <conversations>
-            <sessions>
-        ] 2dip
-        <db-persistence>
-        <check-form-submissions>
-    ] 2bi ;
+        <asides>
+        <conversations>
+        <sessions>
+    ] dip
+    <db-persistence>
+    <check-form-submissions> ;
 
-: start-expiring ( db params -- )
+: start-expiring ( db -- )
     '[
-        _ [ state-classes [ expire-state ] each ] with-db
+        _ [ state-classes [ expire-state ] each ] with-db
     ] 5 minutes every drop ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index fac5c23..3bcd82a
@@ -11,7 +11,7 @@ io.files accessors kernel ;
 \r
 [ "auth-test.db" temp-file delete-file ] ignore-errors\r
 \r
-"auth-test.db" temp-file sqlite-db [\r
+"auth-test.db" temp-file <sqlite-db> [\r
 \r
     user ensure-table\r
 \r
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index b4a4386..ed18e42
@@ -6,7 +6,7 @@ IN: furnace.db
 \r
 TUPLE: db-persistence < filter-responder pool ;\r
 \r
-: <db-persistence> ( responder params db -- responder' )\r
+: <db-persistence> ( responder db -- responder' )\r
     <db-pool> db-persistence boa ;\r
 \r
 M: db-persistence call-responder*\r
old mode 100755 (executable)
new mode 100644 (file)
index ff089a9..6bb3c1c
@@ -48,9 +48,9 @@ M: foo call-responder*
     <action>\r
         [ [ ] "text/plain" <content> exit-with ] >>display ;\r
 \r
-[ "auth-test.db" temp-file sqlite-db delete-file ] ignore-errors\r
+[ "auth-test.db" temp-file delete-file ] ignore-errors\r
 \r
-"auth-test.db" temp-file sqlite-db [\r
+"auth-test.db" temp-file <sqlite-db> [\r
 \r
     <request> init-request\r
     session ensure-table\r
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index d1003ac..3c1c61f
@@ -1,5 +1,5 @@
 USING: heaps.private help.markup help.syntax kernel math assocs
-math.order ;
+math.order quotations ;
 IN: heaps
 
 ARTICLE: "heaps" "Heaps"
@@ -28,7 +28,9 @@ $nl
 "Removal:"
 { $subsection heap-pop* }
 { $subsection heap-pop }
-{ $subsection heap-delete } ;
+{ $subsection heap-delete }
+"Processing heaps:"
+{ $subsection slurp-heap } ;
 
 ABOUT: "heaps"
 
@@ -82,3 +84,8 @@ HELP: heap-delete
 { $description "Remove the specified entry from the heap." }
 { $errors "Throws an error if the entry is from another heap or if it has already been deleted." }
 { $side-effects "heap" } ;
+
+HELP: slurp-heap
+{ $values
+     { "heap" "a heap" } { "quot" quotation } }
+{ $description "Removes values from a heap and processes them with the quotation until the heap is empty." } ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index ed846320c38479aac41d7028db9f5cf69590c151..d4f277a7c31f46b3e916d993871d9e3a56fa7eaf 100644 (file)
@@ -39,11 +39,21 @@ HELP: http-post
 { $description "Submits a form at a URL." }
 { $errors "Throws an error if the HTTP request fails." } ;
 
+HELP: with-http-get
+{ $values { "url" "a " { $link url } " or " { $link string } } { "quot" "a quotation with stack effect " { $snippet "( chunk -- )" } } { "response" response } }
+{ $description "Downloads the contents of a URL. Chunks of data are passed to the quotation as they are read." }
+{ $errors "Throws an error if the HTTP request fails." } ;
+
 HELP: http-request
 { $values { "request" request } { "response" response } { "data" sequence } }
 { $description "Sends an HTTP request to an HTTP server, and reads the response." }
 { $errors "Throws an error if the HTTP request fails." } ;
 
+HELP: with-http-request
+{ $values { "request" request } { "quot" "a quotation with stack effect " { $snippet "( chunk -- )" } } { "response" response } }
+{ $description "Sends an HTTP request to an HTTP server, and reads the response incrementally. Chunks of data are passed to the quotation as they are read." }
+{ $errors "Throws an error if the HTTP request fails." } ;
+
 ARTICLE: "http.client.get" "GET requests with the HTTP client"
 "Basic usage involves passing a " { $link url } " and getting a " { $link response } " and data back:"
 { $subsection http-get }
@@ -52,7 +62,10 @@ ARTICLE: "http.client.get" "GET requests with the HTTP client"
 { $subsection download-to }
 "Advanced usage involves constructing a " { $link request } ", which allows " { $link "http.cookies" } " and " { $link "http.headers" } " to be set:"
 { $subsection <get-request> }
-{ $subsection http-request } ;
+{ $subsection http-request }
+"The " { $link http-get } " and " { $link http-request } " words output sequences. This is undesirable if the response data may be large. Another pair of words take a quotation instead, and pass the quotation chunks of data incrementally:"
+{ $subsection with-http-get }
+{ $subsection with-http-request } ;
 
 ARTICLE: "http.client.post" "POST requests with the HTTP client"
 "As with GET requests, there is a high-level word which takes a " { $link url } " and a lower-level word which constructs an HTTP request object which can be passed to " { $link http-request } ":"
@@ -82,6 +95,8 @@ ARTICLE: "http.client.errors" "HTTP client errors"
 ARTICLE: "http.client" "HTTP client"
 "The " { $vocab-link "http.client" } " vocabulary implements an HTTP and HTTPS client on top of " { $link "http" } "."
 $nl
+"For HTTPS support, you must load the " { $vocab-link "urls.secure" } " vocab first. If you don't load it, HTTPS will not load and images generated by " { $vocab-link "tools.deploy" } " will be smaller as a result."
+$nl
 "There are two primary usage patterns, data retrieval with GET requests and form submission with POST requests:"
 { $subsection "http.client.get" }
 { $subsection "http.client.post" }
old mode 100755 (executable)
new mode 100644 (file)
index 1219ae0..4dcc6b8
@@ -1,5 +1,8 @@
 USING: http.client http.client.private http tools.test
 namespaces urls ;
+
+\ download must-infer
+
 [ "localhost" f ] [ "localhost" parse-host ] unit-test
 [ "localhost" 8888 ] [ "localhost:8888" parse-host ] unit-test
 
old mode 100755 (executable)
new mode 100644 (file)
index 174c4e1..9260f15
@@ -3,7 +3,7 @@
 USING: accessors assocs kernel math math.parser namespaces make
 sequences io io.sockets io.streams.string io.files io.timeouts
 strings splitting calendar continuations accessors vectors
-math.order hashtables byte-arrays prettyprint
+math.order hashtables byte-arrays prettyprint destructors
 io.encodings
 io.encodings.string
 io.encodings.ascii
@@ -88,72 +88,92 @@ M: too-many-redirects summary
     drop
     [ "Redirection limit of " % max-redirects # " exceeded" % ] "" make ;
 
-DEFER: (http-request)
-
 <PRIVATE
 
+DEFER: (with-http-request)
+
 SYMBOL: redirects
 
 : redirect-url ( request url -- request )
     '[ _ >url derive-url ensure-port ] change-url ;
 
-: do-redirect ( response data -- response data )
-    over code>> 300 399 between? [
-        drop
-        redirects inc
-        redirects get max-redirects < [
-            request get
-            swap "location" header redirect-url
-            "GET" >>method (http-request)
-        ] [
-            too-many-redirects
-        ] if
-    ] when ;
+: redirect? ( response -- ? )
+    code>> 300 399 between? ;
 
-PRIVATE>
+: do-redirect ( quot: ( chunk -- ) response -- response )
+    redirects inc
+    redirects get max-redirects < [
+        request get clone
+        swap "location" header redirect-url
+        "GET" >>method swap (with-http-request)
+    ] [ too-many-redirects ] if ; inline recursive
 
 : read-chunk-size ( -- n )
     read-crlf ";" split1 drop [ blank? ] trim-right
     hex> [ "Bad chunk size" throw ] unless* ;
 
-: read-chunks ( -- )
+: read-chunked ( quot: ( chunk -- ) -- )
     read-chunk-size dup zero?
-    [ drop ] [ read % read-crlf B{ } assert= read-chunks ] if ;
-
-: read-response-body ( response -- response data )
-    dup "transfer-encoding" header "chunked" = [
-        binary decode-input
-        [ read-chunks ] B{ } make
-        over content-charset>> decode
-    ] [
-        dup content-charset>> decode-input
-        input-stream get contents
-    ] if ;
-
-: (http-request) ( request -- response data )
-    dup request [
-        dup url>> url-addr ascii [
-            1 minutes timeouts
-            write-request
-            read-response
-            read-response-body
-        ] with-client
-        do-redirect
-    ] with-variable ;
+    [ 2drop ] [
+        read [ swap call ] [ drop ] 2bi
+        read-crlf B{ } assert= read-chunked
+    ] if ; inline recursive
+
+: read-unchunked ( quot: ( chunk -- ) -- )
+    8192 read-partial dup [
+        [ swap call ] [ drop read-unchunked ] 2bi
+    ] [ 2drop ] if ; inline recursive
+
+: read-response-body ( quot response -- )
+    binary decode-input
+    "transfer-encoding" header "chunked" =
+    [ read-chunked ] [ read-unchunked ] if ; inline
+
+: <request-socket> ( -- stream )
+    request get url>> url-addr ascii <client> drop
+    1 minutes over set-timeout ;
+
+: (with-http-request) ( request quot: ( chunk -- ) -- response )
+    swap
+    request [
+        <request-socket> [
+            [
+                out>>
+                [ request get write-request ]
+                with-output-stream*
+            ] [
+                in>> [
+                    read-response dup redirect? [ t ] [
+                        [ nip response set ]
+                        [ read-response-body ]
+                        [ ]
+                        2tri f
+                    ] if
+                ] with-input-stream*
+            ] bi
+        ] with-disposal
+        [ do-redirect ] [ nip ] if
+    ] with-variable ; inline recursive
+
+PRIVATE>
 
 : success? ( code -- ? ) 200 = ;
 
-ERROR: download-failed response body ;
+ERROR: download-failed response ;
 
 M: download-failed error.
-    "HTTP download failed:" print nl
-    [ response>> . nl ] [ body>> write ] bi ;
+    "HTTP request failed:" print nl
+    response>> . ;
+
+: check-response ( response -- response )
+    dup code>> success? [ download-failed ] unless ;
 
-: check-response ( response data -- response data )
-    over code>> success? [ download-failed ] unless ;
+: with-http-request ( request quot -- response )
+    (with-http-request) check-response ; inline
 
 : http-request ( request -- response data )
-    (http-request) check-response ;
+    [ [ % ] with-http-request ] B{ } make
+    over content-charset>> decode ;
 
 : <get-request> ( url -- request )
     <request>
@@ -163,14 +183,14 @@ M: download-failed error.
 : http-get ( url -- response data )
     <get-request> http-request ;
 
+: with-http-get ( url quot -- response )
+    [ <get-request> ] dip with-http-request ; inline
+
 : download-name ( url -- name )
     present file-name "?" split1 drop "/" ?tail drop ;
 
 : download-to ( url file -- )
-    #! Downloads the contents of a URL to a file.
-    swap http-get
-    [ content-charset>> ] [ '[ _ write ] ] bi*
-    with-file-writer ;
+    binary [ [ write ] with-http-get drop ] with-file-writer ;
 
 : download ( url -- )
     dup download-name download-to ;
old mode 100755 (executable)
new mode 100644 (file)
index 9a1421a..608ba0c
@@ -179,10 +179,10 @@ http.server.dispatchers db.tuples ;
 
 : add-quit-action
     <action>
-        [ stop-server "Goodbye" "text/html" <content> ] >>display
+        [ stop-this-server "Goodbye" "text/html" <content> ] >>display
     "quit" add-responder ;
 
-: test-db "test.db" temp-file sqlite-db ;
+: test-db "test.db" temp-file <sqlite-db> ;
 
 [ test-db drop delete-file ] ignore-errors
 
old mode 100755 (executable)
new mode 100644 (file)
index cfc205d..c90a187
@@ -3,7 +3,7 @@
 USING: accessors kernel combinators math namespaces make
 assocs sequences splitting sorting sets debugger
 strings vectors hashtables quotations arrays byte-arrays
-math.parser calendar calendar.format present urls logging
+math.parser calendar calendar.format present urls
 
 io io.encodings io.encodings.iana io.encodings.binary
 io.encodings.8-bit
@@ -96,8 +96,6 @@ TUPLE: cookie name value version comment path domain expires max-age http-only s
         drop
     ] { } make ;
 
-\ parse-cookie DEBUG add-input-logging
-
 : check-cookie-string ( string -- string' )
     dup "=;'\"\r\n" intersect empty?
     [ "Bad cookie name or value" throw ] unless ;
index ce8257dec5b1c3eb57b09daf8f85016e2d79970c..8e8e7358d1602eb273084f08eb47b286c9ba63d6 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: combinators.short-circuit math math.order math.parser
 kernel sequences sequences.deep peg peg.parsers assocs arrays
-hashtables strings unicode.case namespaces make ascii logging ;
+hashtables strings unicode.case namespaces make ascii ;
 IN: http.parsers
 
 : except ( quot -- parser )
@@ -61,8 +61,6 @@ PEG: parse-request-line ( string -- triple )
         'space' ,
     ] seq* just ;
 
-\ parse-request-line DEBUG add-input-logging
-
 : 'text' ( -- parser )
     [ ctl? ] except ;
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 547e1b6..697dec2
@@ -24,6 +24,8 @@ html.elements
 html.streams ;
 IN: http.server
 
+\ parse-cookie DEBUG add-input-logging
+
 : check-absolute ( url -- url )
     dup path>> "/" head? [ "Bad request: URL" throw ] unless ; inline
 
index 866d2a34096fb5087f362054bdcc07229aeb1212..bca72a6126d7d546a52ae77a6a92479d0622b40b 100644 (file)
@@ -19,11 +19,7 @@ HELP: enable-fhtml
 { $notes "See " { $link "html.templates.fhtml" } "." }
 { $side-effects "responder" } ;
 
-ARTICLE: "http.server.static" "Serving static content"
-"The " { $vocab-link "http.server.static" } " vocabulary implements a responder for serving static files."
-{ $subsection <static> }
-"The static responder does not serve directory listings by default, as a security measure. Directory listings can be enabled by storing a true value in the " { $slot "allow-listings" } " slot."
-$nl
+ARTICLE: "http.server.static.extend" "Hooks for dynamic content"
 "The static responder can be extended for dynamic content by associating quotations with MIME types in the hashtable stored in the " { $slot "special" } " slot. The quotations have stack effect " { $snippet "( path -- )" } "."
 $nl
 "A utility word uses the above feature to enable server-side " { $snippet ".fhtml" } " scripts, allowing a development style much like PHP:"
@@ -34,4 +30,17 @@ $nl
 { $subsection <file-responder> }
 "The default just sends the file's contents with the request; " { $vocab-link "xmode.code2html.responder" } " provides an alternate hook which sends a syntax-highlighted version of the file." ;
 
+ARTICLE: "http.server.static" "Serving static content"
+"The " { $vocab-link "http.server.static" } " vocabulary implements a responder for serving static files."
+{ $subsection <static> }
+"The static responder does not serve directory listings by default, as a security measure. Directory listings can be enabled by storing a true value in the " { $slot "allow-listings" } " slot."
+$nl
+"If all you want to do is serve files from a directory, the following phrase does the trick:"
+{ $code
+    "USING: namespaces http.server http.server.static ;"
+    "/var/www/mysite.com/ <static> main-responder set"
+    "8080 httpd"
+}
+{ $subsection "http.server.static.extend" } ;
+
 ABOUT: "http.server.static"
old mode 100755 (executable)
new mode 100644 (file)
index 5ae1815..3e33070
@@ -3,7 +3,7 @@
 USING: calendar io io.files kernel math math.order\r
 math.parser namespaces parser sequences strings\r
 assocs hashtables debugger mime-types sorting logging\r
-calendar.format accessors\r
+calendar.format accessors splitting\r
 io.encodings.binary fry xml.entities destructors urls\r
 html.elements html.templates.fhtml\r
 http\r
@@ -14,9 +14,13 @@ IN: http.server.static
 \r
 TUPLE: file-responder root hook special allow-listings ;\r
 \r
+: modified-since ( request -- date )\r
+    "if-modified-since" header ";" split1 drop\r
+    dup [ rfc822>timestamp ] when ;\r
+\r
 : modified-since? ( filename -- ? )\r
-    request get "if-modified-since" header dup [\r
-        [ file-info modified>> ] [ rfc822>timestamp ] bi* after?\r
+    request get modified-since dup [\r
+        [ file-info modified>> ] dip after?\r
     ] [\r
         2drop t\r
     ] if ;\r
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/basis/interpolate/authors.txt b/basis/interpolate/authors.txt
new file mode 100644 (file)
index 0000000..b4bd0e7
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
\ No newline at end of file
diff --git a/basis/interpolate/interpolate-tests.factor b/basis/interpolate/interpolate-tests.factor
new file mode 100644 (file)
index 0000000..005ae87
--- /dev/null
@@ -0,0 +1,4 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: tools.test interpolate ;
+IN: interpolate.tests
diff --git a/basis/interpolate/interpolate.factor b/basis/interpolate/interpolate.factor
new file mode 100644 (file)
index 0000000..27f0756
--- /dev/null
@@ -0,0 +1,21 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: io kernel macros make multiline namespaces parser
+peg.ebnf present sequences strings ;
+IN: interpolate
+
+MACRO: interpolate ( string -- )
+[EBNF
+var = "${" [^}]+ "}" => [[ second >string [ get present write ] curry ]]
+text = [^$]+ => [[ >string [ write ] curry ]]
+interpolate = (var|text)* => [[ [ ] join ]]
+EBNF] ;
+
+EBNF: interpolate-locals
+var = "${" [^}]+ "}" => [[ [ second >string search , [ present write ] % ] [ ] make ]]
+text = [^$]+ => [[ [ >string , [ write ] % ] [ ] make ]]
+interpolate = (var|text)* => [[ [ ] join ]]
+;EBNF
+
+: I[ "]I" parse-multiline-string
+    interpolate-locals parsed \ call parsed ; parsing
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index fa496a3526da31d8670cde144db00333276371f1..e0ab11f1a452ce40787ff072292b80946d8940e6 100644 (file)
@@ -4,8 +4,8 @@ IN: io.encodings.ascii
 HELP: ascii
 { $class-description "ASCII encoding descriptor." } ;
 
-ARTICLE: "ascii" "ASCII encoding"
+ARTICLE: "io.encodings.ascii" "ASCII encoding"
 "By default, if there's a non-ASCII character in an input stream, it will be replaced with a replacement character (U+FFFD), and if a non-ASCII character is used in output, an exception is thrown."
 { $subsection ascii } ;
 
-ABOUT: "ascii"
+ABOUT: "io.encodings.ascii"
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 839f3d8..00711ce
@@ -58,9 +58,11 @@ ARTICLE: "io.servers.connection" "Threaded servers"
 { $subsection start-server }
 { $subsection start-server* }
 { $subsection wait-for-server }
+"Stopping the server:"
+{ $subsection stop-server }
 "From within the dynamic scope of a client handler, several words can be used to interact with the threaded server:"
 { $subsection remote-address }
-{ $subsection stop-server }
+{ $subsection stop-this-server }
 { $subsection secure-port }
 { $subsection insecure-port }
 "Additionally, the " { $link local-address } " variable is set, as in " { $link with-client } "." ;
@@ -88,7 +90,8 @@ HELP: handle-client*
 
 HELP: start-server
 { $values { "threaded-server" threaded-server } }
-{ $description "Starts a threaded server, returning when a client handler calls " { $link stop-server } "." } ;
+{ $description "Starts a threaded server." }
+{ $notes "Use " { $link stop-server } " or " { $link stop-this-server } " to stop the server." } ;
 
 HELP: wait-for-server
 { $values { "threaded-server" threaded-server } }
@@ -96,9 +99,13 @@ HELP: wait-for-server
 
 HELP: start-server*
 { $values { "threaded-server" threaded-server } }
-{ $description "Starts a threaded server, returning as soon as it is accepting connections." } ;
+{ $description "Starts a threaded server, returning as soon as it is ready to begin accepting connections." } ;
 
 HELP: stop-server
+{ $values { "threaded-server" threaded-server } }
+{ $description "Stops a threaded server, preventing it from accepting any more connections and returning to the caller of " { $link start-server } ". All client connections which have already been opened continue to be serviced." } ;
+
+HELP: stop-this-server
 { $description "Stops the current threaded server, preventing it from accepting any more connections and returning to the caller of " { $link start-server } ". All client connections which have already been opened continue to be serviced." } ;
 
 HELP: secure-port
old mode 100755 (executable)
new mode 100644 (file)
index aa8df0b..a3223ed
@@ -33,7 +33,7 @@ concurrency.promises io.encodings.ascii io threads calendar ;
     <threaded-server>
         5 >>max-connections
         1237 >>insecure
-        [ "Hello world." write stop-server ] >>handler
+        [ "Hello world." write stop-this-server ] >>handler
     "server" set
 ] unit-test
 
old mode 100755 (executable)
new mode 100644 (file)
index bde4e51..0516f24
@@ -136,8 +136,11 @@ PRIVATE>
     [ wait-for-server ]
     bi ;
 
-: stop-server ( -- )
-    threaded-server get [ f ] change-sockets drop dispose-each ;
+: stop-server ( threaded-server -- )
+    [ f ] change-sockets drop dispose-each ;
+
+: stop-this-server ( -- )
+    threaded-server get stop-server ;
 
 GENERIC: port ( addrspec -- n )
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 3c77be2..3454f33
@@ -104,7 +104,7 @@ HELP: <client>
 } ;
 
 HELP: with-client
-{ $values { "remote" "an address specifier" } { "encoding" "an encding descriptor" } { "quot" quotation } }
+{ $values { "remote" "an address specifier" } { "encoding" "an encoding descriptor" } { "quot" quotation } }
 { $description "Opens a network connection and calls the quotation in a new dynamic scope with " { $link input-stream } " and " { $link output-stream } " rebound to the network streams. The local address the socket is bound to is stored in the " { $link local-address } " variable." }
 { $errors "Throws an error if the connection cannot be established." } ;
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 9bfcc7e..c704382
@@ -17,10 +17,12 @@ IN: io.sockets
 ! Addressing
 GENERIC: protocol-family ( addrspec -- af )
 
-GENERIC: sockaddr-type ( addrspec -- type )
+GENERIC: sockaddr-size ( addrspec -- n )
 
 GENERIC: make-sockaddr ( addrspec -- sockaddr )
 
+GENERIC: empty-sockaddr ( addrspec -- sockaddr )
+
 GENERIC: address-size ( addrspec -- n )
 
 GENERIC: inet-ntop ( data addrspec -- str )
@@ -28,10 +30,10 @@ GENERIC: inet-ntop ( data addrspec -- str )
 GENERIC: inet-pton ( str addrspec -- data )
 
 : make-sockaddr/size ( addrspec -- sockaddr size )
-    [ make-sockaddr ] [ sockaddr-type heap-size ] bi ;
+    [ make-sockaddr ] [ sockaddr-size ] bi ;
 
 : empty-sockaddr/size ( addrspec -- sockaddr size )
-    sockaddr-type [ <c-object> ] [ heap-size ] bi ;
+    [ empty-sockaddr ] [ sockaddr-size ] bi ;
 
 GENERIC: parse-sockaddr ( sockaddr addrspec -- newaddrspec )
 
@@ -74,7 +76,9 @@ M: inet4 address-size drop 4 ;
 
 M: inet4 protocol-family drop PF_INET ;
 
-M: inet4 sockaddr-type drop "sockaddr-in" c-type ;
+M: inet4 sockaddr-size drop "sockaddr-in" heap-size ;
+
+M: inet4 empty-sockaddr drop "sockaddr-in" <c-object> ;
 
 M: inet4 make-sockaddr ( inet -- sockaddr )
     "sockaddr-in" <c-object>
@@ -128,7 +132,9 @@ M: inet6 address-size drop 16 ;
 
 M: inet6 protocol-family drop PF_INET6 ;
 
-M: inet6 sockaddr-type drop "sockaddr-in6" c-type ;
+M: inet6 sockaddr-size drop "sockaddr-in6" heap-size ;
+
+M: inet6 empty-sockaddr drop "sockaddr-in6" <c-object> ;
 
 M: inet6 make-sockaddr ( inet -- sockaddr )
     "sockaddr-in6" <c-object>
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 50952dd..8f9ff4f
@@ -139,7 +139,9 @@ M: unix (send) ( packet addrspec datagram -- )
 ! Unix domain sockets
 M: local protocol-family drop PF_UNIX ;
 
-M: local sockaddr-type drop "sockaddr-un" c-type ;
+M: local sockaddr-size drop "sockaddr-un" heap-size ;
+
+M: local empty-sockaddr drop "sockaddr-un" <c-object> ;
 
 M: local make-sockaddr
     path>> (normalize-path)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 7fbc1db..73b7750
@@ -1,9 +1,9 @@
 USING: alien alien.c-types arrays assocs combinators
 continuations destructors io io.backend io.ports io.timeouts
-io.windows io.windows.files libc kernel math namespaces
-sequences threads windows windows.errors windows.kernel32
-strings splitting io.files io.buffers qualified ascii system
-accessors locals ;
+io.windows io.windows.files io.files io.buffers io.streams.c
+libc kernel math namespaces sequences threads windows
+windows.errors windows.kernel32 strings splitting qualified
+ascii system accessors locals ;
 QUALIFIED: windows.winsock
 IN: io.windows.nt.backend
 
@@ -120,3 +120,5 @@ M: winnt (wait-to-read) ( port -- )
         [ finish-read ]
         tri
     ] with-destructors ;
+
+M: winnt (init-stdio) init-c-stdio ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 41c5e88..5d94cf2
@@ -71,7 +71,7 @@ TUPLE: AcceptEx-args port
     dwLocalAddressLength dwRemoteAddressLength lpdwBytesReceived lpOverlapped ;
 
 : init-accept-buffer ( addr AcceptEx -- )
-    swap sockaddr-type heap-size 16 +
+    swap sockaddr-size 16 +
         [ >>dwLocalAddressLength ] [ >>dwRemoteAddressLength ] bi
         dup dwLocalAddressLength>> 2 * malloc &free >>lpOutputBuffer
         drop ; inline
@@ -135,7 +135,7 @@ TUPLE: WSARecvFrom-args port
     WSARecvFrom-args new
         swap >>port
         dup port>> handle>> handle>> >>s
-        dup port>> addr>> sockaddr-type heap-size
+        dup port>> addr>> sockaddr-size
             [ malloc &free >>lpFrom ]
             [ malloc-int &free >>lpFromLen ] bi
         make-receive-buffer >>lpBuffers
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 3dfc17c08167418d2f2987d0e43650d4efe9dea4..eb368936d408e0c7e3301a807d2a2ff9d2c04a3c 100644 (file)
@@ -85,7 +85,7 @@ HELP: MEMO::
 { POSTPONE: MEMO: POSTPONE: MEMO:: } related-words
 
 ARTICLE: "locals-mutable" "Mutable locals"
-"In the list of bindings supplied to " { $link POSTPONE: :: } ", " { $link POSTPONE: [let } ", " { $link POSTPONE: [let* } " or " { $link POSTPONE: [| } ", a mutable binding may be introduced by suffixing its named with " { $snippet "!" } ". Mutable bindings are read by giving their name as usual; the suffix is not part of the binding's name. To write to a mutable binding, use the binding's with the " { $snippet "!" } " suffix."
+"In the list of bindings supplied to " { $link POSTPONE: :: } ", " { $link POSTPONE: [let } ", " { $link POSTPONE: [let* } " or " { $link POSTPONE: [| } ", a mutable binding may be introduced by suffixing its named with " { $snippet "!" } ". Mutable bindings are read by giving their name as usual; the suffix is not part of the binding's name. To write to a mutable binding, use the binding's name with the " { $snippet "!" } " suffix."
 $nl
 "Here is a example word which outputs a pair of quotations which increment and decrement an internal counter, and then return the new value. The quotations are closed over the counter and each invocation of the word yields new quotations with their unique internal counter:"
 { $code
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index f148d96b32fff3ec83711a6c339653f9e14544fc..bda772317310078748abad7f7efd18b4802edef1 100644 (file)
@@ -8,6 +8,6 @@ ARTICLE: "present" "Converting objects to human-readable strings"
 HELP: present
 { $values { "object" object } { "string" string } }
 { $contract "Outputs a human-readable string from an object." }
-{ $notes "New methods can be defined by user code. Most often, this is done so that the object can be used with various words in the " { $link "html.components" } " or " { $link "urls" } " vocabularies." } ;
+{ $notes "New methods can be defined by user code. Most often, this is done so that the object can be used with various words in the " { $vocab-link "html.components" } " or " { $link "urls" } " vocabularies." } ;
 
 ABOUT: "present"
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index cb899f4..a0565c6
@@ -10,13 +10,15 @@ io.encodings.utf8 destructors accessors ;
 IN: tools.deploy.backend
 
 : copy-vm ( executable bundle-name extension -- vm )
-  [ prepend-path ] dip append vm over copy-file ;
+    [ prepend-path ] dip append vm over copy-file ;
 
 : copy-fonts ( name dir -- )
-  append-path "resource:fonts/" swap copy-tree-into ;
+    deploy-ui? get [
+        append-path "resource:fonts/" swap copy-tree-into
+    ] [ 2drop ] if ;
 
 : image-name ( vocab bundle-name -- str )
-  prepend-path ".image" append ;
+    prepend-path ".image" append ;
 
 : copy-lines ( -- )
     readln [ print flush copy-lines ] when* ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 1d5b59b..db4255c
@@ -66,7 +66,7 @@ http.server.responses http.server.static io.servers.connection ;
 SINGLETON: quit-responder\r
 \r
 M: quit-responder call-responder*\r
-    2drop stop-server "Goodbye" "text/html" <content> ;\r
+    2drop stop-this-server "Goodbye" "text/html" <content> ;\r
 \r
 : add-quot-responder ( responder -- responder )\r
     quit-responder "quit" add-responder ;\r
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index ee60ce3..d346499
@@ -4,7 +4,7 @@ USING: io io.files kernel namespaces make sequences
 system tools.deploy.backend tools.deploy.config assocs
 hashtables prettyprint io.unix.backend cocoa io.encodings.utf8
 io.backend cocoa.application cocoa.classes cocoa.plists
-qualified ;
+qualified combinators ;
 IN: tools.deploy.macosx
 
 : bundle-dir ( -- dir )
@@ -30,12 +30,26 @@ IN: tools.deploy.macosx
     "Contents/Info.plist" append-path
     write-plist ;
 
+: copy-dll ( bundle-name -- )
+    "Frameworks/libfactor.dylib" copy-bundle-dir ;
+
+: copy-freetype ( bundle-name -- )
+    deploy-ui? get [ "Frameworks" copy-bundle-dir ] [ drop ] if ;
+
+: copy-nib ( bundle-name -- )
+    deploy-ui? get [
+        "Resources/English.lproj/MiniFactor.nib" copy-bundle-dir
+    ] [ drop ] if ;
+
 : create-app-dir ( vocab bundle-name -- vm )
     [
-        nip
-        [ "Frameworks" copy-bundle-dir ]
-        [ "Resources/English.lproj/MiniFactor.nib" copy-bundle-dir ]
-        [ "Contents/Resources/" copy-fonts ] tri
+        nip {
+            [ copy-dll ]
+            [ copy-freetype ]
+            [ copy-nib ]
+            [ "Contents/Resources/" copy-fonts ]
+            [ "Contents/Resources" append-path make-directories ]
+        } cleave
     ]
     [ create-app-plist ]
     [ "Contents/MacOS/" append-path "" copy-vm ] 2tri ;
old mode 100755 (executable)
new mode 100644 (file)
index f8b0862..7c02e87
@@ -1,20 +1,18 @@
 ! Copyright (C) 2007, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors qualified io.streams.c init fry namespaces make
-assocs kernel parser lexer strings.parser tools.deploy.config
-vocabs sequences words words.private memory kernel.private
-continuations io prettyprint vocabs.loader debugger system
-strings sets vectors quotations byte-arrays sorting ;
+USING: accessors qualified io.backend io.streams.c init fry
+namespaces make assocs kernel parser lexer strings.parser
+tools.deploy.config vocabs sequences words words.private memory
+kernel.private continuations io prettyprint vocabs.loader
+debugger system strings sets vectors quotations byte-arrays
+sorting compiler.units definitions ;
 QUALIFIED: bootstrap.stage2
 QUALIFIED: classes
 QUALIFIED: command-line
 QUALIFIED: compiler.errors.private
-QUALIFIED: compiler.units
 QUALIFIED: continuations
 QUALIFIED: definitions
 QUALIFIED: init
-QUALIFIED: io.backend
-QUALIFIED: io.thread
 QUALIFIED: layouts
 QUALIFIED: listener
 QUALIFIED: prettyprint.config
@@ -87,8 +85,8 @@ IN: tools.deploy.shaker
             ] change-props drop
         ] each
     ] [
-        "Remaining word properties:" print
-        [ props>> keys ] gather .
+        "Remaining word properties:\n" show
+        [ props>> keys ] gather unparse show
     ] [
         H{ } clone '[
             [ [ _ [ ] cache ] map ] change-props drop
@@ -198,11 +196,6 @@ IN: tools.deploy.shaker
     strip-word-names? [ dup strip-word-names ] when
     2drop ;
 
-: strip-recompile-hook ( -- )
-    [ [ f ] { } map>assoc ]
-    compiler.units:recompile-hook
-    set-global ;
-
 : strip-vocab-globals ( except names -- words )
     [ child-vocabs [ words ] map concat ] map concat swap diff ;
 
@@ -220,20 +213,21 @@ IN: tools.deploy.shaker
             continuations:restarts
             listener:error-hook
             init:init-hooks
-            io.thread:io-thread
             source-files:source-files
             input-stream
             output-stream
             error-stream
         } %
 
+        "io-thread" "io.thread" lookup ,
+
         "mallocs" "libc.private" lookup ,
 
         deploy-threads? [
             "initial-thread" "threads" lookup ,
         ] unless
 
-        strip-io? [ io.backend:io-backend , ] when
+        strip-io? [ io-backend , ] when
 
         { } {
             "alarms"
@@ -260,9 +254,9 @@ IN: tools.deploy.shaker
                 command-line:main-vocab-hook
                 compiled-crossref
                 compiled-generic-crossref
-                compiler.units:recompile-hook
-                compiler.units:update-tuples-hook
-                compiler.units:definition-observers
+                recompile-hook
+                update-tuples-hook
+                definition-observers
                 definitions:crossref
                 interactive-vocabs
                 layouts:num-tags
@@ -326,6 +320,14 @@ IN: tools.deploy.shaker
         21 setenv
     ] [ drop ] if ;
 
+: strip-c-io ( -- )
+    deploy-io get 2 = [
+        [
+            c-io-backend forget
+            "io.streams.c" forget-vocab
+        ] with-compilation-unit
+    ] unless ;
+
 : compress ( pred string -- )
     "Compressing " prepend show
     instances
@@ -358,22 +360,29 @@ SYMBOL: deploy-vocab
         init-hooks get values concat %
         ,
         strip-io? [ \ flush , ] unless
-    ] [ ] make "Boot quotation: " write dup . flush
+    ] [ ] make "Boot quotation: " show dup unparse show
     set-boot-quot ;
 
+: init-stripper ( -- )
+    t "quiet" set-global
+    f output-stream set-global ;
+
 : strip ( -- )
+    init-stripper
     strip-libc
     strip-cocoa
     strip-debugger
-    strip-recompile-hook
     strip-init-hooks
+    strip-c-io
+    f 5 setenv ! we can't use the Factor debugger or Factor I/O anymore
     deploy-vocab get vocab-main set-boot-quot*
     stripped-word-props >r
     stripped-globals strip-globals
     r> strip-words
     compress-byte-arrays
     compress-quotations
-    compress-strings ;
+    compress-strings
+    H{ } clone classes:next-method-quot-cache set-global ;
 
 : (deploy) ( final-image vocab config -- )
     #! Does the actual work of a deployment in the slave
old mode 100755 (executable)
new mode 100644 (file)
index 2cf803e..d5249dc
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: cocoa cocoa.messages cocoa.application cocoa.nibs assocs
 namespaces kernel kernel.private words compiler.units sequences
-ui ui.cocoa init ;
+init vocabs ;
 IN: tools.deploy.shaker.cocoa
 
 : pool ( obj -- obj' ) \ pool get [ ] cache ;
@@ -23,9 +23,12 @@ IN: cocoa.application
 
 H{ } clone \ pool [
     global [
-        stop-after-last-window? set
+        "stop-after-last-window?" "ui" lookup set
 
-        [ "MiniFactor.nib" load-nib ] cocoa-init-hook set-global
+        "ui.cocoa" vocab [
+            [ "MiniFactor.nib" load-nib ]
+            "cocoa-init-hook" "ui.cocoa" lookup set-global
+        ] when
 
         ! Only keeps those methods that we actually call
         sent-messages get super-sent-messages get assoc-union
old mode 100755 (executable)
new mode 100644 (file)
index 2302b61..bdcc6c2
@@ -1,8 +1,14 @@
-USING: kernel threads threads.private ;
+USING: compiler.units words vocabs kernel threads.private ;
 IN: debugger
 
 : print-error ( error -- ) die drop ;
 
 : error. ( error -- ) die drop ;
 
-M: thread error-in-thread ( error thread -- ) die 2drop ;
+"threads" vocab [
+    [
+        "error-in-thread" "threads" lookup
+        [ die 2drop ]
+        define
+    ] with-compilation-unit
+] when
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index e0ce2c2..ce4fee1
@@ -5,16 +5,23 @@ tools.deploy.backend tools.deploy.config assocs hashtables
 prettyprint combinators windows.shell32 windows.user32 ;
 IN: tools.deploy.windows
 
-: copy-dlls ( bundle-name -- )
-    {
-        "resource:freetype6.dll"
-        "resource:zlib1.dll"
-        "resource:factor.dll"
-    } swap copy-files-into ;
+: copy-dll ( bundle-name -- )
+    "resource:factor.dll" swap copy-file-into ;
+
+: copy-freetype ( bundle-name -- )
+    deploy-ui? get [
+        {
+            "resource:freetype6.dll"
+            "resource:zlib1.dll"
+        } swap copy-files-into
+    ] when ;
 
 : create-exe-dir ( vocab bundle-name -- vm )
-    dup copy-dlls
-    dup "" copy-fonts
+    deploy-ui? get [
+        dup copy-dll
+        dup copy-freetype
+        dup "" copy-fonts
+    ] when
     ".exe" copy-vm ;
 
 M: winnt deploy*
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index e22e10f8c9ea5f7771f6f0fda67b843039090c8e..d2989d3cac81c30a1596658ef8e2a54ba06a44ef 100644 (file)
@@ -5,7 +5,7 @@ IN: tools.scaffold
 
 HELP: developer-name
 { $description "Set this symbol to hold your name so that the scaffold tools can generate the correct file header for copyright. Setting this variable in your .factor-boot-rc file is recommended." }
-{ $unchecked-example "USING: namespaces tools.scaffold ;\n\"Stacky Guy\" developer-name set-global" } ;
+{ $code "USING: namespaces tools.scaffold ;\n\"Stacky Guy\" developer-name set-global" } ;
 
 HELP: help.
 { $values
@@ -13,8 +13,7 @@ HELP: help.
 { $description "Prints out scaffold help markup for a given word." } ;
 
 HELP: scaffold-help
-{ $values
-     { "vocab-root" "a vocabulary root string" } { "string" string } }
+{ $values { "string" string } }
 { $description "Takes an existing vocabulary and creates a help file with scaffolded help for each word. This word only works if no help file yet exists." } ;
 
 HELP: scaffold-undocumented
index d8d35ebf31837cb7a64e939d5f30152e1ae02f78..17eafa91c6d1c6ae91511a1c698f525461c040dd 100644 (file)
@@ -217,9 +217,9 @@ PRIVATE>
 : help. ( word -- )
     [ (help.) ] [ nl vocabulary>> link-vocab ] bi ;
 
-: scaffold-help ( vocab-root string -- )
+: scaffold-help ( string -- )
     [
-        check-vocab
+        [ find-vocab-root ] [ check-vocab ] bi
         prepare-scaffold
         [ "-docs.factor" scaffold-path ] dip
         swap [ set-scaffold-help-file ] [ 2drop ] if
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 64e14c4..1c00bed
@@ -6,7 +6,7 @@ ARTICLE: "ui-grid-layout" "Grid layouts"
 { $subsection grid }
 "Creating grids from a fixed set of gadgets:"
 { $subsection <grid> }
-"Managing chidren:"
+"Managing children:"
 { $subsection grid-add }
 { $subsection grid-remove }
 { $subsection grid-child } ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 46fa0105a3164e9555273b08433cb097a1152052..5e4a2fbf4ce92c13b28819a934895cda2080f924 100644 (file)
@@ -2,7 +2,8 @@
 ! Copyright (C) 2006, 2007 Alex Chapman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays kernel sequences io.styles ui.gadgets ui.render
-colors accessors ;
+colors colors.gray qualified accessors ;
+QUALIFIED: colors
 IN: ui.gadgets.theme
 
 : solid-interior ( gadget color -- gadget )
@@ -12,7 +13,7 @@ IN: ui.gadgets.theme
     <solid> >>boundary ; inline
 
 : faint-boundary ( gadget -- gadget )
-    gray solid-boundary ; inline
+    colors:gray solid-boundary ; inline
 
 : selection-color ( -- color ) light-purple ;
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 1bdc63e..6f901c3
@@ -101,10 +101,10 @@ world H{
     { T{ key-down f { C+ } "c" } [ T{ copy-action } send-action ] }
     { T{ key-down f { C+ } "v" } [ T{ paste-action } send-action ] }
     { T{ key-down f { C+ } "a" } [ T{ select-all-action } send-action ] }
-    { T{ button-down f { C+ } 1 } [ T{ button-down f f 3 } swap resend-button-down ] }
-    { T{ button-down f { A+ } 1 } [ T{ button-down f f 2 } swap resend-button-down ] }
-    { T{ button-up f { C+ } 1 } [ T{ button-up f f 3 } swap resend-button-up ] }
-    { T{ button-up f { A+ } 1 } [ T{ button-up f f 2 } swap resend-button-up ] }
+    { T{ button-down f { C+ } 1 } [ drop T{ button-down f f 3 } button-gesture ] }
+    { T{ button-down f { A+ } 1 } [ drop T{ button-down f f 2 } button-gesture ] }
+    { T{ button-up f { C+ } 1 } [ drop T{ button-up f f 3 } button-gesture ] }
+    { T{ button-up f { A+ } 1 } [ drop T{ button-up f f 2 } button-gesture ] }
 } set-gestures
 
 : close-global ( world global -- )
old mode 100755 (executable)
new mode 100644 (file)
index a1c6ada..2a29d32
@@ -249,12 +249,6 @@ SYMBOL: drag-timer
 : send-action ( world gesture -- )
     swap world-focus send-gesture drop ;
 
-: resend-button-down ( gesture world -- )
-    hand-loc get-global swap send-button-down ;
-
-: resend-button-up  ( gesture world -- )
-    hand-loc get-global swap send-button-up ;
-
 GENERIC: gesture>string ( gesture -- string/f )
 
 : modifiers>string ( modifiers -- string )
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/basis/urls/secure/secure.factor b/basis/urls/secure/secure.factor
new file mode 100644 (file)
index 0000000..d2fa55f
--- /dev/null
@@ -0,0 +1,6 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: urls urls.private io.sockets io.sockets.secure ;
+IN: urls.secure
+
+M: abstract-inet >secure-addr <secure> ;
index 5cc8c9693b50f7384a5ec566f13e652728324ef3..30e8c68f9dc80b1e83ead85c3c73faa671b4deb2 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel ascii combinators combinators.short-circuit
 sequences splitting fry namespaces make assocs arrays strings
-io.sockets io.sockets.secure io.encodings.string
+io.sockets io.encodings.string
 io.encodings.utf8 math math.parser accessors parser
 strings.parser lexer prettyprint.backend hashtables present
 peg.ebnf urls.encoding ;
@@ -159,6 +159,12 @@ PRIVATE>
 : secure-protocol? ( protocol -- ? )
     "https" = ;
 
+<PRIVATE
+
+GENERIC: >secure-addr ( addrspec -- addrspec' )
+
+PRIVATE>
+
 : url-addr ( url -- addr )
     [
         [ host>> ]
@@ -166,7 +172,7 @@ PRIVATE>
         [ protocol>> protocol-port ]
         tri or <inet>
     ] [ protocol>> ] bi
-    secure-protocol? [ <secure> ] when ;
+    secure-protocol? [ >secure-addr ] when ;
 
 : ensure-port ( url -- url )
     dup protocol>> '[ _ protocol-port or ] change-port ;
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index ff7aac3..f8a2ff4
@@ -28,12 +28,13 @@ $nl
 $nl
 "Classes themselves form a class:"
 { $subsection class? }
-"You can ask an object for its class or superclass:"
+"You can ask an object for its class:"
 { $subsection class }
-{ $subsection superclass }
-{ $subsection superclasses }
 "Testing if an object is an instance of a class:"
 { $subsection instance? }
+"You can ask a class for its superclass:"
+{ $subsection superclass }
+{ $subsection superclasses }
 "Class predicates can be used to test instances directly:"
 { $subsection "class-predicates" }
 "There is a universal class which all objects are an instance of, and an empty class with no instances:"
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 67a789a..dcb69c9
@@ -10,20 +10,23 @@ SYMBOL: class-not-cache
 SYMBOL: classes-intersect-cache
 SYMBOL: class-and-cache
 SYMBOL: class-or-cache
+SYMBOL: next-method-quot-cache
 
 : init-caches ( -- )
     H{ } clone class<=-cache set
     H{ } clone class-not-cache set
     H{ } clone classes-intersect-cache set
     H{ } clone class-and-cache set
-    H{ } clone class-or-cache set ;
+    H{ } clone class-or-cache set
+    H{ } clone next-method-quot-cache set ;
 
 : reset-caches ( -- )
     class<=-cache get clear-assoc
     class-not-cache get clear-assoc
     classes-intersect-cache get clear-assoc
     class-and-cache get clear-assoc
-    class-or-cache get clear-assoc ;
+    class-or-cache get clear-assoc
+    next-method-quot-cache get clear-assoc ;
 
 SYMBOL: update-map
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 22c690f..aae7618
@@ -222,3 +222,17 @@ M: integer a-generic a-word ;
     M: boii jeah ;
     "> eval
 ] unit-test
+
+! call-next-method cache test
+GENERIC: c-n-m-cache ( a -- b )
+
+! Force it to be unoptimized
+M: fixnum c-n-m-cache { } [ ] like call call-next-method ;
+M: integer c-n-m-cache 1 + ;
+M: number c-n-m-cache ;
+
+[ 3 ] [ 2 c-n-m-cache ] unit-test
+
+[ ] [ [ { integer c-n-m-cache } forget ] with-compilation-unit ] unit-test
+
+[ 2 ] [ 2 c-n-m-cache ] unit-test
old mode 100755 (executable)
new mode 100644 (file)
index 026e372..095a8d5
@@ -45,7 +45,9 @@ GENERIC: effective-method ( generic -- method )
 GENERIC: next-method-quot* ( class generic combination -- quot )
 
 : next-method-quot ( class generic -- quot )
-    dup "combination" word-prop next-method-quot* ;
+    next-method-quot-cache get [
+        dup "combination" word-prop next-method-quot*
+    ] 2cache ;
 
 : (call-next-method) ( class generic -- )
     next-method-quot call ;
@@ -99,10 +101,11 @@ M: method-body crossref?
     2bi ;
 
 : create-method ( class generic -- method )
-    2dup method dup [
-        2nip
-    ] [
-        drop [ <method> dup ] 2keep reveal-method
+    2dup method dup [ 2nip ] [
+        drop
+        [ <method> dup ] 2keep
+        reveal-method
+        reset-caches
     ] if ;
 
 PREDICATE: default-method < word "default" word-prop ;
@@ -149,8 +152,8 @@ M: method-body forget*
                 ] keep eq?
                 [
                     [ [ delete-at ] with-methods ]
-                    [ [ delete-at ] with-implementors ]
-                    2bi
+                    [ [ delete-at ] with-implementors ] 2bi
+                    reset-caches
                 ] [ 2drop ] if
             ] if
         ]
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 0760063..0c13277
@@ -6,6 +6,10 @@ IN: io.backend
 
 SYMBOL: io-backend
 
+SINGLETON: c-io-backend
+
+c-io-backend io-backend set-global
+
 HOOK: init-io io-backend ( -- )
 
 HOOK: (init-stdio) io-backend ( -- stdin stdout stderr )
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 780d892..1e12d7e
@@ -54,26 +54,28 @@ M: c-reader stream-read-until
 M: c-reader dispose*
     handle>> fclose ;
 
-M: object init-io ;
+M: c-io-backend init-io ;
 
 : stdin-handle 11 getenv ;
 : stdout-handle 12 getenv ;
 : stderr-handle 61 getenv ;
 
-M: object (init-stdio)
+: init-c-stdio ( -- stdin stdout stderr )
     stdin-handle <c-reader>
     stdout-handle <c-writer>
     stderr-handle <c-writer> ;
 
-M: object io-multiplex 60 60 * 1000 * or (sleep) ;
+M: c-io-backend (init-stdio) init-c-stdio ;
 
-M: object (file-reader)
+M: c-io-backend io-multiplex 60 60 * 1000 * or (sleep) ;
+
+M: c-io-backend (file-reader)
     "rb" fopen <c-reader> ;
 
-M: object (file-writer)
+M: c-io-backend (file-writer)
     "wb" fopen <c-writer> ;
 
-M: object (file-appender)
+M: c-io-backend (file-appender)
     "ab" fopen <c-writer> ;
 
 : show ( msg -- )
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index aad87ca..0fb2559
@@ -108,3 +108,6 @@ unit-test
 [ -1.0/0.0 ] [ "-1/0." string>number ] unit-test
 
 [ "-0.0" ] [ -0.0 number>string ] unit-test
+
+[ "-3/4" ] [ -3/4 number>string ] unit-test
+[ "-1-1/4" ] [ -5/4 number>string ] unit-test
old mode 100755 (executable)
new mode 100644 (file)
index a126bbe..0134693
@@ -105,7 +105,7 @@ GENERIC# >base 1 ( n radix -- str )
 
 <PRIVATE
 
-: (>base) ( n -- str ) radix get >base ;
+: (>base) ( n -- str ) radix get positive>base ;
 
 PRIVATE>
 
@@ -123,7 +123,7 @@ M: integer >base
 M: ratio >base
     [
         dup 0 < negative? set
-        1 /mod
+        abs 1 /mod
         [ dup zero? [ drop "" ] [ (>base) sign append ] if ]
         [
             [ numerator (>base) ]
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 267238a..63cc14d
@@ -27,7 +27,7 @@ M: sequence lengthen 2dup length > [ set-length ] [ 2drop ] if ;
 
 M: sequence shorten 2dup length < [ set-length ] [ 2drop ] if ;
 
-: empty? ( seq -- ? ) length zero? ; inline
+: empty? ( seq -- ? ) length 0 = ; inline
 
 : if-empty ( seq quot1 quot2 -- )
     [ dup empty? ] [ [ drop ] prepose ] [ ] tri* if ; inline
@@ -362,7 +362,7 @@ PRIVATE>
     prepose curry ; inline
 
 : (interleave) ( n elt between quot -- )
-    roll zero? [ nip ] [ swapd 2slip ] if call ; inline
+    roll 0 = [ nip ] [ swapd 2slip ] if call ; inline
 
 PRIVATE>
 
@@ -530,7 +530,7 @@ M: sequence <=>
     [ -rot 2nth-unsafe <=> ] [ [ length ] compare ] if* ;
 
 : sequence= ( seq1 seq2 -- ? )
-    2dup [ length ] bi@ number=
+    2dup [ length ] bi@ =
     [ mismatch not ] [ 2drop f ] if ; inline
 
 : sequence-hashcode-step ( oldhash newpart -- newhash )
@@ -547,7 +547,7 @@ M: reversed equal? over reversed? [ sequence= ] [ 2drop f ] if ;
 M: slice equal? over slice? [ sequence= ] [ 2drop f ] if ;
 
 : move ( to from seq -- )
-    2over number=
+    2over =
     [ 3drop ] [ [ nth swap ] [ set-nth ] bi ] if ; inline
 
 <PRIVATE
@@ -582,7 +582,7 @@ PRIVATE>
 <PRIVATE
 
 : move-backward ( shift from to seq -- )
-    2over number= [
+    2over = [
         2drop 2drop
     ] [
         [ >r 2over + pick r> move >r 1+ r> ] keep
@@ -590,7 +590,7 @@ PRIVATE>
     ] if ;
 
 : move-forward ( shift from to seq -- )
-    2over number= [
+    2over = [
         2drop 2drop
     ] [
         [ >r pick >r dup dup r> + swap r> move 1- ] keep
@@ -607,7 +607,7 @@ PRIVATE>
 PRIVATE>
 
 : open-slice ( shift from seq -- )
-    pick zero? [
+    pick 0 = [
         3drop
     ] [
         pick over length + over >r >r
@@ -680,7 +680,7 @@ PRIVATE>
 
 : padding ( seq n elt quot -- newseq )
     [
-        [ over length [-] dup zero? [ drop ] ] dip
+        [ over length [-] dup 0 = [ drop ] ] dip
         [ <repetition> ] curry
     ] dip compose if ; inline
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 3c207c4..6c9d838
@@ -11,7 +11,7 @@ SINGLETON: ppc
 
 UNION: x86 x86.32 x86.64 ;
 
-: cpu ( -- class ) \ cpu get ;
+: cpu ( -- class ) \ cpu get-global ; foldable
 
 SINGLETON: winnt
 SINGLETON: wince
@@ -29,7 +29,7 @@ UNION: bsd freebsd netbsd openbsd macosx ;
 
 UNION: unix bsd solaris linux ;
 
-: os ( -- class ) \ os get ;
+: os ( -- class ) \ os get-global ; foldable
 
 <PRIVATE
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 5627a1a..b7b34f1
@@ -87,6 +87,8 @@ M: word (quot-uses) over crossref? [ conjoin ] [ 2drop ] if ;
 
 M: array (quot-uses) seq-uses ;
 
+M: hashtable (quot-uses) >r >alist r> seq-uses ;
+
 M: callable (quot-uses) seq-uses ;
 
 M: wrapper (quot-uses) >r wrapped>> r> (quot-uses) ;
diff --git a/extra/assoc-heaps/assoc-heaps-docs.factor b/extra/assoc-heaps/assoc-heaps-docs.factor
new file mode 100644 (file)
index 0000000..8beaf9c
--- /dev/null
@@ -0,0 +1,33 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: help.markup help.syntax io.streams.string ;
+IN: assoc-heaps
+
+HELP: <assoc-heap>
+{ $description "Constructs a new " { $link assoc-heap } " from two existing data structures." } ;
+
+HELP: <unique-max-heap>
+{ $values
+    
+     { "unique-heap" assoc-heap } }
+{ $description "Creates a new " { $link assoc-heap } " where the assoc is a hashtable and the heap is a max-heap. Popping an element from the heap leaves this element in the hashtable to ensure that the element will not be processed again." } ;
+
+HELP: <unique-min-heap>
+{ $values
+     { "unique-heap" assoc-heap } }
+{ $description "Creates a new " { $link assoc-heap } " where the assoc is a hashtable and the heap is a min-heap. Popping an element from the heap leaves this element in the hashtable to ensure that the element will not be processed again." } ;
+
+{ <unique-max-heap> <unique-min-heap> } related-words
+
+HELP: assoc-heap
+{ $description "A data structure containing an assoc and a heap to get certain properties with better time constraints at the expense of more space and complexity. For instance, a hashtable and a heap can be combined into one assoc-heap to get a sorted data structure with O(1) lookup. Operations on assoc-heap may update both the assoc and the heap or leave them out of sync if it's advantageous." } ;
+
+ARTICLE: "assoc-heaps" "Associative heaps"
+"The " { $vocab-link "assoc-heaps" } " vocabulary combines exists to synthesize data structures with better time properties than either of the two component data structures alone." $nl
+"Associative heap constructor:"
+{ $subsection <assoc-heap> }
+"Unique heaps:"
+{ $subsection <unique-min-heap> }
+{ $subsection <unique-max-heap> } ;
+
+ABOUT: "assoc-heaps"
diff --git a/extra/assoc-heaps/assoc-heaps-tests.factor b/extra/assoc-heaps/assoc-heaps-tests.factor
new file mode 100644 (file)
index 0000000..6ea3fe1
--- /dev/null
@@ -0,0 +1,4 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: tools.test assoc-heaps ;
+IN: assoc-heaps.tests
diff --git a/extra/assoc-heaps/assoc-heaps.factor b/extra/assoc-heaps/assoc-heaps.factor
new file mode 100644 (file)
index 0000000..a495aed
--- /dev/null
@@ -0,0 +1,30 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs hashtables heaps kernel ;
+IN: assoc-heaps
+
+TUPLE: assoc-heap assoc heap ;
+
+C: <assoc-heap> assoc-heap
+
+: <unique-min-heap> ( -- unique-heap )
+    H{ } clone <min-heap> <assoc-heap> ;
+
+: <unique-max-heap> ( -- unique-heap )
+    H{ } clone <max-heap> <assoc-heap> ;
+
+M: assoc-heap heap-push* ( value key assoc-heap -- entry )
+    pick over assoc>> key? [
+        3drop f
+    ] [
+        [ assoc>> swapd set-at ] [ heap>> heap-push* ] 3bi
+    ] if ;
+
+M: assoc-heap heap-pop ( assoc-heap -- value key )
+    heap>> heap-pop ;
+
+M: assoc-heap heap-peek ( assoc-heap -- value key )
+    heap>> heap-peek ;
+
+M: assoc-heap heap-empty? ( assoc-heap -- value key )
+    heap>> heap-empty? ;
diff --git a/extra/assoc-heaps/authors.txt b/extra/assoc-heaps/authors.txt
new file mode 100644 (file)
index 0000000..b4bd0e7
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
\ No newline at end of file
index 7bbb25a47d532a5be1c16628610b2524cd54592a..218f566eda96bd24a8db9ce94ac84d1614b67be0 100644 (file)
@@ -1,10 +1,11 @@
 USING: math math.order kernel arrays byte-arrays sequences
-colors.hsv benchmark.mandel.params ;
+colors.hsv benchmark.mandel.params accessors colors ;
 IN: benchmark.mandel.colors
 
 : scale 255 * >fixnum ; inline
 
-: scale-rgb ( r g b -- n ) [ scale ] tri@ 3byte-array ;
+: scale-rgb ( rgba -- n )
+    [ red>> scale ] [ green>> scale ] [ blue>> scale ] tri 3byte-array ;
 
 : sat 0.85 ; inline
 : val 0.85 ; inline
@@ -12,7 +13,7 @@ IN: benchmark.mandel.colors
 : <color-map> ( nb-cols -- map )
     dup [
         360 * swap 1+ / sat val
-        3array hsv>rgb first3 scale-rgb
+        1 <hsva> >rgba scale-rgb
     ] with map ;
 
 : color-map ( -- map )
index 47331efd7e1b454272661308b97cc3844702536d..72ffb638487d6928ffdcf247e7e381c2430ff513 100644 (file)
@@ -55,48 +55,30 @@ HELP: axion
 
 ARTICLE: "bubble-chamber" "Bubble Chamber"
 
-  { $subsection "bubble-chamber-introduction" }
-  { $subsection "bubble-chamber-particles" }
-  { $subsection "bubble-chamber-author" }
-  { $subsection "bubble-chamber-running" } ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-ARTICLE: "bubble-chamber-introduction" "Introduction"
-
-"The Bubble Chamber is a generative painting system of imaginary "
+"The " { $vocab-link "bubble-chamber" } 
+" is a generative painting system of imaginary "
 "colliding particles. A single super-massive collision produces a "
 "discrete universe of four particle types. Particles draw their "
-"positions over time as pixel exposures. " ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-ARTICLE: "bubble-chamber-particles" "Particles"
-
+"positions over time as pixel exposures.\n"
+"\n"
 "Four types of particles exist. The behavior and graphic appearance of "
-"each particle type is unique."
-
+"each particle type is unique.\n"
   { $subsection muon }
   { $subsection quark }
   { $subsection hadron }
-  { $subsection axion } ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-ARTICLE: "bubble-chamber-author" "Author"
-
-  "Bubble Chamber was created by Jared Tarbell. "
-  "It was originally implemented in Processing. "
-  "It was ported to Factor by Eduardo Cavazos. "
-  "The original work is on display here: "
-  { $url
-  "http://www.complexification.net/gallery/machines/bubblechamber/" } ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-ARTICLE: "bubble-chamber-running" "How to use"
+  { $subsection axion } 
+"\n"
+"After you run the vocabulary, a window will appear. Click the "
+"mouse in a random area to fire 11 particles of each type. "
+"Another way to fire particles is to press the "
+"spacebar. This fires all the particles.\n"
+"\n"
+"Bubble Chamber was created by Jared Tarbell. "
+"It was originally implemented in Processing. "
+"It was ported to Factor by Eduardo Cavazos. "
+"The original work is on display here: "
+{ $url
+"http://www.complexification.net/gallery/machines/bubblechamber/" } ;
+
+ABOUT: "bubble-chamber"
 
-  "After you run the vocabulary, a window will appear. Click the "
-  "mouse in a random area to fire 11 particles of each type. "
-  "Another way to fire particles is to press the "
-  "spacebar. This fires all the particles." ;
\ No newline at end of file
index 4a0c14814594e23f8901c9bf93ffd067ee3cb468..6ed8c1220cada5ff06bddf3b30effce3a2d6867f 100755 (executable)
@@ -23,7 +23,7 @@ M: color-preview model-changed
     swap value>> >>interior relayout-1 ;
 
 : <color-model> ( model -- model )
-    [ [ 256 /f ] map 1 suffix first4 rgba boa <solid> ] <filter> ;
+    [ first3 [ 256 /f ] tri@ 1 <rgba> <solid> ] <filter> ;
 
 : <color-sliders> ( -- model gadget )
     3 [ 0 0 0 255 <range> ] replicate
index 5c640c6fb917d18d0b89620bf436922b640b40b8..095e3c32469255384e6a1ec66872404cd0e5b8d3 100755 (executable)
@@ -3,13 +3,13 @@
 USING: assocs html.parser kernel math sequences strings ascii
 arrays generalizations shuffle unicode.case namespaces make
 splitting http accessors io combinators http.client urls
-urls.encoding fry sequences.lib ;
+urls.encoding fry ;
 IN: html.parser.analyzer
 
 TUPLE: link attributes clickable ;
 
-: scrape-html ( url -- vector )
-    http-get nip parse-html ;
+: scrape-html ( url -- headers vector )
+    http-get parse-html ;
 
 : find-all ( seq quot -- alist )
    [ <enum> >alist ] [ '[ second @ ] ] bi* filter ; inline
index b28b5e1c86bc44ea78d2de6a442ebd5c05347b89..3ca9c07c367614a5c1ceaa66fa3d79051cf83807 100644 (file)
@@ -18,11 +18,11 @@ HELP: printf
     { $example
         "USING: printf ;"
         "1.23456789 \"%.3f\" printf"
-        "1.234" }
+        "1.235" }
     { $example 
         "USING: printf ;"
         "1234567890 \"%.5e\" printf"
-        "1.23456e+09" }
+        "1.23457e+09" }
     { $example
         "USING: printf ;"
         "12 \"%'#4d\" printf"
index 5302048dfe8be5dc9ab6b16dc8c2fee52bb6eb90..2123784ea1b18588d9adf1997b0f7c0e7537c7ae 100644 (file)
@@ -23,25 +23,27 @@ USING: kernel printf tools.test ;
 
 [ t ] [ "+0010" 10 "%+05d" sprintf = ] unit-test
 
-[ t ] [ "123.456" 123.456 "%f" sprintf = ] unit-test
+[ t ] [ "123.456000" 123.456 "%f" sprintf = ] unit-test
+
+[ t ] [ "2.44" 2.436 "%.2f" sprintf = ] unit-test
 
 [ t ] [ "123.10" 123.1 "%01.2f" sprintf = ] unit-test
 
-[ t ] [ "1.2345" 1.23456789 "%.4f" sprintf = ] unit-test
+[ t ] [ "1.2346" 1.23456789 "%.4f" sprintf = ] unit-test
 
 [ t ] [ "  1.23" 1.23456789 "%6.2f" sprintf = ] unit-test
 
-[ t ] [ "1.234e+08" 123400000 "%e" sprintf = ] unit-test
+[ t ] [ "1.234000e+08" 123400000 "%e" sprintf = ] unit-test
 
-[ t ] [ "-1.234e+08" -123400000 "%e" sprintf = ] unit-test
+[ t ] [ "-1.234000e+08" -123400000 "%e" sprintf = ] unit-test
 
 [ t ] [ "1.234567e+08" 123456700 "%e" sprintf = ] unit-test
 
 [ t ] [ "3.625e+08" 362525200 "%.3e" sprintf = ] unit-test
 
-[ t ] [ "2.5e-03" 0.0025 "%e" sprintf = ] unit-test
+[ t ] [ "2.500000e-03" 0.0025 "%e" sprintf = ] unit-test
 
-[ t ] [ "2.5E-03" 0.0025 "%E" sprintf = ] unit-test
+[ t ] [ "2.500000E-03" 0.0025 "%E" sprintf = ] unit-test
 
 [ t ] [ "   1.0E+01" 10 "%10.1E" sprintf = ] unit-test
 
index c7a7153d6ac5b08c6367592f931ab9c9bf2903b0..0120891e1294dc34e81a03e1de3ff95a25b97720 100644 (file)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license
 
 USING: io io.encodings.ascii io.files io.streams.string combinators
-kernel sequences splitting strings math math.parser macros
-fry peg.ebnf ascii unicode.case arrays quotations vectors ;
+kernel sequences splitting strings math math.functions math.parser 
+macros fry peg.ebnf ascii unicode.case arrays quotations vectors ;
 
 IN: printf
 
@@ -27,42 +27,52 @@ IN: printf
 : >digits ( string -- digits ) 
     [ 0 ] [ string>number ] if-empty ;
 
-: max-digits ( string digits -- string ) 
+: pad-digits ( string digits -- string' )
     [ "." split1 ] dip [ CHAR: 0 pad-right ] [ head-slice ] bi "." swap 3append ;
 
-: max-width ( string length -- string ) 
+: max-digits ( n digits -- n' )
+    10 swap ^ [ * round ] keep / ;
+
+: max-width ( string length -- string' ) 
     short head ;
 
-: >exponential ( n -- base exp ) 
-    [ 0 < ] keep abs 0 
-    [ swap dup [ 10.0 >= ] keep 1.0 < or ] 
-    [ dup 10.0 >= 
-      [ 10.0 / [ 1+ ] dip swap ] 
-      [ 10.0 * [ 1- ] dip swap ] if
-    ] [ swap ] while 
-    [ number>string ] dip 
-    dup abs number>string 2 CHAR: 0 pad-left
-    [ 0 < "-" "+" ? ] dip append
-    "e" prepend 
-    rot [ [ "-" prepend ] dip ] when ; 
+: >exp ( x -- exp base )
+    [ 
+        abs 0 swap
+        [ dup [ 10.0 >= ] [ 1.0 < ] bi or ]
+        [ dup 10.0 >=
+          [ 10.0 / [ 1+ ] dip ]
+          [ 10.0 * [ 1- ] dip ] if
+        ] [ ] while 
+     ] keep 0 < [ neg ] when ;
+
+: exp>string ( exp base digits -- string )
+    [ max-digits ] keep -rot
+    [
+        [ 0 < "-" "+" ? ]
+        [ abs number>string 2 CHAR: 0 pad-left ] bi 
+        "e" -rot 3append
+    ]
+    [ number>string ] bi*
+    rot pad-digits prepend ;
 
 EBNF: parse-format-string
 
 zero      = "0"                  => [[ CHAR: 0 ]]
 char      = "'" (.)              => [[ second ]]
 
-pad-char  = (zero|char)?         => [[ CHAR: \s or 1quotation ]]
-pad-align = ("-")?               => [[ [ pad-right ] [ pad-left ] ? ]] 
-pad-width = ([0-9])*             => [[ >digits 1quotation ]]
-pad       = pad-align pad-char pad-width => [[ reverse compose-all [ first ] keep swap 0 = [ drop [ ] ] when ]]
+pad-char  = (zero|char)?         => [[ CHAR: \s or ]]
+pad-align = ("-")?               => [[ \ pad-right \ pad-left ? ]] 
+pad-width = ([0-9])*             => [[ >digits ]]
+pad       = pad-align pad-char pad-width => [[ reverse >quotation dup first 0 = [ drop [ ] ] when ]]
 
-sign      = ("+")?               => [[ [ dup CHAR: - swap index not [ "+" prepend ] when ] [ ] ? ]]
+sign      = ("+")?               => [[ [ dup CHAR: - swap index [ "+" prepend ] unless ] [ ] ? ]]
 
 width_    = "." ([0-9])*         => [[ second >digits '[ _ max-width ] ]]
 width     = (width_)?            => [[ [ ] or ]] 
 
-digits_   = "." ([0-9])*         => [[ second >digits '[ _ max-digits ] ]]
-digits    = (digits_)?           => [[ [ ] or ]]
+digits_   = "." ([0-9])*         => [[ second >digits ]]
+digits    = (digits_)?           => [[ 6 or ]]
 
 fmt-%     = "%"                  => [[ [ "%" ] ]] 
 fmt-c     = "c"                  => [[ [ 1string ] ]]
@@ -70,26 +80,24 @@ fmt-C     = "C"                  => [[ [ 1string >upper ] ]]
 fmt-s     = "s"                  => [[ [ ] ]]
 fmt-S     = "S"                  => [[ [ >upper ] ]]
 fmt-d     = "d"                  => [[ [ >fixnum number>string ] ]]
-fmt-e     = "e"                  => [[ [ >exponential ] ]]
-fmt-E     = "E"                  => [[ [ >exponential >upper ] ]]
-fmt-f     = "f"                  => [[ [ >float number>string ] ]] 
+fmt-e     = digits "e"           => [[ first '[ >exp _ exp>string ] ]]
+fmt-E     = digits "E"           => [[ first '[ >exp _ exp>string >upper ] ]]
+fmt-f     = digits "f"           => [[ first dup '[ >float _ max-digits number>string _ pad-digits ] ]] 
 fmt-x     = "x"                  => [[ [ >hex ] ]]
 fmt-X     = "X"                  => [[ [ >hex >upper ] ]]
 unknown   = (.)*                 => [[ "Unknown directive" throw ]]
 
-chars     = fmt-c | fmt-C
-strings   = pad width (fmt-s|fmt-S) => [[ reverse compose-all ]]
-decimals  = fmt-d
-exps      = digits (fmt-e|fmt-E) => [[ reverse [ swap ] join [ swap append ] append ]] 
-floats    = digits fmt-f         => [[ reverse compose-all ]]
-hex       = fmt-x | fmt-X
-numbers   = sign pad (decimals|floats|hex|exps) => [[ reverse first3 swap 3append [ fix-sign ] append ]]
+strings_  = fmt-c|fmt-C|fmt-s|fmt-S
+strings   = pad width strings_   => [[ reverse compose-all ]]
+
+numbers_  = fmt-d|fmt-e|fmt-E|fmt-f|fmt-x|fmt-X
+numbers   = sign pad numbers_    => [[ unclip-last prefix compose-all [ fix-sign ] append ]]
 
-formats   = "%" (chars|strings|numbers|fmt-%|unknown) => [[ second '[ _ dip ] ]]
+formats   = "%" (strings|numbers|fmt-%|unknown) => [[ second '[ _ dip ] ]]
 
-plain-text = (!("%").)+           => [[ >string '[ _ swap ] ]]
+plain-text = (!("%").)+          => [[ >string '[ _ swap ] ]]
 
-text      = (formats|plain-text)* => [[ reverse [ [ dup [ push ] dip ] append ] map ]]
+text      = (formats|plain-text)* => [[ reverse [ [ [ push ] keep ] append ] map ]]
 
 ;EBNF
 
diff --git a/extra/spider/authors.txt b/extra/spider/authors.txt
new file mode 100644 (file)
index 0000000..7c1b2f2
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/extra/spider/spider-docs.factor b/extra/spider/spider-docs.factor
new file mode 100644 (file)
index 0000000..5f820ca
--- /dev/null
@@ -0,0 +1,56 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: help.markup help.syntax io.streams.string urls
+multiline spider.private quotations ;
+IN: spider
+
+HELP: <spider>
+{ $values
+     { "base" "a string or url" }
+     { "spider" spider } }
+{ $description "Creates a new web spider with a given base url." } ;
+
+HELP: run-spider
+{ $values
+     { "spider" spider }
+     { "spider" spider } }
+{ $description "Runs a spider until completion. See the " { $subsection "spider-tutorial" } " for a complete description of the tuple slots that affect how thet spider works." } ;
+
+HELP: slurp-heap-when
+{ $values
+     { "heap" "a heap" } { "quot1" quotation } { "quot2" quotation } }
+{ $description "Removes values from a heap that match the predicate quotation " { $snippet "quot1" } " and processes them with " { $snippet "quot2" } " until the predicate quotation no longer matches." } ;
+
+ARTICLE: "spider-tutorial" "Spider tutorial"
+"To create a new spider, call the " { $link <spider> } " word with a link to the site you wish to spider."
+{ $code <" "http://concatentative.org" <spider> "> }
+"The max-depth is initialized to 0, which retrieves just the initial page. Let's initialize it to something more fun:"
+{ $code <" 1 >>max-depth "> }
+"Now the spider will retrieve the first page and all the pages it links to in the same domain." $nl
+"But suppose the front page contains thousands of links. To avoid grabbing them all, we can set " { $slot "max-count" } " to a reasonable limit."
+{ $code <" 10 >>max-count "> }
+"A timeout might keep the spider from hitting the server too hard:"
+{ $code <" USE: calendar 1.5 seconds >>sleep "> }
+"Since we happen to know that not all pages of a wiki are suitable for spidering, we will spider only the wiki view pages, not the edit or revisions pages. To do this, we add a filter through which new links are tested; links that pass the filter are added to the todo queue, while links that do not are discarded. You can add several filters to the filter array, but we'll just add a single one for now."
+{ $code <" { [ path>> "/wiki/view" head? ] } >>filters "> }
+"Finally, to start the spider, call the " { $link run-spider } " word."
+{ $code "run-spider" }
+"The full code from the tutorial."
+{ $code <" USING: spider calendar sequences accessors ;
+: spider-concatenative ( -- spider )
+    "http://concatenative.org" <spider>
+    1 >>max-depth
+    10 >>max-count
+    1.5 seconds >>sleep 
+    { [ path>> "/wiki/view" head? ] } >>filters
+    run-spider ;"> } ;
+
+ARTICLE: "spider" "Spider"
+"The " { $vocab-link "spider" } " vocabulary implements a simple web spider for retrieving sets of webpages."
+{ $subsection "spider-tutorial" }
+"Creating a new spider:"
+{ $subsection <spider> }
+"Running the spider:"
+{ $subsection run-spider } ;
+
+ABOUT: "spider"
diff --git a/extra/spider/spider.factor b/extra/spider/spider.factor
new file mode 100644 (file)
index 0000000..64ee081
--- /dev/null
@@ -0,0 +1,104 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors fry html.parser html.parser.analyzer
+http.client kernel tools.time sets assocs sequences
+concurrency.combinators io threads namespaces math multiline
+heaps math.parser inspector urls assoc-heaps logging
+combinators.short-circuit continuations calendar prettyprint ;
+IN: spider
+
+TUPLE: spider base count max-count sleep max-depth initial-links
+filters spidered todo nonmatching quiet ;
+! secure? agent page-timeout data-timeout overall-timeout
+
+TUPLE: spider-result url depth headers fetch-time parsed-html
+links processing-time timestamp ;
+
+: <spider> ( base -- spider )
+    >url
+    spider new
+        over >>base
+        swap 0 <unique-min-heap> [ heap-push ] keep >>todo
+        <unique-min-heap> >>nonmatching
+        0 >>max-depth
+        0 >>count
+        1/0. >>max-count
+        H{ } clone >>spidered ;
+
+<PRIVATE
+
+: relative-url? ( url -- ? ) protocol>> not ;
+
+: apply-filters ( links spider -- links' )
+    filters>> [ '[ _ 1&& ] filter ] when* ;
+
+: push-links ( links level assoc-heap -- )
+    '[ _ _ heap-push ] each ;
+
+: add-todo ( links level spider -- )
+    todo>> push-links ;
+
+: add-nonmatching ( links level spider -- )
+    nonmatching>> push-links ;
+
+: filter-base ( spider spider-result -- base-links nonmatching-links )
+    [ base>> host>> ] [ links>> prune ] bi*
+    [ host>> = ] with partition ;
+
+: add-spidered ( spider spider-result -- )
+    [ [ 1+ ] change-count ] dip
+    2dup [ spidered>> ] [ dup url>> ] bi* rot set-at
+    [ filter-base ] 2keep
+    depth>> 1+ swap
+    [ add-nonmatching ]
+    [ tuck [ apply-filters ] 2dip add-todo ] 2bi ;
+
+: normalize-hrefs ( links -- links' )
+    [ >url ] map
+    spider get base>> swap [ derive-url ] with map ;
+
+: print-spidering ( url depth -- )
+    "depth: " write number>string write
+    ", spidering: " write . yield ;
+
+: (spider-page) ( url depth -- spider-result )
+    f pick spider get spidered>> set-at
+    over '[ _ http-get ] benchmark swap
+    [ parse-html dup find-hrefs normalize-hrefs ] benchmark
+    now spider-result boa ;
+
+: spider-page ( url depth -- )
+    spider get quiet>> [ 2dup print-spidering ] unless
+    (spider-page)
+    spider get [ quiet>> [ dup describe ] unless ]
+    [ swap add-spidered ] bi ;
+
+\ spider-page ERROR add-error-logging
+
+: spider-sleep ( -- )
+    spider get sleep>> [ sleep ] when* ;
+
+: queue-initial-links ( spider -- spider )
+    [ initial-links>> normalize-hrefs 0 ] keep
+    [ add-todo ] keep ;
+
+: slurp-heap-when ( heap quot1 quot2: ( value key -- ) -- )
+    pick heap-empty? [ 3drop ] [
+        [ [ heap-pop dup ] 2dip slip [ t ] compose [ 2drop f ] if ]
+        [ roll [ slurp-heap-when ] [ 3drop ] if ] 3bi
+    ] if ; inline recursive
+
+PRIVATE>
+
+: run-spider ( spider -- spider )
+    "spider" [
+        dup spider [
+            queue-initial-links
+            [ todo>> ] [ max-depth>> ] bi
+            '[
+                _ <= spider get
+                [ count>> ] [ max-count>> ] bi < and
+            ] [ spider-page spider-sleep ] slurp-heap-when
+            spider get
+        ] with-variable
+    ] with-logging ;
diff --git a/extra/suffix-arrays/authors.txt b/extra/suffix-arrays/authors.txt
new file mode 100755 (executable)
index 0000000..e4a36df
--- /dev/null
@@ -0,0 +1 @@
+Marc Fauconneau
\ No newline at end of file
diff --git a/extra/suffix-arrays/suffix-arrays-docs.factor b/extra/suffix-arrays/suffix-arrays-docs.factor
new file mode 100755 (executable)
index 0000000..87df272
--- /dev/null
@@ -0,0 +1,45 @@
+! Copyright (C) 2008 Marc Fauconneau.
+! See http://factorcode.org/license.txt for BSD license.
+USING: arrays help.markup help.syntax io.streams.string
+sequences strings math suffix-arrays.private ;
+IN: suffix-arrays
+
+HELP: >suffix-array
+{ $values
+     { "seq" sequence }
+     { "array" array } }
+{ $description "Creates a suffix array from the input sequence.  Suffix arrays are arrays of slices." } ;
+
+HELP: SA{
+{ $description "Creates a new literal suffix array at parse-time." } ;
+
+HELP: suffixes
+{ $values
+     { "string" string }
+     { "suffixes-seq" "a sequence of slices" } }
+{ $description "Returns a sequence of tail slices of the input string." } ;
+
+HELP: from-to
+{ $values
+     { "index" integer } { "begin" sequence } { "suffix-array" "a suffix-array" }
+     { "from/f" "an integer or f" } { "to/f" "an integer or f" } }
+{ $description "Finds the bounds of the suffix array that match the input sequence. A return value of " { $link f } " means that the endpoint is included." }
+{ $notes "Slices are [m,n) and we want (m,n) so we increment." } ;
+
+HELP: query
+{ $values
+     { "begin" sequence } { "suffix-array" "a suffix-array" }
+     { "matches" array } }
+{ $description "Returns a sequence of sequences from the suffix-array that contain the input sequence. An empty array is returned when there are no matches." } ;
+
+ARTICLE: "suffix-arrays" "Suffix arrays"
+"The " { $vocab-link "suffix-arrays" } " vocabulary implements the suffix array data structure for efficient lookup of subsequences. This suffix array implementation is a sorted array of suffixes. Querying it for matches uses binary search for efficiency." $nl
+
+"Creating new suffix arrays:"
+{ $subsection >suffix-array }
+"Literal suffix arrays:"
+{ $subsection POSTPONE: SA{ }
+"Querying suffix arrays:"
+{ $subsection query } ;
+
+ABOUT: "suffix-arrays"
diff --git a/extra/suffix-arrays/suffix-arrays-tests.factor b/extra/suffix-arrays/suffix-arrays-tests.factor
new file mode 100755 (executable)
index 0000000..5149804
--- /dev/null
@@ -0,0 +1,38 @@
+! Copyright (C) 2008 Marc Fauconneau.
+! See http://factorcode.org/license.txt for BSD license.
+USING: tools.test suffix-arrays kernel namespaces sequences ;
+IN: suffix-arrays.tests
+
+! built from [ all-words 10 head [ name>> ] map ]
+[ ] [ 
+     {
+        "run-tests"
+        "must-fail-with"
+        "test-all"
+        "short-effect"
+        "failure"
+        "test"
+        "<failure>"
+        "this-test"
+        "(unit-test)"
+        "unit-test"
+    } >suffix-array "suffix-array" set
+] unit-test
+
+[ t ]
+[ "suffix-array" get "" swap query empty? not ] unit-test
+
+[ { } ]
+[ SA{ } "something" swap query ] unit-test
+
+[ V{ "unit-test" "(unit-test)" } ]
+[ "suffix-array" get "unit-test" swap query ] unit-test
+
+[ t ]
+[ "suffix-array" get "something else" swap query empty? ] unit-test
+
+[ V{ "rofl" } ] [ SA{ "rofl" } "r" swap query ] unit-test
+[ V{ "rofl" } ] [ SA{ "rofl" } "o" swap query ] unit-test
+[ V{ "rofl" } ] [ SA{ "rofl" } "f" swap query ] unit-test
+[ V{ "rofl" } ] [ SA{ "rofl" } "l" swap query ] unit-test
+[ V{ } ] [ SA{ "rofl" } "t" swap query ] unit-test
diff --git a/extra/suffix-arrays/suffix-arrays.factor b/extra/suffix-arrays/suffix-arrays.factor
new file mode 100755 (executable)
index 0000000..b181ba9
--- /dev/null
@@ -0,0 +1,39 @@
+! Copyright (C) 2008 Marc Fauconneau.
+! See http://factorcode.org/license.txt for BSD license.
+USING: parser kernel arrays math accessors sequences
+math.vectors math.order sorting binary-search sets assocs fry ;
+IN: suffix-arrays
+
+<PRIVATE
+: suffixes ( string -- suffixes-seq )
+    dup length [ tail-slice ] with map ;
+
+: prefix<=> ( begin seq -- <=> )
+    [ <=> ] [ swap head? ] 2bi [ drop +eq+ ] when ;
+: find-index ( begin suffix-array -- index/f )
+    [ prefix<=> ] with search drop ;
+
+: from-to ( index begin suffix-array -- from/f to/f )
+    swap '[ _ head? not ]
+    [ find-last-from drop dup [ 1+ ] when ]
+    [ find-from drop ] 3bi ;
+
+: <funky-slice> ( from/f to/f seq -- slice )
+    [
+        tuck
+        [ drop 0 or ] [ length or ] 2bi*
+        [ min ] keep
+    ] keep <slice> ; inline
+
+PRIVATE>
+
+: >suffix-array ( seq -- array )
+    [ suffixes ] map concat natural-sort ;
+
+: SA{ \ } [ >suffix-array ] parse-literal ; parsing
+
+: query ( begin suffix-array -- matches )
+    2dup find-index dup
+    [ -rot [ from-to ] keep <funky-slice> [ seq>> ] map prune ]
+    [ 3drop { } ] if ;
diff --git a/extra/suffix-arrays/summary.txt b/extra/suffix-arrays/summary.txt
new file mode 100755 (executable)
index 0000000..71eda47
--- /dev/null
@@ -0,0 +1 @@
+Suffix arrays
diff --git a/extra/suffix-arrays/tags.txt b/extra/suffix-arrays/tags.txt
new file mode 100755 (executable)
index 0000000..42d711b
--- /dev/null
@@ -0,0 +1 @@
+collections
diff --git a/extra/suffix-arrays/words/words.factor b/extra/suffix-arrays/words/words.factor
new file mode 100755 (executable)
index 0000000..74e2fc2
--- /dev/null
@@ -0,0 +1,19 @@
+! Copyright (C) 2008 Marc Fauconneau.\r
+! See http://factorcode.org/license.txt for BSD license.\r
+USING: kernel arrays math accessors sequences math.vectors\r
+math.order sorting binary-search sets assocs fry suffix-arrays ;\r
+IN: suffix-arrays.words\r
+\r
+! to search on word names\r
+\r
+: new-word-sa ( words -- sa )\r
+    [ name>> ] map >suffix-array ;\r
+\r
+: name>word-map ( words -- map )\r
+    dup [ name>> V{ } clone ] H{ } map>assoc\r
+    [ '[ dup name>> _ at push ] each ] keep ;\r
+\r
+: query-word-sa ( map begin sa -- matches ) query '[ _ at ] map concat ;\r
+\r
+! usage example :\r
+! clear all-words 100 head dup name>word-map "test" rot new-word-sa query .\r
diff --git a/extra/webapps/irc-log/authors.txt b/extra/webapps/irc-log/authors.txt
new file mode 100644 (file)
index 0000000..b4bd0e7
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
\ No newline at end of file
diff --git a/extra/webapps/irc-log/irc-log.factor b/extra/webapps/irc-log/irc-log.factor
new file mode 100644 (file)
index 0000000..c193550
--- /dev/null
@@ -0,0 +1,22 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: calendar kernel http.server.dispatchers prettyprint
+sequences printf furnace.actions html.forms accessors
+furnace.redirection ;
+IN: webapps.irc-log
+
+TUPLE: irclog-app < dispatcher ;
+
+: irc-link ( -- string )   
+    gmt -7 hours convert-timezone >date<
+    [ unparse 2 tail ] 2dip
+    "http://bespin.org/~nef/logs/concatenative/%02s.%02d.%02d"
+    sprintf ;
+    
+: <display-irclog-action> ( -- action )
+    <action>
+        [ irc-link <redirect> ] >>display ;
+
+: <irclog-app> ( -- dispatcher )
+    irclog-app new-dispatcher
+        <display-irclog-action> "" add-responder ;
index 00d843573cc0eba8a7498a4641dbbf98621ac131..6c097d7faaeec2314d08b090cc65131d41c280f3 100755 (executable)
@@ -195,5 +195,5 @@ posting "POSTINGS"
     <boilerplate>
         { planet "planet-common" } >>template ;
 
-: start-update-task ( db params -- )
-    '[ _ [ update-cached-postings ] with-db ] 10 minutes every drop ;
+: start-update-task ( db -- )
+    '[ _ [ update-cached-postings ] with-db ] 10 minutes every drop ;
index 5553fda740cbd8174d8736bd00ed1cb6b490c265..aa99493fa60fb60034054937e50092a63f1af5b7 100644 (file)
@@ -26,7 +26,7 @@ webapps.user-admin
 webapps.help ;
 IN: websites.concatenative
 
-: test-db ( -- params db ) "resource:test.db" sqlite-db ;
+: test-db ( -- params db ) "resource:test.db" <sqlite-db> ;
 
 : init-factor-db ( -- )
     test-db [
diff --git a/unfinished/sql/sql-tests.factor b/unfinished/sql/sql-tests.factor
new file mode 100644 (file)
index 0000000..0b57c2d
--- /dev/null
@@ -0,0 +1,42 @@
+USING: kernel namespaces db.sql sequences math ;
+IN: db.sql.tests
+
+! TUPLE: person name age ;
+: insert-1
+    { insert
+        {
+            { table "person" }
+            { columns "name" "age" }
+            { values "erg" 26 }
+        }
+    } ;
+
+: update-1
+    { update "person"
+       { set { "name" "erg" }
+             { "age" 6 } }
+       { where { "age" 6 } }
+    } ;
+
+: select-1
+    { select
+        { columns
+                "branchno"
+                { count "staffno" as "mycount" }
+                { sum "salary" as "mysum" } }
+        { from "staff" "lol" }
+        { where
+                { "salary" > all
+                    { select
+                        { columns "salary" }
+                        { from "staff" }
+                        { where { "branchno" = "b003" } }
+                    }
+                }
+                { "branchno" > 3 } }
+        { group-by "branchno" "lol2" }
+        { having { count "staffno" > 1 } }
+        { order-by "branchno" }
+        { offset 40 }
+        { limit 20 }
+    } ;
diff --git a/unfinished/sql/sql.factor b/unfinished/sql/sql.factor
new file mode 100755 (executable)
index 0000000..ba0673a
--- /dev/null
@@ -0,0 +1,172 @@
+USING: kernel parser quotations classes.tuple words math.order
+nmake namespaces sequences arrays combinators
+prettyprint strings math.parser math symbols db ;
+IN: db.sql
+
+SYMBOLS: insert update delete select distinct columns from as
+where group-by having order-by limit offset is-null desc all
+any count avg table values ;
+
+: input-spec, ( obj -- ) 1, ;
+: output-spec, ( obj -- ) 2, ;
+: input, ( obj -- ) 3, ;
+: output, ( obj -- ) 4, ;
+
+DEFER: sql%
+
+: (sql-interleave) ( seq sep -- )
+    [ sql% ] curry [ sql% ] interleave ;
+
+: sql-interleave ( seq str sep -- )
+    swap sql% (sql-interleave) ;
+
+: sql-function, ( seq function -- )
+    sql% "(" sql% unclip sql% ")" sql% [ sql% ] each ;
+
+: sql-where, ( seq -- )
+    [
+        [ second 0, ]
+        [ first 0, ]
+        [ third 1, \ ? 0, ] tri
+    ] each ;
+
+HOOK: sql-create db ( object -- )
+M: db sql-create ( object -- )
+    drop
+    "create table" sql% ;
+
+HOOK: sql-drop db ( object -- )
+M: db sql-drop ( object -- )
+    drop
+    "drop table" sql% ;
+
+HOOK: sql-insert db ( object -- )
+M: db sql-insert ( object -- )
+    drop
+    "insert into" sql% ;
+
+HOOK: sql-update db ( object -- )
+M: db sql-update ( object -- )
+    drop
+    "update" sql% ;
+
+HOOK: sql-delete db ( object -- )
+M: db sql-delete ( object -- )
+    drop
+    "delete" sql% ;
+
+HOOK: sql-select db ( object -- )
+M: db sql-select ( object -- )
+    "select" sql% "," (sql-interleave) ;
+
+HOOK: sql-columns db ( object -- )
+M: db sql-columns ( object -- )
+    "," (sql-interleave) ;
+
+HOOK: sql-from db ( object -- )
+M: db sql-from ( object -- )
+    "from" "," sql-interleave ;
+
+HOOK: sql-where db ( object -- )
+M: db sql-where ( object -- )
+    "where" 0, sql-where, ;
+
+HOOK: sql-group-by db ( object -- )
+M: db sql-group-by ( object -- )
+    "group by" "," sql-interleave ;
+
+HOOK: sql-having db ( object -- )
+M: db sql-having ( object -- )
+    "having" "," sql-interleave ;
+
+HOOK: sql-order-by db ( object -- )
+M: db sql-order-by ( object -- )
+    "order by" "," sql-interleave ;
+
+HOOK: sql-offset db ( object -- )
+M: db sql-offset ( object -- )
+    "offset" sql% sql% ;
+
+HOOK: sql-limit db ( object -- )
+M: db sql-limit ( object -- )
+    "limit" sql% sql% ;
+
+! GENERIC: sql-subselect db ( object -- )
+! M: db sql-subselectselect ( object -- )
+    ! "(select" sql% sql% ")" sql% ;
+
+HOOK: sql-table db ( object -- )
+M: db sql-table ( object -- )
+    sql% ;
+
+HOOK: sql-set db ( object -- )
+M: db sql-set ( object -- )
+    "set" "," sql-interleave ;
+
+HOOK: sql-values db ( object -- )
+M: db sql-values ( object -- )
+    "values(" sql% "," (sql-interleave) ")" sql% ;
+
+HOOK: sql-count db ( object -- )
+M: db sql-count ( object -- )
+    "count" sql-function, ;
+
+HOOK: sql-sum db ( object -- )
+M: db sql-sum ( object -- )
+    "sum" sql-function, ;
+
+HOOK: sql-avg db ( object -- )
+M: db sql-avg ( object -- )
+    "avg" sql-function, ;
+
+HOOK: sql-min db ( object -- )
+M: db sql-min ( object -- )
+    "min" sql-function, ;
+
+HOOK: sql-max db ( object -- )
+M: db sql-max ( object -- )
+    "max" sql-function, ;
+
+: sql-array% ( array -- )
+    unclip
+    {
+        { \ create [ sql-create ] }
+        { \ drop [ sql-drop ] }
+        { \ insert [ sql-insert ] }
+        { \ update [ sql-update ] }
+        { \ delete [ sql-delete ] }
+        { \ select [ sql-select ] }
+        { \ columns [ sql-columns ] }
+        { \ from [ sql-from ] }
+        { \ where [ sql-where ] }
+        { \ group-by [ sql-group-by ] }
+        { \ having [ sql-having ] }
+        { \ order-by [ sql-order-by ] }
+        { \ offset [ sql-offset ] }
+        { \ limit [ sql-limit ] }
+        { \ table [ sql-table ] }
+        { \ set [ sql-set ] }
+        { \ values [ sql-values ] }
+        { \ count [ sql-count ] }
+        { \ sum [ sql-sum ] }
+        { \ avg [ sql-avg ] }
+        { \ min [ sql-min ] }
+        { \ max [ sql-max ] }
+        [ sql% [ sql% ] each ]
+    } case ;
+
+ERROR: no-sql-match ;
+: sql% ( obj -- )
+    {
+        { [ dup string? ] [ 0, ] }
+        { [ dup array? ] [ sql-array% ] }
+        { [ dup number? ] [ number>string sql% ] }
+        { [ dup symbol? ] [ unparse sql% ] }
+        { [ dup word? ] [ unparse sql% ] }
+        { [ dup quotation? ] [ call ] }
+        [ no-sql-match ]
+    } cond ;
+
+: parse-sql ( obj -- sql in-spec out-spec in out )
+    [ [ sql% ] each ] { { } { } { } } nmake
+    [ " " join ] 2dip ;
diff --git a/unmaintained/assoc-heaps/assoc-heaps-tests.factor b/unmaintained/assoc-heaps/assoc-heaps-tests.factor
deleted file mode 100644 (file)
index 24a7730..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-USING: assocs assoc-heaps heaps heaps.private kernel tools.test ;
-IN: temporary
-
-[
-T{
-    assoc-heap
-    f
-    H{ { 2 1 } }
-    T{ min-heap T{ heap f V{ { 1 2 } } } }
-}
-] [ H{ } clone <assoc-min-heap> 1 2 pick heap-push ] unit-test
-
-[
-T{
-    assoc-heap
-    f
-    H{ { 1 0 } { 2 1 } }
-    T{ min-heap T{ heap f V{ { 0 1 } { 1 2 } } } }
-}
-] [  H{ } clone <assoc-min-heap> 1 2 pick heap-push 0 1 pick heap-push ] unit-test
-
-[ T{ assoc-heap f H{ } T{ min-heap T{ heap f V{ } } } } ]
-[
-    H{ } clone <assoc-min-heap>
-    1 2 pick heap-push 0 1 pick heap-push
-    dup heap-pop 2drop dup heap-pop 2drop
-] unit-test
-
-
-[ 0 1 ] [
-T{
-    assoc-heap
-    f
-    H{ { 1 0 } { 2 1 } }
-    T{ min-heap T{ heap f V{ { 0 1 } { 1 2 } } } }
-} heap-pop
-] unit-test
-
-[ 1 2 ] [
-T{
-    assoc-heap
-    f
-    H{ { 1 0 } { 2 1 } }
-    T{ max-heap T{ heap f V{ { 1 2 } { 0 1 } } } }
-} heap-pop
-] unit-test
-
-[
-T{
-    assoc-heap
-    f
-    H{ { 1 2 } { 3 4 } }
-    T{ min-heap T{ heap f V{ { 2 1 } { 4 3 } } } }
-}
-] [ H{ { 1 2 } { 3 4 } } H{ } clone <assoc-min-heap> [ heap-push-all ] keep ] unit-test
diff --git a/unmaintained/assoc-heaps/assoc-heaps.factor b/unmaintained/assoc-heaps/assoc-heaps.factor
deleted file mode 100755 (executable)
index 55a5aa7..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-USING: assocs heaps kernel sequences ;
-IN: assoc-heaps
-
-TUPLE: assoc-heap assoc heap ;
-
-INSTANCE: assoc-heap assoc
-INSTANCE: assoc-heap priority-queue
-
-C: <assoc-heap> assoc-heap
-
-: <assoc-min-heap> ( assoc -- obj ) <min-heap> <assoc-heap> ;
-: <assoc-max-heap> ( assoc -- obj ) <max-heap> <assoc-heap> ;
-
-M: assoc-heap at* ( key assoc-heap -- value ? )
-    assoc-heap-assoc at* ;
-
-M: assoc-heap assoc-size ( assoc-heap -- n )
-    assoc-heap-assoc assoc-size ;
-
-TUPLE: assoc-heap-key-exists ;
-
-: check-key-exists ( key assoc-heap -- )
-    assoc-heap-assoc key?
-    [ \ assoc-heap-key-exists construct-empty throw ] when ;
-
-M: assoc-heap set-at ( value key assoc-heap -- )
-    [ check-key-exists ] 2keep
-    [ assoc-heap-assoc set-at ] 3keep
-    assoc-heap-heap swapd heap-push ;
-
-M: assoc-heap heap-empty? ( assoc-heap -- ? )
-    assoc-heap-assoc assoc-empty? ;
-
-M: assoc-heap heap-length ( assoc-heap -- n )
-    assoc-heap-assoc assoc-size ;
-
-M: assoc-heap heap-peek ( assoc-heap -- value key )
-    assoc-heap-heap heap-peek ;
-
-M: assoc-heap heap-push ( value key assoc-heap -- )
-    set-at ;
-
-M: assoc-heap heap-pop ( assoc-heap -- value key )
-    dup assoc-heap-heap heap-pop swap
-    rot dupd assoc-heap-assoc delete-at ;
diff --git a/unmaintained/assoc-heaps/authors.txt b/unmaintained/assoc-heaps/authors.txt
deleted file mode 100755 (executable)
index 7c1b2f2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Doug Coleman
diff --git a/unmaintained/assoc-heaps/summary.txt b/unmaintained/assoc-heaps/summary.txt
deleted file mode 100755 (executable)
index 07ae2e3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Priority search queues
diff --git a/unmaintained/webapps/help/authors.txt b/unmaintained/webapps/help/authors.txt
deleted file mode 100755 (executable)
index 1901f27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Slava Pestov
diff --git a/unmaintained/webapps/help/help.factor b/unmaintained/webapps/help/help.factor
deleted file mode 100644 (file)
index 28d7360..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-! Copyright (C) 2005, 2007 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: kernel furnace furnace.validator http.server.responders
-       help help.topics html splitting sequences words strings 
-       quotations macros vocabs tools.browser combinators
-       arrays io.files ;
-IN: webapps.help 
-
-! : string>topic ( string -- topic )
-    ! " " split dup length 1 = [ first ] when ;
-
-: show-help ( topic -- )
-    serving-html
-    dup article-title [
-        [ help ] with-html-stream
-    ] simple-html-document ;
-
-\ show-help {
-    { "topic" }
-} define-action
-\ show-help { { "topic" "handbook" } } default-values
-
-M: link browser-link-href
-    link-name
-    dup word? over f eq? or [
-        browser-link-href
-    ] [
-        dup array? [ " " join ] when
-        [ show-help ] curry quot-link
-    ] if ;
-
-: show-word ( word vocab -- )
-    lookup show-help ;
-
-\ show-word {
-    { "word" }
-    { "vocab" }
-} define-action
-\ show-word { { "word" "call" } { "vocab" "kernel" } } default-values
-
-M: f browser-link-href
-    drop \ f browser-link-href ;
-
-M: word browser-link-href
-    dup word-name swap word-vocabulary
-    [ show-word ] 2curry quot-link ;
-
-: show-vocab ( vocab -- )
-    f >vocab-link show-help ;
-
-\ show-vocab {
-    { "vocab" }
-} define-action
-
-\ show-vocab { { "vocab" "kernel" } } default-values
-
-M: vocab-spec browser-link-href
-    vocab-name [ show-vocab ] curry quot-link ;
-
-: show-vocabs-tagged ( tag -- )
-    <vocab-tag> show-help ;
-
-\ show-vocabs-tagged {
-    { "tag" }
-} define-action
-
-M: vocab-tag browser-link-href
-    vocab-tag-name [ show-vocabs-tagged ] curry quot-link ;
-
-: show-vocabs-by ( author -- )
-    <vocab-author> show-help ;
-
-\ show-vocabs-by {
-    { "author" }
-} define-action
-
-M: vocab-author browser-link-href
-    vocab-author-name [ show-vocabs-by ] curry quot-link ;
-
-"help" "show-help" "extra/webapps/help" web-app
-
-! Hard-coding for factorcode.org
-PREDICATE: pathname resource-pathname
-    pathname-string "resource:" head? ;
-
-M: resource-pathname browser-link-href
-    pathname-string
-    "resource:" ?head drop
-    "/responder/source/" swap append ;
diff --git a/unmaintained/webapps/pastebin/annotate-paste.furnace b/unmaintained/webapps/pastebin/annotate-paste.furnace
deleted file mode 100755 (executable)
index 14a424f..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<% USING: io math math.parser namespaces furnace ; %>
-
-<h1>Annotate</h1>
-
-<form method="POST" action="/responder/pastebin/annotate-paste">
-
-<table>
-
-<tr>
-<th align="right">Summary:</th>
-<td><input type="TEXT" name="summary" value="<% "summary" render %>" /></td>
-<td align="left" class="error"><% "summary" "*Required" render-error %></td>
-</tr>
-
-<tr>
-<th align="right">Your name:</th>
-<td><input type="TEXT" name="author" value="<% "author" render  %>" /></td>
-<td class="error"><% "author" "*Required" render-error %></td>
-</tr>
-
-<tr>
-<th align="right">File type:</th>
-<td><% "modes" render-template %></td>
-</tr>
-
-<!--
-<tr>
-<th align="right">Channel:</th>
-<td><input type="TEXT" name="channel" value="#concatenative" /></td>
-</tr>
--->
-
-<tr>
-<td></td>
-<td colspan="2" class="error" align="left"><% "contents" "*Required" render-error %></td>
-</tr>
-
-<tr>
-<th align="right" valign="top">Content:</th>
-<td colspan="2"><textarea rows="24" cols="60" name="contents"><% "contents" render %></textarea></td>
-</tr>
-</table>
-
-<input type="hidden" name="n" value="<% "n" get number>string write %>" />
-<input type="hidden" name="furnace-form-submitted" value="annotate-paste"/>
-<input type="SUBMIT" value="Annotate" />
-</form>
diff --git a/unmaintained/webapps/pastebin/annotation.furnace b/unmaintained/webapps/pastebin/annotation.furnace
deleted file mode 100755 (executable)
index e59db32..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<% USING: namespaces io furnace calendar ; %>
-
-<h2>Annotation: <% "summary" get write %></h2>
-
-<table>
-<tr><th align="right">Annotation by:</th><td><% "author" get write %></td></tr>
-<tr><th align="right">File type:</th><td><% "mode" get write %></td></tr>
-<tr><th align="right">Created:</th><td><% "date" get timestamp>string write %></td></tr>
-</table>
-
-<% "syntax" render-template %>
diff --git a/unmaintained/webapps/pastebin/authors.txt b/unmaintained/webapps/pastebin/authors.txt
deleted file mode 100755 (executable)
index 1901f27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Slava Pestov
diff --git a/unmaintained/webapps/pastebin/footer.furnace b/unmaintained/webapps/pastebin/footer.furnace
deleted file mode 100644 (file)
index 15b9011..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-</body>
-
-</html>
diff --git a/unmaintained/webapps/pastebin/header.furnace b/unmaintained/webapps/pastebin/header.furnace
deleted file mode 100644 (file)
index 2c8e79a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<% USING: namespaces io furnace sequences xmode.code2html webapps.pastebin ; %>
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-       <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-
-       <title><% "title" get write %></title>
-       <link rel="stylesheet" href="style.css" type="text/css" media="screen" title="no title" charset="utf-8" />
-       <% default-stylesheet %>
-    <link rel="alternate" type="application/atom+xml" title="Pastebin - Atom" href="feed.xml" />
-</head>
-
-<body id="index">
-
-    <div class="navbar">
-        <% [ paste-list ] "Paste list" render-link %> |
-        <% [ new-paste ] "New paste" render-link %> |
-        <% [ feed.xml ] "Syndicate" render-link %>
-    </div>
-    <h1 class="pastebin-title"><% "title" get write %></h1>
diff --git a/unmaintained/webapps/pastebin/modes.furnace b/unmaintained/webapps/pastebin/modes.furnace
deleted file mode 100644 (file)
index 18bbec1..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<% USING: furnace xmode.catalog sequences kernel html.elements assocs io sorting continuations ; %>
-
-<select name="mode">
-    <% modes keys natural-sort [
-        <option dup "mode" session-var = [ "true" =selected ] when option> write </option>
-    ] each %>
-</select>
diff --git a/unmaintained/webapps/pastebin/new-paste.furnace b/unmaintained/webapps/pastebin/new-paste.furnace
deleted file mode 100755 (executable)
index b21e197..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<% USING: continuations furnace namespaces ; %>
-
-<%
-    "New paste" "title" set
-    "header" render-template
-%>
-
-<form method="POST" action="/responder/pastebin/submit-paste">
-
-<table>
-
-<tr>
-<th align="right">Summary:</th>
-<td><input type="TEXT" name="summary" value="<% "summary" render %>" /></td>
-<td align="left" class="error"><% "summary" "*Required" render-error %></td>
-</tr>
-
-<tr>
-<th align="right">Your name:</th>
-<td><input type="TEXT" name="author" value="<% "author" render  %>" /></td>
-<td class="error"><% "author" "*Required" render-error %></td>
-</tr>
-
-<tr>
-<th align="right">File type:</th>
-<td><% "modes" render-template %></td>
-</tr>
-
-<!--
-<tr>
-<th align="right">Channel:</th>
-<td><input type="TEXT" name="channel" value="#concatenative" /></td>
-</tr>
--->
-
-<tr>
-<td></td>
-<td colspan="2" class="error" align="left"><% "contents" "*Required" render-error %></td>
-</tr>
-
-<tr>
-<th align="right" valign="top">Content:</th>
-<td colspan="2"><textarea rows="24" cols="60" name="contents"><% "contents" render %></textarea></td>
-</tr>
-</table>
-
-<input type="hidden" name="furnace-form-submitted" value="new-paste"/>
-<input type="SUBMIT" value="Submit paste" />
-</form>
-
-<% "footer" render-template %>
diff --git a/unmaintained/webapps/pastebin/paste-list.furnace b/unmaintained/webapps/pastebin/paste-list.furnace
deleted file mode 100644 (file)
index 51813ec..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<% USING: namespaces furnace sequences ; %>
-
-<%
-    "Pastebin" "title" set
-    "header" render-template
-%>
-
-<table width="100%" cellspacing="10">
-    <tr>
-        <td valign="top">
-            <table width="100%">
-                <tr align="left" class="pastebin-headings">
-                    <th width="50%">Summary:</th>
-                    <th width="100">Paste by:</th>
-                    <th width="200">Date:</th>
-                </tr>
-                <% "pastes" get <reversed> [ "paste-summary" render-component ] each %>
-            </table>
-        </td>
-        <td valign="top" width="25%">
-            <div class="infobox">
-                <p>This pastebin is written in <a href="http://factorcode.org/">Factor</a>. It is inspired by <a href="http://paste.lisp.org">lisppaste</a>.
-                </p>
-                <p>It can be used for collaborative development over IRC. You can post code for review, and annotate other people's code. Syntax highlighting for over a hundred file types is supported.
-                </p>
-                <p>
-                <% "webapps.pastebin" browse-webapp-source %></p>
-            </div>
-        </td>
-    </tr>
-</table>
-
-<% "footer" render-template %>
diff --git a/unmaintained/webapps/pastebin/paste-summary.furnace b/unmaintained/webapps/pastebin/paste-summary.furnace
deleted file mode 100644 (file)
index dc25fe1..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<% USING: continuations namespaces io kernel math math.parser
-furnace webapps.pastebin calendar sequences ; %>
-
-<tr>
-    <td>
-        <a href="<% model get paste-link write %>">
-        <% "summary" get write %>
-        </a>
-    </td>
-    <td><% "author" get write %></td>
-    <td><% "date" get timestamp>string write %></td>
-</tr>
diff --git a/unmaintained/webapps/pastebin/pastebin.factor b/unmaintained/webapps/pastebin/pastebin.factor
deleted file mode 100755 (executable)
index 36a7279..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-USING: calendar furnace furnace.validator io.files kernel
-namespaces sequences http.server.responders html math.parser rss
-xml.writer xmode.code2html math calendar.format ;
-IN: webapps.pastebin
-
-TUPLE: pastebin pastes ;
-
-: <pastebin> ( -- pastebin )
-    V{ } clone pastebin construct-boa ;
-
-<pastebin> pastebin set-global
-
-TUPLE: paste
-summary author channel mode contents date
-annotations n ;
-
-: <paste> ( summary author channel mode contents -- paste )
-    f V{ } clone f paste construct-boa ;
-
-TUPLE: annotation summary author mode contents ;
-
-C: <annotation> annotation
-
-: get-paste ( n -- paste )
-    pastebin get pastebin-pastes nth ;
-
-: show-paste ( n -- )
-    serving-html
-    get-paste
-    [ "show-paste" render-component ] with-html-stream ;
-
-\ show-paste { { "n" v-number } } define-action
-
-: new-paste ( -- )
-    serving-html
-    [ "new-paste" render-template ] with-html-stream ;
-
-\ new-paste { } define-action
-
-: paste-list ( -- )
-    serving-html
-    [
-        [ show-paste ] "show-paste-quot" set
-        [ new-paste ] "new-paste-quot" set
-        pastebin get "paste-list" render-component
-    ] with-html-stream ;
-
-\ paste-list { } define-action
-
-: paste-link ( paste -- link )
-    paste-n number>string [ show-paste ] curry quot-link ;
-
-: safe-head ( seq n -- seq' )
-    over length min head ;
-
-: paste-feed ( -- entries )
-    pastebin get pastebin-pastes <reversed> 20 safe-head [
-        {
-            paste-summary
-            paste-link
-            paste-date
-        } get-slots timestamp>rfc3339 f swap <entry>
-    ] map ;
-
-: feed.xml ( -- )
-    "text/xml" serving-content
-    "pastebin"
-    "http://pastebin.factorcode.org"
-    paste-feed <feed> feed>xml write-xml ;
-
-\ feed.xml { } define-action
-
-: add-paste ( paste pastebin -- )
-    >r now over set-paste-date r>
-    pastebin-pastes 2dup length swap set-paste-n push ;
-
-: submit-paste ( summary author channel mode contents -- )
-    <paste> [ pastebin get add-paste ] keep
-    paste-link permanent-redirect ;
-
-\ new-paste
-\ submit-paste {
-    { "summary" v-required }
-    { "author" v-required }
-    { "channel" }
-    { "mode" v-required }
-    { "contents" v-required }
-} define-form
-
-\ new-paste {
-    { "channel" "#concatenative" }
-    { "mode" "factor" }
-} default-values
-
-: annotate-paste ( n summary author mode contents -- )
-    <annotation> swap get-paste
-    [ paste-annotations push ] keep
-    paste-link permanent-redirect ;
-
-[ "n" show-paste ]
-\ annotate-paste {
-    { "n" v-required v-number }
-    { "summary" v-required }
-    { "author" v-required }
-    { "mode" v-required }
-    { "contents" v-required }
-} define-form
-
-\ show-paste {
-    { "mode" "factor" }
-} default-values
-
-: style.css ( -- )
-    "text/css" serving-content
-    "style.css" send-resource ;
-
-\ style.css { } define-action
-
-"pastebin" "paste-list" "extra/webapps/pastebin" web-app
diff --git a/unmaintained/webapps/pastebin/show-paste.furnace b/unmaintained/webapps/pastebin/show-paste.furnace
deleted file mode 100755 (executable)
index 30129ed..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<% USING: namespaces io furnace sequences xmode.code2html calendar ; %>
-
-<%
-    "Paste: " "summary" get append "title" set
-    "header" render-template
-%>
-
-<table>
-<tr><th>Paste by:</th><td><% "author" get write %></td></tr>
-<!-- <tr><th>Channel:</th><td><% "channel" get write %></td></tr> -->
-<tr><th>Created:</th><td><% "date" get timestamp>string write %></td></tr>
-<tr><th>File type:</th><td><% "mode" get write %></td></tr>
-</table>
-
-<% "syntax" render-template %>
-
-<% "annotations" get [ "annotation" render-component ] each %>
-
-<% model get "annotate-paste" render-component %>
-
-<% "footer" render-template %>
diff --git a/unmaintained/webapps/pastebin/style.css b/unmaintained/webapps/pastebin/style.css
deleted file mode 100644 (file)
index 4a469f9..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-body {
-       font:75%/1.6em "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif;
-       color:#888;
-}
-
-h1.pastebin-title {
-       font-size:300%;
-}
-
-a {
-       color:#222;
-       border-bottom:1px dotted #ccc;
-       text-decoration:none;
-}
-
-a:hover {
-       border-bottom:1px solid #ccc;
-}
-
-pre.code {
-       border:1px dashed #ccc;
-       background-color:#f5f5f5;
-       padding:5px;
-       font-size:150%;
-       color:#000000;
-}
-
-.navbar {
-       background-color:#eeeeee;
-       padding:5px;
-       border:1px solid #ccc;
-}
-
-.infobox {
-       border: 1px solid #C1DAD7;
-       padding: 10px;
-}
-
-.error {
-       color: red;
-}
diff --git a/unmaintained/webapps/pastebin/syntax.furnace b/unmaintained/webapps/pastebin/syntax.furnace
deleted file mode 100755 (executable)
index 17b64b9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<% USING: xmode.code2html splitting namespaces ; %>
-
-<pre class="code"><% "contents" get string-lines "mode" get htmlize-lines %></pre>
diff --git a/unmaintained/webapps/planet/authors.txt b/unmaintained/webapps/planet/authors.txt
deleted file mode 100755 (executable)
index 1901f27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Slava Pestov
diff --git a/unmaintained/webapps/planet/planet.factor b/unmaintained/webapps/planet/planet.factor
deleted file mode 100755 (executable)
index 9a5f8ee..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-USING: sequences rss arrays concurrency.combinators kernel
-sorting html.elements io assocs namespaces math threads vocabs
-html furnace http.server.templating calendar math.parser
-splitting continuations debugger system http.server.responders
-xml.writer prettyprint logging calendar.format ;
-IN: webapps.planet
-
-: print-posting-summary ( posting -- )
-    <p "news" =class p>
-        <b> dup entry-title write </b> <br/>
-        <a entry-link =href "more" =class a>
-            "Read More..." write
-        </a>
-    </p> ;
-
-: print-posting-summaries ( postings -- )
-    [ print-posting-summary ] each ;
-
-: print-blogroll ( blogroll -- )
-    <ul "description" =class ul>
-        [
-            <li> <a dup third =href a> first write </a> </li>
-        ] each
-    </ul> ;
-
-: format-date ( date -- string )
-    rfc3339>timestamp timestamp>string ;
-
-: print-posting ( posting -- )
-    <h2 "posting-title" =class h2>
-        <a dup entry-link =href a>
-            dup entry-title write-html
-        </a>
-    </h2>
-    <p "posting-body" =class p>
-        dup entry-description write-html
-    </p>
-    <p "posting-date" =class p>
-        entry-pub-date format-date write
-    </p> ;
-
-: print-postings ( postings -- )
-    [ print-posting ] each ;
-
-SYMBOL: default-blogroll
-SYMBOL: cached-postings
-
-: safe-head ( seq n -- seq' )
-    over length min head ;
-
-: mini-planet-factor ( -- )
-    cached-postings get 4 safe-head print-posting-summaries ;
-
-: planet-factor ( -- )
-    serving-html [ "planet" render-template ] with-html-stream ;
-
-\ planet-factor { } define-action
-
-: planet-feed ( -- feed )
-    "[ planet-factor ]"
-    "http://planet.factorcode.org"
-    cached-postings get 30 safe-head <feed> ;
-
-: feed.xml ( -- )
-    "text/xml" serving-content
-    planet-feed feed>xml write-xml ;
-
-\ feed.xml { } define-action
-
-: style.css ( -- )
-    "text/css" serving-content
-    "style.css" send-resource ;
-
-\ style.css { } define-action
-
-SYMBOL: last-update
-
-: <posting> ( author entry -- entry' )
-    clone
-    [ ": " swap entry-title 3append ] keep
-    [ set-entry-title ] keep ;
-
-: fetch-feed ( url -- feed )
-    download-feed feed-entries ;
-
-\ fetch-feed DEBUG add-error-logging
-
-: fetch-blogroll ( blogroll -- entries )
-    dup 0 <column> swap 1 <column>
-    [ fetch-feed ] parallel-map
-    [ [ <posting> ] with map ] 2map concat ;
-
-: sort-entries ( entries -- entries' )
-    [ [ entry-pub-date ] compare ] sort <reversed> ;
-
-: update-cached-postings ( -- )
-    default-blogroll get
-    fetch-blogroll sort-entries
-    cached-postings set-global ;
-
-: update-thread ( -- )
-    millis last-update set-global
-    [ update-cached-postings ] "RSS feed update slave" spawn drop
-    10 60 * 1000 * sleep
-    update-thread ;
-
-: start-update-thread ( -- )
-    [
-        "webapps.planet" [
-            update-thread
-        ] with-logging
-    ] "RSS feed update master" spawn drop ;
-
-"planet" "planet-factor" "extra/webapps/planet" web-app
-
-{
-    { "Berlin Brown" "http://factorlang-fornovices.blogspot.com/feeds/posts/default" "http://factorlang-fornovices.blogspot.com" }
-    { "Chris Double" "http://www.blogger.com/feeds/18561009/posts/full/-/factor" "http://www.bluishcoder.co.nz/" }
-    { "Elie Chaftari" "http://fun-factor.blogspot.com/feeds/posts/default" "http://fun-factor.blogspot.com/" }
-    { "Doug Coleman" "http://code-factor.blogspot.com/feeds/posts/default" "http://code-factor.blogspot.com/" }
-    { "Daniel Ehrenberg" "http://useless-factor.blogspot.com/feeds/posts/default" "http://useless-factor.blogspot.com/" }
-    { "Gavin Harrison" "http://gmh33.blogspot.com/feeds/posts/default" "http://gmh33.blogspot.com/" }
-    { "Kio M. Smallwood"
-    "http://sekenre.wordpress.com/feed/atom/"
-    "http://sekenre.wordpress.com/" }
-    { "Phil Dawes" "http://www.phildawes.net/blog/category/factor/feed/atom" "http://www.phildawes.net/blog/" }
-    { "Samuel Tardieu" "http://www.rfc1149.net/blog/tag/factor/feed/atom/" "http://www.rfc1149.net/blog/tag/factor/" }
-    { "Slava Pestov" "http://factor-language.blogspot.com/atom.xml" "http://factor-language.blogspot.com/" }
-} default-blogroll set-global
diff --git a/unmaintained/webapps/planet/planet.furnace b/unmaintained/webapps/planet/planet.furnace
deleted file mode 100644 (file)
index 4c6676c..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<% USING: namespaces html.elements webapps.planet sequences
-furnace ; %>
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-       <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-
-       <title>planet-factor</title>
-       <link rel="stylesheet" href="style.css" type="text/css" media="screen" title="no title" charset="utf-8" />
-    <link rel="alternate" type="application/atom+xml" title="Planet Factor - Atom" href="feed.xml" />
-</head>
-
-<body id="index">
-    <h1 class="planet-title">[ planet-factor ]</h1>
-    <table width="100%" cellpadding="10">
-        <tr>
-            <td> <% cached-postings get 20 safe-head print-postings %> </td>
-            <td valign="top" width="25%" class="infobox">
-                <p>
-                    <b>planet-factor</b> is an Atom/RSS aggregator that collects the
-                    contents of <a href="http://factorcode.org/">Factor</a>-related blogs. It is inspired by
-                    <a href="http://planet.lisp.org">Planet Lisp</a>.
-                </p>
-                <p>
-                    <img src="http://planet.lisp.org/feed-icon-14x14.png" />
-                    <a href="feed.xml"> Syndicate </a>
-                </p>
-                <p>
-                    This webapp is written in <a href="http://factorcode.org/">Factor</a>.<br/>
-                    <% "webapps.planet" browse-webapp-source %>
-                </p>
-                <h2 class="blogroll-title">Blogroll</h2>
-                <% default-blogroll get print-blogroll %>
-                <p>
-                    If you want your weblog added to the blogroll, <a href="http://factorcode.org/gethelp.fhtml">just ask</a>.
-                </p>
-            </td>
-        </tr>
-    </table>
-</body>
-
-</html>
diff --git a/unmaintained/webapps/planet/style.css b/unmaintained/webapps/planet/style.css
deleted file mode 100644 (file)
index 7a66d8d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-body {
-       font:75%/1.6em "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif;
-       color:#888;
-}
-
-h1.planet-title {
-       font-size:300%;
-}
-
-a {
-       color:#222;
-       border-bottom:1px dotted #ccc;
-       text-decoration:none;
-}
-
-a:hover {
-       border-bottom:1px solid #ccc;
-}
-
-.posting-title {
-       background-color:#f5f5f5;
-}
-
-pre, code {
-       color:#000000;
-       font-size:120%;
-}
-
-.infobox {
-       border-left: 1px solid #C1DAD7;
-}
-
-.posting-date {
-       text-align: right;
-       font-size:90%;
-}
-
-a.more {
-       display:block;
-       padding:0 0 5px 0;
-       color:#333;
-       text-decoration:none;
-       text-align:right;
-       border:none;
-}
diff --git a/unmaintained/wee-url/load.factor b/unmaintained/wee-url/load.factor
deleted file mode 100644 (file)
index 96d2716..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-REQUIRES: apps/http-server libs/store ;
-
-PROVIDE: apps/wee-url
-{ +files+ { "responder.factor" } } ;
diff --git a/unmaintained/wee-url/responder.factor b/unmaintained/wee-url/responder.factor
deleted file mode 100644 (file)
index 4d7b076..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-! Copyright (C) 2006 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: generic assocs help html httpd
-io kernel math namespaces prettyprint sequences store strings ;
-IN: wee-url-responder
-
-SYMBOL: wee-shortcuts
-SYMBOL: wee-store
-
-"wee-url.store" load-store wee-store set-global
-H{ } clone wee-shortcuts wee-store get store-variable
-
-: responder-url "responder-url" get ;
-
-: wee-url ( string -- url )
-    [
-        "http://" %
-        host %
-        responder-url %
-        %
-    ] "" make ;
-
-: letter-bank
-    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" ;
-
-: random-letter letter-bank length random letter-bank nth ;
-
-: random-url ( -- string )
-    6 random 1+ [ drop random-letter ] map >string
-    dup wee-shortcuts get key? [ drop random-url ] when ;
-
-: prepare-wee-url ( url -- url )
-    CHAR: : over member? [ "http://" swap append ] unless ;
-
-: set-symmetric-hash ( obj1 obj2 hash -- )
-    3dup set-at swapd set-at ;
-
-: add-shortcut ( url-long -- url-short )
-    dup wee-shortcuts get at* [
-        nip
-    ] [
-        drop
-        random-url [ wee-shortcuts get set-symmetric-hash ] keep
-        wee-store get save-store
-    ] if ;
-
-: url-prompt ( -- )
-    serving-html
-    "wee-url.com - wee URLs since 2007" [
-        <form "get" =method responder-url =action form>
-            "URL: " write
-            <input "text" =type "url" =name input/>
-            <input "submit" =type "Submit" =value input/>
-        </form>
-    ] simple-html-document ;
-
-: url-submitted ( url-long url-short -- )
-    "URL Submitted" [
-        "URL: " write write nl
-        "wee-url: " write
-        <a dup wee-url =href a> wee-url write </a> nl
-        "Back to " write
-        <a responder-url =href a> "wee-url" write </a> nl
-    ] simple-html-document ;
-
-: url-submit ( url -- )
-    serving-html
-    prepare-wee-url [ add-shortcut ] keep url-submitted ;
-
-: url-error ( -- )
-    serving-html
-    "wee-url error" [
-        "No such link." write
-    ] simple-html-document ;
-
-: wee-url-responder ( url -- )
-    "url" query-param [
-        url-submit drop
-    ] [
-        dup empty? [
-            drop url-prompt
-        ] [
-            wee-shortcuts get at*
-            [ permanent-redirect ] [ drop url-error ] if
-        ] if
-    ] if* ;
-
-[
-    "wee-url" "responder" set
-    [ wee-url-responder ] "get" set
-] make-responder
diff --git a/unmaintained/wee-url/wee-url.factor b/unmaintained/wee-url/wee-url.factor
deleted file mode 100644 (file)
index ead2ee8..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-! Copyright (C) 2007 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: assocs furnace html html.elements http.server
-http.server.responders io kernel math math.ranges
-namespaces random sequences store strings ;
-IN: webapps.wee-url
-
-SYMBOL: shortcuts
-SYMBOL: store
-
-! "wee-url.store" load-store store set-global
-! H{ } clone shortcuts store get store-variable
-
-: set-at-once ( value key assoc -- ? )
-    2dup key? [ 3drop f ] [ set-at t ] if ;
-
-: responder-url "responder/wee-url" ;
-
-: wee-url ( string -- url )
-    [
-        "http://" %
-        host %
-        responder-url %
-        %
-    ] "" make ;
-
-: letter-bank
-    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" ; inline
-
-: random-url ( -- string )
-    1 6 [a,b] random [ drop letter-bank random ] "" map-as
-    dup shortcuts get key? [ drop random-url ] when ;
-
-: add-shortcut ( url-long url-short -- url-short )
-    shortcuts get set-at-once [
-        store get save-store
-    ] [
-        drop
-    ] if ;
-
-: show-submit ( -- )
-    serving-html
-    "wee-url.com - wee URLs since 2007" [
-        <form "get" =method "url-submit" =action form>
-            "URL: " write
-            <input "text" =type "url" =name input/>
-            <input "submit" =type "Submit" =value input/>
-        </form>
-    ] simple-html-document ;
-
-\ show-submit { } define-action
-
-: url-submitted ( url-long url-short -- )
-    "URL Submitted" [
-        "URL: " write write nl
-        "wee-url: " write
-        <a dup wee-url =href a> wee-url write </a> nl
-        "Back to " write
-        <a responder-url =href a> "wee-url" write </a> nl
-    ] simple-html-document ;
-
-: url-submit ( url -- )
-    [ add-shortcut ] keep
-    url-submitted ;
-
-\ url-submit {
-    { "url" }
-} define-action
-
-: url-error ( -- )
-    serving-html
-    "wee-url error" [
-        "No such link." write
-    ] simple-html-document ;
-
-: wee-url-responder ( url -- )
-    "url" query-param [
-        url-submit drop
-    ] [
-        dup empty? [
-            drop show-submit
-        ] [
-            shortcuts get at*
-            [ permanent-redirect ] [ drop url-error ] if
-        ] if
-    ] if* ;
-
-! "wee-url" "wee-url-responder" "extra/webapps/wee-url" web-app
-~