CLIPS - looking for match between random slots in multislot fields - clips

Consider such situation. I have such templates:
(deftemplate MAIN::simplecause
(multislot coraxinfo (type INTEGER) (default undefined))
(multislot changeinfo (type SYMBOL) (default undefined)))
(deftemplate MAIN::finalcause
(multislot coraxinfo (type INTEGER) (default undefined))
(multislot changeinfo (type SYMBOL) (default undefined)))
I know that in coraxinfo slot I will always have not more than 14 values (maybe less, but never more). I also now that in changeinfo multislot I will have not more than 13 values.
I am trying to write a rule which will find all possible matches between any facts I will have.
For instance:
(deffacts start
(simplecause (coraxinfo 1 2 3) (changeinfo a b c))
(simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
(simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
(simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
(simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
(simplecause (coraxinfo 13 88 99) (changeinfo k m))
(simplecause (coraxinfo 666 777 888) (changeinfo abc def))
(simplecause (coraxinfo 666 111 222 888 333 444 555 777 999) (changeinfo abc 1a 2a 3a def 4a)))
I would need to get this (order of values in each multislot doesn't matter):
(finalcause (coraxinfo 2 3) (changeinfo a b))
(finalcause 88 99) (changeinfo k m))
(finalcause 666 777 888) (changeinfo abc def))
For now I have stopped on this function:
(defrule cause_generalization_initial1
?f1 <- (simplecause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7) (changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7))
?f2 <- (simplecause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7) (changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7))
(test (neq ?f1 ?f2))
(not (finalcause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7) (changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7)))
=>
(assert (finalcause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7) (changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7))))
It is a little bit clumsy, but as far as I remember $? means 'zero or more', so even if I will have less fields than I have specified in search patter it should work. I use up to 7 multislots in each of patterns since having 14 or 13 values as a maximum means that in worst case every second value in multislot will match to smth in other fact.
The issue that when I load the facts specified in deffacts CLIPS goes to a kind of infinite loop - it doesn't responds for a long time so I beleive I have made a mistake in my rule. Also this rule should kill the engine in case I will have couple of facts which are almost same with the difference only in one field. In such case it will produce terrible amount of matches between them. Any idea where I was wrong? I will really appreciate any suggestions.
UPDATE. If we are trying to take the approach of constructin (finalcause) facts by adding one value to coraxinfo and changeinfo slots at a time than I have currently stopped on these 2 rules:
Creates initial finalcause fact with one matching value in both multislots:
(defrule cause_generalization_initial
?f1 <- (simplecause (coraxinfo $? ?coraxmatch $?) (changeinfo $? ?changematch $?))
?f2 <- (simplecause (coraxinfo $? ?coraxmatch $?) (changeinfo $? ?changematch $?))
(test (neq ?f1 ?f2))
(not (finalcause (coraxinfo ?coraxmatch) (changeinfo ?changematch)))
=>
(assert (finalcause (coraxinfo ?coraxmatch) (changeinfo ?changematch)))
If we have any finalcause fact we try to check that all the multislot values in it are subset of everything before the ?coraxmatchafter value in both matching simplecause facts and assert an extended finalcause. I beleive this rule should be able to 'jump over the gaps' in matching simplecauses.
(defrule cause_generalization_advanced
?f1 <- (simplecause (coraxinfo $?coraxbefore1 ?coraxmatchafter $?) (changeinfo $?changebefore1 ?changematchafter $?))
?f2 <- (simplecause (coraxinfo $?coraxbefore2 ?coraxmatchafter $?) (changeinfo $?changebefore2 ?changematchafter $?))
(test (neq ?f1 ?f2))
(finalcause (coraxinfo $?finalcoraxbefore) (changeinfo $?finalchangebefore))
(test (and (subsetp $?finalcoraxbefore $?coraxbefore1) (subsetp $?finalcoraxbefore $?coraxbefore2)
(subsetp $?finalchangebefore $?changebefore1) (subsetp $?finalchangebefore $?changebefore2)))
=>
(assert (finalcause (coraxinfo $?finalcoraxbefore ?coraxmatchafter) (changeinfo $?finalchangebefore ?changematchafter))))
I use the rules with these deffacts (notice that deffacts is different from the one above):
(deffacts start
(simplecause (coraxinfo 1 2 3) (changeinfo a b c))
(simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
(simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
(simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
(simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
(simplecause (coraxinfo 13 88 99) (changeinfo k m))
(simplecause (coraxinfo 666 777 888) (changeinfo abc def))
(simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a)))
The issue here is that I expected that it will be able to produce the finalcause for 3 matching fields but it produces only finalcause facts with 2 matching fields and I don't get why. Shouldn't it notice that these 3 facts are falling into the second rule?
(simplecause (coraxinfo 666 777 888) (changeinfo abc def))
(simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a))
(finalcause (coraxinfo 666 888) (changeinfo abc def))
Output of both rules is:
f-0 (initial-fact)
f-1 (simplecause (coraxinfo 1 2 3) (changeinfo a b c))
f-2 (simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
f-3 (simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
f-4 (simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
f-5 (simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
f-6 (simplecause (coraxinfo 13 88 99) (changeinfo k m))
f-7 (simplecause (coraxinfo 666 777 888) (changeinfo abc def))
f-8 (simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a))
f-9 (finalcause (coraxinfo 666) (changeinfo abc))
f-10 (finalcause (coraxinfo 666 888) (changeinfo abc def))
f-11 (finalcause (coraxinfo 666 777) (changeinfo abc def))
f-12 (finalcause (coraxinfo 666) (changeinfo def))
f-13 (finalcause (coraxinfo 777) (changeinfo abc))
f-14 (finalcause (coraxinfo 777 888) (changeinfo abc def))
f-15 (finalcause (coraxinfo 777) (changeinfo def))
f-16 (finalcause (coraxinfo 888) (changeinfo abc))
f-17 (finalcause (coraxinfo 888) (changeinfo def))
f-18 (finalcause (coraxinfo 88) (changeinfo k))
f-19 (finalcause (coraxinfo 88 99) (changeinfo k m))
f-20 (finalcause (coraxinfo 88) (changeinfo m))
f-21 (finalcause (coraxinfo 99) (changeinfo k))
f-22 (finalcause (coraxinfo 99) (changeinfo m))
f-23 (finalcause (coraxinfo 2) (changeinfo a))
f-24 (finalcause (coraxinfo 2 3) (changeinfo a b))
f-25 (finalcause (coraxinfo 2) (changeinfo b))
f-26 (finalcause (coraxinfo 3) (changeinfo a))
f-27 (finalcause (coraxinfo 3) (changeinfo b))

Using 7 multifield variables, you're creating a combinatoric explosion in the number of ways the pattern can be matched. Look at the number of ways in which just the first pattern in your rule can be matched:
CLIPS>
(deftemplate simplecause
(multislot coraxinfo)
(multislot changeinfo))
CLIPS>
(deftemplate finalcause
(multislot coraxinfo)
(multislot changeinfo))
CLIPS>
(defrule cause_generalization_initial1
(simplecause (coraxinfo $?coraxmatch1 $?coraxmatch2 $?coraxmatch3 $?coraxmatch4 $?coraxmatch5 $?coraxmatch6 $?coraxmatch7)
(changeinfo $?pricematch1 $?pricematch2 $?pricematch3 $?pricematch4 $?pricematch5 $?pricematch6 $?pricematch7))
=>)
CLIPS> (assert (simplecause (coraxinfo) (changeinfo)))
<Fact-1>
CLIPS> (agenda)
0 cause_generalization_initial1: f-1
For a total of 1 activation.
CLIPS> (modify 1 (coraxinfo a) (changeinfo 1))
<Fact-2>
CLIPS> (agenda)
0 cause_generalization_initial1: f-2
.
.
.
0 cause_generalization_initial1: f-2
For a total of 49 activations.
CLIPS> (modify 2 (coraxinfo a b) (changeinfo 1 2))
<Fact-3>
CLIPS> (agenda)
0 cause_generalization_initial1: f-3
.
.
.
0 cause_generalization_initial1: f-3
For a total of 784 activations.
CLIPS> (modify 3 (coraxinfo a b c) (changeinfo 1 2 3))
<Fact-4>
CLIPS> (agenda)
0 cause_generalization_initial1: f-4
.
.
.
0 cause_generalization_initial1: f-4
For a total of 7056 activations.
CLIPS> (modify 4 (coraxinfo a b c d) (changeinfo 1 2 3 4))
<Fact-5>
CLIPS> (agenda)
0 cause_generalization_initial1: f-5
.
.
.
0 cause_generalization_initial1: f-5
For a total of 44100 activations.
CLIPS>
If the coraxinfo and changeinfo slots are empty there's only way the pattern can be matched and only one activation. If each slot contains a single value there's 7 different ways that each slot can be matched (a single value in each of the seven variables with the remaining variables empty). Between the two slots that means there's 49 different ways the pattern can be matched.
Once you get to 4 values in each slot, there's 44100 different ways that single pattern can be matched. That means by adding a second pattern there's 44,100 * 44,100 combinations that need to be compared. That's 1,944,810,000 comparisons that need to be made for the assertion of a single fact and you've got 8 facts including one with 9 values in one slot and 6 in the other.
This is not a problem you're going to solve with a single rule. Probably the best approach is to construct the finalcause facts one element at a time using multiple rules. For example, first determine that there are two facts with 666 in them and create a (finalcause (coraxinfo 666) (changeinfo)) fact. Then have a rule which determines that there are two facts both having all the values present in finalcause plus an additional value that is not present and add that value. For example, (finalcause (coraxinfo 666 777) (changeinfo)). You can then have rules that remove the intermediate results.
You'll also want to construct the rules so that you don't generate permutations. For example, you don't want to generate all of these facts which are different but equivalent:
(finalcause (coraxinfo 666 777 888) (changeinfo abc def))
(finalcause (coraxinfo 666 888 777) (changeinfo abc def))
(finalcause (coraxinfo 777 666 888) (changeinfo abc def))
(finalcause (coraxinfo 777 888 666) (changeinfo abc def))
(finalcause (coraxinfo 888 666 777) (changeinfo abc def))
(finalcause (coraxinfo 888 777 666) (changeinfo abc def))
(finalcause (coraxinfo 666 777 888) (changeinfo def abc))
(finalcause (coraxinfo 666 888 777) (changeinfo def abc))
(finalcause (coraxinfo 777 666 888) (changeinfo def abc))
(finalcause (coraxinfo 777 888 666) (changeinfo def abc))
(finalcause (coraxinfo 888 666 777) (changeinfo def abc))
(finalcause (coraxinfo 888 777 666) (changeinfo def abc))
To do this, I'd suggest sorting the values that you place in finalcause slots so there's a unique ordering for the equivalent facts.

With Gary's help, here is the variant which will do this:
(deftemplate MAIN::simplecause
(multislot coraxinfo (type INTEGER) (default 0))
(multislot changeinfo (type SYMBOL) (default undefined)))
(deftemplate MAIN::finalcause
(multislot coraxinfo (type INTEGER) (default 0))
(multislot changeinfo (type SYMBOL) (default undefined)))
(deffacts start
(simplecause (coraxinfo 1 2 3) (changeinfo a b c))
(simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
(simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
(simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
(simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
(simplecause (coraxinfo 13 88 99) (changeinfo k m))
(simplecause (coraxinfo 666 777 888) (changeinfo abc def))
(simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a)))
(defrule cause_generalization_advanced_corax
?f1 <- (simplecause (coraxinfo $?coraxbefore1 ?coraxmatchafter $?) (changeinfo $?changebefore1))
?f2 <- (simplecause (coraxinfo $?coraxbefore2 ?coraxmatchafter $?) (changeinfo $?changebefore2))
(test (neq ?f1 ?f2))
(finalcause (coraxinfo $?finalcoraxbefore) (changeinfo $?finalchangebefore))
(test (and (subsetp $?finalcoraxbefore $?coraxbefore1) (subsetp $?finalcoraxbefore $?coraxbefore2)
(subsetp $?finalchangebefore $?changebefore1) (subsetp $?finalchangebefore $?changebefore2)))
=>
(assert (finalcause (coraxinfo $?finalcoraxbefore ?coraxmatchafter) (changeinfo $?finalchangebefore))))
(defrule cause_generalization_advanced_change
?f1 <- (simplecause (coraxinfo $?coraxbefore1) (changeinfo $?changebefore1 ?changematchafter $?))
?f2 <- (simplecause (coraxinfo $?coraxbefore2) (changeinfo $?changebefore2 ?changematchafter $?))
(test (neq ?f1 ?f2))
(finalcause (coraxinfo $?finalcoraxbefore) (changeinfo $?finalchangebefore))
(test (and (subsetp $?finalcoraxbefore $?coraxbefore1) (subsetp $?finalcoraxbefore $?coraxbefore2)
(subsetp $?finalchangebefore $?changebefore1) (subsetp $?finalchangebefore $?changebefore2)))
=>
(assert (finalcause (coraxinfo $?finalcoraxbefore) (changeinfo $?finalchangebefore ?changematchafter))))
(reset)
(run)
(facts)
f-0 (initial-fact)
f-1 (simplecause (coraxinfo 1 2 3) (changeinfo a b c))
f-2 (simplecause (coraxinfo 7 8 2 3 9) (changeinfo d a b e))
f-3 (simplecause (coraxinfo 2 3 10 13) (changeinfo f g a b z))
f-4 (simplecause (coraxinfo 77 88 99 66) (changeinfo k m l s))
f-5 (simplecause (coraxinfo 88 99 11 22) (changeinfo v k m w))
f-6 (simplecause (coraxinfo 13 88 99) (changeinfo k m))
f-7 (simplecause (coraxinfo 666 777 888) (changeinfo abc def))
f-8 (simplecause (coraxinfo 666 111 222 777 333 444 555 888 999) (changeinfo abc 1a 2a 3a def 4a))
f-9 (finalcause (coraxinfo 666) (changeinfo abc))
f-10 (finalcause (coraxinfo 666 888) (changeinfo abc))
f-11 (finalcause (coraxinfo 666 888) (changeinfo abc def))
f-12 (finalcause (coraxinfo 666 777) (changeinfo abc))
f-13 (finalcause (coraxinfo 666 777 888) (changeinfo abc))
f-14 (finalcause (coraxinfo 666 777 888) (changeinfo abc def))
f-15 (finalcause (coraxinfo 666 777) (changeinfo abc def))
f-16 (finalcause (coraxinfo 666) (changeinfo abc def))
f-17 (finalcause (coraxinfo 666) (changeinfo def))
f-18 (finalcause (coraxinfo 666 888) (changeinfo def))
f-19 (finalcause (coraxinfo 666 777) (changeinfo def))
f-20 (finalcause (coraxinfo 666 777 888) (changeinfo def))
f-21 (finalcause (coraxinfo 777) (changeinfo abc))
f-22 (finalcause (coraxinfo 777 888) (changeinfo abc))
f-23 (finalcause (coraxinfo 777 888) (changeinfo abc def))
f-24 (finalcause (coraxinfo 777) (changeinfo abc def))
f-25 (finalcause (coraxinfo 777) (changeinfo def))
f-26 (finalcause (coraxinfo 777 888) (changeinfo def))
f-27 (finalcause (coraxinfo 888) (changeinfo abc))
f-28 (finalcause (coraxinfo 888) (changeinfo abc def))
f-29 (finalcause (coraxinfo 888) (changeinfo def))
f-30 (finalcause (coraxinfo 88) (changeinfo k))
f-31 (finalcause (coraxinfo 88 99) (changeinfo k))
f-32 (finalcause (coraxinfo 88 99) (changeinfo k m))
f-33 (finalcause (coraxinfo 88) (changeinfo k m))
f-34 (finalcause (coraxinfo 88) (changeinfo m))
f-35 (finalcause (coraxinfo 88 99) (changeinfo m))
f-36 (finalcause (coraxinfo 99) (changeinfo k))
f-37 (finalcause (coraxinfo 99) (changeinfo k m))
f-38 (finalcause (coraxinfo 99) (changeinfo m))
f-39 (finalcause (coraxinfo 2) (changeinfo a))
f-40 (finalcause (coraxinfo 2 3) (changeinfo a))
f-41 (finalcause (coraxinfo 2 3) (changeinfo a b))
f-42 (finalcause (coraxinfo 2) (changeinfo a b))
f-43 (finalcause (coraxinfo 2) (changeinfo b))
f-44 (finalcause (coraxinfo 2 3) (changeinfo b))
f-45 (finalcause (coraxinfo 3) (changeinfo a))
f-46 (finalcause (coraxinfo 3) (changeinfo a b))
f-47 (finalcause (coraxinfo 3) (changeinfo b))

Related

early exiting a recursive procedure

Watching this video (11:56)
It shows a recursive procedure that multiplies the numbers contained in a list
The idea is that if the list contains a zero, the whole stack of recursive calls can be discarded and 0 can be returned
So to save some multiplications
It does so by early exiting the procedure with delimited continuations
I'd like to reproduce this in Guile Scheme and I wrote this code
(define (times numbers)
(define (times-iter numbers)
(match numbers
((a-number rest ...)
(* a-number (times rest)))
('() 1)
((0 rest ...) (shift k 0) )
))
(reset (times-iter numbers))
)
it multiplies correctly but if I pass it a list containing a zero and I trace such call, I get
scheme#(guile-user)> ,trace (times2 '(1 3 0 4))
trace: | (times2 (1 3 0 4))
trace: | | (default-prompt-tag##ice-9/control)
trace: | | (_)
trace: | | ("prompt")
trace: | | (_)
trace: | | | (list? (3 0 4))
trace: | | | #t
trace: | | | (times (3 0 4))
trace: | | | | (list? (0 4))
trace: | | | | #t
trace: | | | | (times (0 4))
trace: | | | | | (list? (4))
trace: | | | | | #t
trace: | | | | | (times (4))
trace: | | | | | | (list? ())
trace: | | | | | | #t
trace: | | | | | | (times ())
trace: | | | | | | 1
trace: | | | | | 4
trace: | | | | 0
trace: | | | 0
trace: | | 0
trace: | (_ #<procedure values _> (0))
trace: | (_ 0)
trace: | 0
scheme#(guile-user)>
It seems to me that the early exit doesn't kick in and the whole stack of multiplications gets applied
What am I doing wrong ?
Based on the comments, it's unclear if you still have a question here. (shift k 0) does indeed clear the current continuation and discards it.
I don't have Guile on this machine but I wrote a simplified times example below with racket using cond -
(require racket/control)
(define/traced (times numbers)
(cond ((null? numbers) 1)
((zero? (car numbers)) (shift k 0)) ;; <- shift
(else (* (car numbers) (times (cdr numbers))))))
#ignisvolens provides define/traced in this Q&A. reset wraps the expression but you could move it to an inner auxiliary function like you did in your code -
(reset ;; <- reset
(times '(1 2 3 4 5 6 7 8 9)))
(times (1 2 3 4 5 6 7 8 9)) ...
(times (2 3 4 5 6 7 8 9)) ...
(times (3 4 5 6 7 8 9)) ...
(times (4 5 6 7 8 9)) ...
(times (5 6 7 8 9)) ...
(times (6 7 8 9)) ...
(times (7 8 9)) ...
(times (8 9)) ...
(times (9)) ...
(times ()) ...
-> (1)
-> (9)
-> (72)
-> (504)
-> (3024)
-> (15120)
-> (60480)
-> (181440)
-> (362880)
-> (362880)
362880
We can see the immediate exit when the 0 is encountered -
(reset (times '(1 2 0 4 5 6 7 8 9)))
(times (1 2 0 4 5 6 7 8 9)) ...
(times (2 0 4 5 6 7 8 9)) ...
(times (0 4 5 6 7 8 9)) ...
0
Notice in the first example, define/traced shows -> ... when times returns a value. In the second example, the entire continuation is discarded and times never fully evaluates.

Emacs + Geiser on Windows - Hangs when running Chicken Scheme in the REPL

After one or two rounds of expressions loaded from the buffer into the REPL with C-c C-b or C-c M-b, Emacs hangs until I press C-g. Sometimes it ends up switching to the REPL, but even when it does the last sexp never gets evaluated.
I can't find a way to debug or find where it's hanging.
This happens on a fresh install with only a few packages. Here is init.el:
;;-------------------------
;; MELPA
;;-------------------------
(require 'package)
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
(not (gnutls-available-p))))
(proto (if no-ssl "http" "https")))
;; Comment/uncomment these two lines to enable/disable MELPA and MELPA Stable as desired
(add-to-list 'package-archives (cons "melpa" (concat proto "://melpa.org/packages/")) t)
;;(add-to-list 'package-archives (cons "melpa-stable" (concat proto "://stable.melpa.org/packages/")) t)
(when (< emacs-major-version 24)
;; For important compatibility libraries like cl-lib
(add-to-list 'package-archives '("gnu" . (concat proto "://elpa.gnu.org/packages/")))))
(package-initialize)
;; LIST PACKAGES
(setq package-list '(helm
;scheme-complete ;;suspect it messes with chicken & geiser
;chicken-scheme ;;suspect it messes with chicken & geiser
paredit
geiser
slime
restart-emacs
use-package
flycheck
;; sublimity
solarized-theme
zenburn-theme))
; list the repositories containing them
(setq package-archives '(("elpa" . "http://tromey.com/elpa/")
("gnu" . "http://elpa.gnu.org/packages/")
("marmalade" . "http://marmalade-repo.org/packages/")
("melpa" . "http://melpa.org/packages/")))
; activate all the packages (in particular autoloads)
(package-initialize)
; fetch the list of packages available
(unless package-archive-contents
(package-refresh-contents))
; install the missing packages
(dolist (package package-list)
(unless (package-installed-p package)
(package-install package)))
;;-------------------------
;; THA LOOKS
;;-------------------------
(load-theme 'zenburn t)
(set-face-attribute 'default t :font "hack")
(set-frame-font "hack" nil t)
;; other fonts "IBM Plex Mono"
(tool-bar-mode -1)
(scroll-bar-mode -1)
;(desktop-save-mode 1) ;;isn't working right with buffers and geiser
;;-------------------------
;; USE PACKAGE
;;-------------------------
(use-package flycheck
:ensure t
:init (global-flycheck-mode))
;;-------------------------
;; HELM
;;-------------------------
(global-set-key (kbd "M-x") 'helm-M-x) ;; bind to M-x
(helm-mode 1) ;; common Emacs command completion
;;-------------------------
;; flycheck
;;-------------------------
(add-hook 'after-init-hook #'global-flycheck-mode)
;;-------------------------
;; SLIME
;;-------------------------
;; Set your lisp system and, optionally, some contribs
;;(setq inferior-lisp-program "/opt/sbcl/bin/sbcl") ;scbl isn't installed
(setq slime-contribs '(slime-fancy))
(require 'slime)
(slime-setup '(slime-fancy slime-banner))
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(package-selected-packages
(quote
(zenburn-theme solarized-theme flycheck use-package restart-emacs slime geiser paredit helm))))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
Here is last buffer (in scheme-mode with chicken selected):
(define (test x) (+ x x))
(define (test2 y x) (* x y x y x y))
Here is the REPL:
CHICKEN
(c) 2008-2017, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.13.0 (rev 68eeaaef)
windows-mingw32-x86-64 [ 64bit manyargs dload ptables ]
compiled 2017-12-11 on yves.more-magic.net (Linux)
; loading C:\chicken/lib/chicken/8/chicken-doc.import.so ...
; loading C:\chicken/lib/chicken/8/chicken.import.so ...
; loading C:\chicken/lib/chicken/8/matchable.import.so ...
; loading C:\chicken/lib/chicken/8/lolevel.import.so ...
; loading C:\chicken/lib/chicken/8/regex.import.so ...
; loading C:\chicken/lib/chicken/8/irregex.import.so ...
; loading C:\chicken/lib/chicken/8/srfi-13.import.so ...
; loading C:\chicken/lib/chicken/8/posix.import.so ...
; loading C:\chicken/lib/chicken/8/data-structures.import.so ...
; loading C:\chicken/lib/chicken/8/srfi-69.import.so ...
; loading C:\chicken/lib/chicken/8/extras.import.so ...
; loading C:\chicken/lib/chicken/8/files.import.so ...
; loading C:\chicken/lib/chicken/8/utils.import.so ...
; loading C:\chicken/lib/chicken/8/srfi-1.import.so ...
; loading C:\chicken/lib/chicken/8/csi.import.so ...
; loading C:\chicken/lib/chicken/8/chicken-doc-text.import.so ...
; loading C:\chicken/lib/chicken/8/fmt.import.so ...
; loading C:\chicken/lib/chicken/8/ports.import.so ...
; loading C:\chicken/lib/chicken/8/foreign.import.so ...
; loading C:\chicken/lib/chicken/8/fmt-unicode.import.so ...
; loading C:\chicken/lib/chicken/8/srfi-4.import.so ...
; loading C:\chicken/lib/chicken/8/utf8-lolevel.import.so ...
; loading C:\chicken/lib/chicken/8/sxml-transforms.import.so ...
; loading C:\chicken/lib/chicken/8/chicken-doc.so ...
; loading C:\chicken/lib/chicken/8/fmt.so ...
; loading C:\chicken/lib/chicken/8/fmt-unicode.so ...
; loading C:\chicken/lib/chicken/8/utf8-lolevel.so ...
; loading C:\chicken/lib/chicken/8/sxml-transforms.so ...
; loading C:\chicken/lib/chicken/8/matchable.so ...
; loading C:\chicken/lib/chicken/8/regex.so ...
; loading C:\chicken/lib/chicken/8/apropos.import.so ...
; loading C:\chicken/lib/chicken/8/memoized-string.import.so ...
; loading C:\chicken/lib/chicken/8/unicode-utils.import.so ...
; loading C:\chicken/lib/chicken/8/type-checks.import.so ...
; loading C:\chicken/lib/chicken/8/type-errors.import.so ...
; loading C:\chicken/lib/chicken/8/symbol-utils.import.so ...
; loading C:\chicken/lib/chicken/8/miscmacros.import.so ...
; loading C:\chicken/lib/chicken/8/apropos.so ...
; loading C:\chicken/lib/chicken/8/memoized-string.so ...
; loading C:\chicken/lib/chicken/8/unicode-utils.so ...
; loading C:\chicken/lib/chicken/8/type-checks.so ...
; loading C:\chicken/lib/chicken/8/type-errors.so ...
; loading C:\chicken/lib/chicken/8/symbol-utils.so ...
; loading library posix ...
; loading C:\chicken/lib/chicken/8/srfi-18.import.so ...
; loading library srfi-18 ...
; loading C:\chicken/lib/chicken/8/tcp.import.so ...
; loading library tcp ...
#;14> (test 234235)
((result "((file-test-lock (\"args\" ((\"required\") (\"optional\" _ ...) (\"key\"))) (\"module\")) (test (\"args\" ((\"required\" x) (\"optional\") (\"key\"))) (\"module\")))") (output . ""))
#;18> 468470
#;19> (test2 9 9)
Error: unbound variable: test2
Call history:
<syntax> (test2 9 9)
<eval> (test2 9 9) <--
#;19>
Here is another example, I ran toggle-debug-on-quit and then hit C-g while it was hanging. I can't make much of the backtrace though. Here it is the buffer and backtrace:
Also, just for kicks I tried running Emacs as an administrator - that made no difference.
buffer:
(define (dog x) (+ x x))
(define (rog y x) (- x y))
(define (cat x y z) (* x y z))
backtrace:
Debugger entered--Lisp error: (quit)
accept-process-output(#<process Chicken REPL> 3.0)
geiser-con--send-string/wait((t (:filter . comint-output-filter) (:tq (("(geiser-eval '#f '(geiser-autodoc '(5235 cat)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 44) (:string . "(geiser-eval '#f '(geiser-autodoc '(5235 cat)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer * Chicken REPL *>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 45) (:string . "(geiser-eval '#f '(geiser-autodoc '(define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 46) (:string . "(geiser-eval '#f '(geiser-autodoc '(define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(ta ta define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 47) (:string . "(geiser-eval '#f '(geiser-autodoc '(ta ta define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(tac tac define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 48) (:string . "(geiser-eval '#f '(geiser-autodoc '(tac tac define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(tac define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 49) (:string . "(geiser-eval '#f '(geiser-autodoc '(tac define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(z tac define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 50) (:string . "(geiser-eval '#f '(geiser-autodoc '(z tac define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 51) (:string . "(geiser-eval '#f '(geiser-autodoc '(define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(/ / define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 52) (:string . "(geiser-eval '#f '(geiser-autodoc '(/ / define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(/ define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 53) (:string . "(geiser-eval '#f '(geiser-autodoc '(/ define)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(begin (define (dog x) (+ x x))\n(define (rog y x) (- x y))\n(define (cat x y z) (* x y z))\n(define (tac y z) (/ x y))))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 54) (:string . "(geiser-eval '#f '(begin (define (dog x) (+ x x))\n(define (rog y x) (- x y))\n(define (cat x y z) (* x y z))\n(define (tac y z) (/ x y))))") (:continuation) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(tac tac)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 55) (:string . "(geiser-eval '#f '(geiser-autodoc '(tac tac)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer * Chicken REPL *>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(tac)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 56) (:string . "(geiser-eval '#f '(geiser-autodoc '(tac)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer * Chicken REPL *>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(8 tac)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 57) (:string . "(geiser-eval '#f '(geiser-autodoc '(8 tac)))") (:continuation . geiser-autodoc--show-signatures) (:buffer . #<buffer * Chicken REPL *>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request) ("(geiser-eval '#f '(begin (define (dog x) (+ x x))\n(define (rog y x) (- x y))\n(define (cat x y z) (* x y z))\n(define (tac y z) (/ x y))))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" ((:id . 58) (:string . "(geiser-eval '#f '(begin (define (dog x) (+ x x))\n(define (rog y x) (- x y))\n(define (cat x y z) (* x y z))\n(define (tac y z) (/ x y))))") (:continuation . geiser-eval--set-sync-retort) (:buffer . #<buffer ck>) (:connection t (:filter . comint-output-filter) #1 (:tq-filter lambda (p s) (geiser-con--tq-filter ... s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...))))) . geiser-con--process-completed-request)) #<process Chicken REPL> . #<buffer tq-temp-Chicken REPL>) (:tq-filter lambda (p s) (geiser-con--tq-filter (quote ((("(geiser-eval '#f '(geiser-autodoc '(5235 cat)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(ta ta define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(tac tac define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(tac define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(z tac define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(/ / define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(/ define)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(begin (define (dog x) (+ x x))\n(define (rog y x) (- x y))\n(define (cat x y z) (* x y z))\n(define (tac y z) (/ x y))))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(tac tac)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(tac)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(geiser-autodoc '(8 tac)))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request) ("(geiser-eval '#f '(begin (define (dog x) (+ x x))\n(define (rog y x) (- x y))\n(define (cat x y z) (* x y z))\n(define (tac y z) (/ x y))))\n" "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)" (... ... ... ... ...) . geiser-con--process-completed-request)) #<process Chicken REPL> . #<buffer tq-temp-Chicken REPL>)) s)) (:eot . "\\(\n#[^;]*;[^:0-9]*:?[0-9]+> \\)") (:prompt . "#[^;]*;[^:0-9]*:?[0-9]+> ") (:debug-prompt) (:is-debugging) (:count . 58) (:completed . #s(hash-table size 65 test eql weakness value rehash-size 1.5 rehash-threshold 0.8 data ( ...)))) "(geiser-eval '#f '(begin (define (dog x) (+ x x))\n(define (rog y x) (- x y))\n(define (cat x y z) (* x y z))\n(define (tac y z) (/ x y))))" geiser-eval--set-sync-retort nil nil)
geiser-eval--send/wait((:eval (:scm "(begin (define (dog x) (+ x x))\n(define (rog y x) (- x y))\n(define (cat x y z) (* x y z))\n(define (tac y z) (/ x y)))")))
geiser-debug--send-region(nil 1 110 geiser--go-to-repl t nil)
geiser-eval-region(1 110 t nil nil)
geiser-eval-buffer(t)
geiser-eval-buffer-and-go()
funcall-interactively(geiser-eval-buffer-and-go)
call-interactively(geiser-eval-buffer-and-go nil nil)
command-execute(geiser-eval-buffer-and-go)

UTF-8 bytes to string

I'm trying to convert a list like '(110 111 101 204 136 108) to a string like "noël".
I tried using (mapcar (lambda (c) (decode-char 'unicode c)) '(110 111 101 204 136 108)), but it resulted in (110 111 101 204 136 108), the same as the input. (Also, I recognize that there's no way to decode a Unicode character from a single byte of UTF-8, so that's definitely the wrong function.)
A few options...
(with-temp-buffer
(set-buffer-multibyte nil)
(apply #'insert '(110 111 101 204 136 108))
(decode-coding-region (point-min) (point-max) 'utf-8 t))
or:
(decode-coding-string
(mapconcat #'byte-to-string '(110 111 101 204 136 108) "")
'utf-8)
or more directly:
(string-as-multibyte
(apply #'unibyte-string '(110 111 101 204 136 108)))

fill in with same value each group in sas

I am trying to fill in ID1 variable with same ID number when rdq=adq for each permco in SAS. Here is an example of my data.
permco rdq adq ID ID1
1 333 331 1 .
1 333 332 2 .
1 333 333 3 3
1 333 334 4 .
1 333 335 5 .
1 333 336 6 .
1 555 552 1 .
1 555 553 2 .
1 555 554 3 .
1 555 555 4 4
1 555 556 5 .
1 555 557 6 .
1 555 558 7 .
2 333 331 1 .
2 333 332 2 .
2 333 333 3 3
2 333 334 4 .
2 333 335 5 .
2 333 336 6 .
2 555 552 1 .
2 555 553 2 .
2 555 554 3 .
2 555 555 4 4
2 555 556 5 .
2 555 557 6 .
2 555 558 7 .
And what I desire to have is...
permco rdq adq ID ID1
1 333 331 1 3
1 333 332 2 3
1 333 333 3 3
1 333 334 4 3
1 333 335 5 3
1 333 336 6 3
1 555 552 1 4
1 555 553 2 4
1 555 554 3 4
1 555 555 4 4
1 555 556 5 4
1 555 557 6 4
1 555 558 7 4
2 333 331 1 3
2 333 332 2 3
2 333 333 3 3
2 333 334 4 3
2 333 335 5 3
2 333 336 6 3
2 555 552 1 4
2 555 553 2 4
2 555 554 3 4
2 555 555 4 4
2 555 556 5 4
2 555 557 6 4
2 555 558 7 4
I would like to fill in ID1 with ID number when rdq=adq.
Double DoW loop solution:
data have01;
infile cards truncover expandtabs;
input permco rdq adq ID ID1 ;
cards;
1 333 331 1 .
1 333 332 2 .
1 333 333 3 3
1 333 334 4 .
1 333 333 5 5
1 333 336 6 .
1 555 552 1 .
1 555 553 2 .
1 555 554 3 .
1 555 555 4 4
1 555 556 5 .
1 555 557 6 .
1 555 558 7 .
2 333 331 1 .
2 333 332 2 .
2 333 333 3 3
2 333 334 4 .
2 333 335 5 .
2 333 336 6 .
2 555 552 1 .
2 555 553 2 .
2 555 554 3 .
2 555 555 4 .
2 555 556 5 .
2 555 557 6 .
2 555 558 7 .
;
run;
data want;
do _n_ = 1 by 1 until (last.rdq);
set have01;
by permco rdq;
if first.rdq then call missing(ID1);
if adq = rdq then t_ID1 = ID1;
drop t_ID1;
end;
do _n_ = 1 to _n_;
set have01;
ID1 = t_ID1;
output;
end;
run;
This assumes that if there are multiple matches, the last one should take precedence. If there are no matches then every row for that group gets a missing value.
If your data is like for a combination of Permco and RDQ you have unique value of ID 1 and you need to fill same value through out for for that combination :
An Alternative can be :
Create a separate data set having only 3 columns : Permco ,RDQ and
ID1 ,remove the rows having blank ID1 .
Merge your input data with this data on Permco and RDQ .
Data intermediate ;
set input_data (keep Permco RDQ ID1);
If ID1=. then delete;
Run;
proc sort data=input_data out=input_data_1(drop ID1);by Permco RDQ;run;
proc sort data=intermediate;by Permco RDQ;run;
data final;
merge input_data_1(in=a) intermediate(in=b);
by Permco RDQ;
if a;
run;
I think loops are unnecessary here. All you need to do is find the value you want in each group and merge it back onto the original dataset:
proc sql;
create table temp as select distinct
permco, rdq, id
from have (where = (rdq = adq));
quit;
proc sql;
create table want as select distinct
a.*, b.id as id_filled
from have as a
left join temp as b
on a.permco = b.permco and a.rdq = b.rdq;
quit;
I assume you want to have the same number within the by-group defined by permco and rdq. The possibility to have two or more matches within one by group is handled with a variable matchespergroup. If no matches are found in one group id1 is a missing value.
data have01;
infile cards truncover expandtabs;
input permco rdq adq ID ID1 ;
cards;
1 333 331 1 .
1 333 332 2 .
1 333 333 3 3
1 333 334 4 .
1 333 333 5 5
1 333 336 6 .
1 555 552 1 .
1 555 553 2 .
1 555 554 3 .
1 555 555 4 4
1 555 556 5 .
1 555 557 6 .
1 555 558 7 .
2 333 331 1 .
2 333 332 2 .
2 333 333 3 3
2 333 334 4 .
2 333 335 5 .
2 333 336 6 .
2 555 552 1 .
2 555 553 2 .
2 555 554 3 .
2 555 555 4 4
2 555 556 5 .
2 555 557 6 .
2 555 558 7 .
run;
data want(drop=rv);
if 0 then set have01;
if _N_=1 then
do;
declare hash hh(dataset:"have01(where=(adq=rdq))",ordered:'A',multidata:'Y');
hh.definekey('permco','rdq');
hh.definedata('id1');
hh.definedone();
end;
do until(theend);
set have01 end=theend;
rv = hh.find();
hh.has_next(result: matchespergroup);
if rv=0 then do; matchespergroup+1; output;end;
else do; id1 = .;output;end;
end;
run;

Get the rows of file from list of values from 2 different files?

I want to get the single file from two different files based on the list of values.
For example:
File 1
ID G1 G2 G3 G4 G5
E1 1 5 0 Inf 1
E2 2 6 4 0 9
E3 4 5 7 8 10
E4 2 8 3 1 1
E5 6 7 8 0 9
E6 12 34 5 6 11
E7 15 7 18 29 34
E8 0 5 23 16 7
E3 3 32 4 18 12
..........
File 2
ID C1 C2
E1 A B
E2 C A
E3 B D
E4 A D
E3 C D
E5 B C
E6 D B
E7 C A
E8 B A
..........
If I have the list of values E1, E5, E7, E3; then
Output should be printed to a file:
ID G1 G2 G3 G4 G5 C1 C2
E1 1 5 0 Inf 1 A B
E5 2 6 4 0 9 B C
E7 4 5 7 8 10 C A
E3 2 8 3 1 1 B D
E3 3 32 4 18 12 C D
How can I extract with bash command:
if the filenames are file1, file2 and file3, then this should work
len=`wc -l file1|awk {'print $1'}`;for i in `seq 1 $len`; do as=`sed -n "$i"p file1`; sd=`sed -n "$i"p file2`; echo "$as $sd" >> file3; done

Resources